summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorreturn42 <markus.heiser@darmarIT.de>2024-05-10 14:06:29 +0000
committerreturn42 <markus.heiser@darmarIT.de>2024-05-10 14:06:29 +0000
commit3a63f64750212b71baf83cd306ba707f7baa3db5 (patch)
tree2805d9b08071510c026f8d81ba3734129c65b939
downloadsearx-gh-pages.tar.gz
searx-gh-pages.zip
[doc] build from commit ffb1001f803359a590bbbaf62da6b1fa1456ed16gh-pages
-rw-r--r--.buildinfo4
-rw-r--r--.nojekyll0
-rw-r--r--404.html102
-rw-r--r--CNAME1
-rw-r--r--_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst1438
-rw-r--r--_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.dot3
-rw-r--r--_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg31
-rw-r--r--_images/SVG-1fb7029fa2cc454a267bae271cccb2c591387416.svg13
-rw-r--r--_images/arch_public.dot30
-rw-r--r--_images/arch_public.svg149
-rw-r--r--_images/ffox-setting-proxy-socks.pngbin0 -> 60796 bytes
-rw-r--r--_images/hello.dot3
-rw-r--r--_images/hello.svg30
-rw-r--r--_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg25
-rw-r--r--_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg25
-rw-r--r--_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg22
-rw-r--r--_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg43
-rw-r--r--_images/svg_image.svg10
-rw-r--r--_images/translation.svg47
-rw-r--r--_modules/index.html166
-rw-r--r--_modules/searx/autocomplete.html376
-rw-r--r--_modules/searx/babel_extract.html161
-rw-r--r--_modules/searx/botdetection/_helpers.html245
-rw-r--r--_modules/searx/botdetection/config.html535
-rw-r--r--_modules/searx/botdetection/ip_lists.html198
-rw-r--r--_modules/searx/botdetection/link_token.html274
-rw-r--r--_modules/searx/enginelib.html255
-rw-r--r--_modules/searx/enginelib/traits.html401
-rw-r--r--_modules/searx/engines.html373
-rw-r--r--_modules/searx/engines/annas_archive.html304
-rw-r--r--_modules/searx/engines/archlinux.html266
-rw-r--r--_modules/searx/engines/bing.html382
-rw-r--r--_modules/searx/engines/bing_images.html227
-rw-r--r--_modules/searx/engines/bing_news.html279
-rw-r--r--_modules/searx/engines/bing_videos.html216
-rw-r--r--_modules/searx/engines/brave.html595
-rw-r--r--_modules/searx/engines/command.html359
-rw-r--r--_modules/searx/engines/dailymotion.html366
-rw-r--r--_modules/searx/engines/demo_offline.html190
-rw-r--r--_modules/searx/engines/demo_online.html219
-rw-r--r--_modules/searx/engines/duckduckgo.html586
-rw-r--r--_modules/searx/engines/duckduckgo_definitions.html375
-rw-r--r--_modules/searx/engines/google.html620
-rw-r--r--_modules/searx/engines/google_images.html247
-rw-r--r--_modules/searx/engines/google_news.html422
-rw-r--r--_modules/searx/engines/google_scholar.html344
-rw-r--r--_modules/searx/engines/google_videos.html255
-rw-r--r--_modules/searx/engines/mrs.html185
-rw-r--r--_modules/searx/engines/mullvad_leta.html296
-rw-r--r--_modules/searx/engines/odysee.html259
-rw-r--r--_modules/searx/engines/peertube.html306
-rw-r--r--_modules/searx/engines/qwant.html468
-rw-r--r--_modules/searx/engines/radio_browser.html290
-rw-r--r--_modules/searx/engines/sepiasearch.html200
-rw-r--r--_modules/searx/engines/sqlite.html215
-rw-r--r--_modules/searx/engines/startpage.html611
-rw-r--r--_modules/searx/engines/tineye.html345
-rw-r--r--_modules/searx/engines/torznab.html372
-rw-r--r--_modules/searx/engines/voidlinux.html205
-rw-r--r--_modules/searx/engines/wikidata.html914
-rw-r--r--_modules/searx/engines/wikipedia.html447
-rw-r--r--_modules/searx/engines/xpath.html428
-rw-r--r--_modules/searx/engines/yahoo.html307
-rw-r--r--_modules/searx/engines/zlibrary.html340
-rw-r--r--_modules/searx/exceptions.html257
-rw-r--r--_modules/searx/infopage.html308
-rw-r--r--_modules/searx/limiter.html363
-rw-r--r--_modules/searx/locales.html598
-rw-r--r--_modules/searx/plugins/unit_converter.html374
-rw-r--r--_modules/searx/redislib.html366
-rw-r--r--_modules/searx/search.html333
-rw-r--r--_modules/searx/search/models.html250
-rw-r--r--_modules/searx/search/processors/abstract.html315
-rw-r--r--_modules/searx/search/processors/offline.html141
-rw-r--r--_modules/searx/search/processors/online.html357
-rw-r--r--_modules/searx/search/processors/online_currency.html191
-rw-r--r--_modules/searx/search/processors/online_dictionary.html178
-rw-r--r--_modules/searx/search/processors/online_url_search.html163
-rw-r--r--_modules/searx/utils.html919
-rw-r--r--_modules/searxng_extra/standalone_searx.html300
-rw-r--r--_modules/searxng_extra/update/update_engine_descriptions.html482
-rw-r--r--_modules/searxng_extra/update/update_engine_traits.html319
-rw-r--r--_modules/searxng_extra/update/update_external_bangs.html254
-rw-r--r--_modules/searxng_extra/update/update_locales.html213
-rw-r--r--_modules/searxng_extra/update/update_pygments.html183
-rw-r--r--_sources/admin/answer-captcha.rst.txt69
-rw-r--r--_sources/admin/api.rst.txt92
-rw-r--r--_sources/admin/architecture.rst.txt38
-rw-r--r--_sources/admin/buildhosts.rst.txt163
-rw-r--r--_sources/admin/index.rst.txt22
-rw-r--r--_sources/admin/installation-apache.rst.txt388
-rw-r--r--_sources/admin/installation-docker.rst.txt197
-rw-r--r--_sources/admin/installation-nginx.rst.txt252
-rw-r--r--_sources/admin/installation-scripts.rst.txt62
-rw-r--r--_sources/admin/installation-searxng.rst.txt132
-rw-r--r--_sources/admin/installation-uwsgi.rst.txt268
-rw-r--r--_sources/admin/installation.rst.txt22
-rw-r--r--_sources/admin/plugins.rst.txt39
-rw-r--r--_sources/admin/searx.limiter.rst.txt17
-rw-r--r--_sources/admin/settings/index.rst.txt25
-rw-r--r--_sources/admin/settings/settings.rst.txt117
-rw-r--r--_sources/admin/settings/settings_brand.rst.txt25
-rw-r--r--_sources/admin/settings/settings_categories_as_tabs.rst.txt31
-rw-r--r--_sources/admin/settings/settings_engine.rst.txt244
-rw-r--r--_sources/admin/settings/settings_general.rst.txt34
-rw-r--r--_sources/admin/settings/settings_outgoing.rst.txt110
-rw-r--r--_sources/admin/settings/settings_redis.rst.txt49
-rw-r--r--_sources/admin/settings/settings_search.rst.txt98
-rw-r--r--_sources/admin/settings/settings_server.rst.txt57
-rw-r--r--_sources/admin/settings/settings_ui.rst.txt70
-rw-r--r--_sources/admin/update-searxng.rst.txt138
-rw-r--r--_sources/dev/contribution_guide.rst.txt190
-rw-r--r--_sources/dev/engines/demo/demo_offline.rst.txt14
-rw-r--r--_sources/dev/engines/demo/demo_online.rst.txt14
-rw-r--r--_sources/dev/engines/engine_overview.rst.txt565
-rw-r--r--_sources/dev/engines/enginelib.rst.txt22
-rw-r--r--_sources/dev/engines/engines.rst.txt9
-rw-r--r--_sources/dev/engines/index.rst.txt107
-rw-r--r--_sources/dev/engines/mediawiki.rst.txt13
-rw-r--r--_sources/dev/engines/offline/command-line-engines.rst.txt23
-rw-r--r--_sources/dev/engines/offline/nosql-engines.rst.txt97
-rw-r--r--_sources/dev/engines/offline/search-indexer-engines.rst.txt62
-rw-r--r--_sources/dev/engines/offline/sql-engines.rst.txt121
-rw-r--r--_sources/dev/engines/offline_concept.rst.txt69
-rw-r--r--_sources/dev/engines/online/annas_archive.rst.txt13
-rw-r--r--_sources/dev/engines/online/archlinux.rst.txt14
-rw-r--r--_sources/dev/engines/online/bing.rst.txt43
-rw-r--r--_sources/dev/engines/online/bpb.rst.txt13
-rw-r--r--_sources/dev/engines/online/brave.rst.txt13
-rw-r--r--_sources/dev/engines/online/bt4g.rst.txt14
-rw-r--r--_sources/dev/engines/online/dailymotion.rst.txt13
-rw-r--r--_sources/dev/engines/online/duckduckgo.rst.txt22
-rw-r--r--_sources/dev/engines/online/google.rst.txt76
-rw-r--r--_sources/dev/engines/online/lemmy.rst.txt13
-rw-r--r--_sources/dev/engines/online/loc.rst.txt13
-rw-r--r--_sources/dev/engines/online/mastodon.rst.txt13
-rw-r--r--_sources/dev/engines/online/moviepilot.rst.txt13
-rw-r--r--_sources/dev/engines/online/mrs.rst.txt13
-rw-r--r--_sources/dev/engines/online/mullvad_leta.rst.txt13
-rw-r--r--_sources/dev/engines/online/mwmbl.rst.txt27
-rw-r--r--_sources/dev/engines/online/odysee.rst.txt13
-rw-r--r--_sources/dev/engines/online/peertube.rst.txt27
-rw-r--r--_sources/dev/engines/online/piped.rst.txt13
-rw-r--r--_sources/dev/engines/online/presearch.rst.txt13
-rw-r--r--_sources/dev/engines/online/qwant.rst.txt13
-rw-r--r--_sources/dev/engines/online/radio_browser.rst.txt13
-rw-r--r--_sources/dev/engines/online/recoll.rst.txt13
-rw-r--r--_sources/dev/engines/online/seekr.rst.txt13
-rw-r--r--_sources/dev/engines/online/startpage.rst.txt13
-rw-r--r--_sources/dev/engines/online/tagesschau.rst.txt13
-rw-r--r--_sources/dev/engines/online/torznab.rst.txt13
-rw-r--r--_sources/dev/engines/online/void.rst.txt13
-rw-r--r--_sources/dev/engines/online/wallhaven.rst.txt13
-rw-r--r--_sources/dev/engines/online/wikipedia.rst.txt27
-rw-r--r--_sources/dev/engines/online/yacy.rst.txt13
-rw-r--r--_sources/dev/engines/online/yahoo.rst.txt13
-rw-r--r--_sources/dev/engines/online/zlibrary.rst.txt13
-rw-r--r--_sources/dev/engines/online_url_search/tineye.rst.txt14
-rw-r--r--_sources/dev/engines/xpath.rst.txt14
-rw-r--r--_sources/dev/index.rst.txt18
-rw-r--r--_sources/dev/lxcdev.rst.txt438
-rw-r--r--_sources/dev/makefile.rst.txt383
-rw-r--r--_sources/dev/plugins.rst.txt106
-rw-r--r--_sources/dev/quickstart.rst.txt82
-rw-r--r--_sources/dev/reST.rst.txt1438
-rw-r--r--_sources/dev/rtm_asdf.rst.txt121
-rw-r--r--_sources/dev/search_api.rst.txt124
-rw-r--r--_sources/dev/searxng_extra/index.rst.txt14
-rw-r--r--_sources/dev/searxng_extra/standalone_searx.py.rst.txt9
-rw-r--r--_sources/dev/searxng_extra/update.rst.txt98
-rw-r--r--_sources/dev/translation.rst.txt81
-rw-r--r--_sources/index.rst.txt54
-rw-r--r--_sources/own-instance.rst.txt86
-rw-r--r--_sources/src/index.rst.txt13
-rw-r--r--_sources/src/searx.babel_extract.rst.txt8
-rw-r--r--_sources/src/searx.botdetection.rst.txt62
-rw-r--r--_sources/src/searx.exceptions.rst.txt8
-rw-r--r--_sources/src/searx.infopage.rst.txt8
-rw-r--r--_sources/src/searx.locales.rst.txt15
-rw-r--r--_sources/src/searx.plugins.tor_check.rst.txt9
-rw-r--r--_sources/src/searx.plugins.unit_converter.rst.txt9
-rw-r--r--_sources/src/searx.redisdb.rst.txt8
-rw-r--r--_sources/src/searx.redislib.rst.txt8
-rw-r--r--_sources/src/searx.search.processors.rst.txt47
-rw-r--r--_sources/src/searx.search.rst.txt38
-rw-r--r--_sources/src/searx.utils.rst.txt8
-rw-r--r--_sources/user/about.rst.txt4
-rw-r--r--_sources/user/configured_engines.rst.txt89
-rw-r--r--_sources/user/index.rst.txt15
-rw-r--r--_sources/user/search-syntax.rst.txt4
-rw-r--r--_sources/utils/index.rst.txt31
-rw-r--r--_sources/utils/lxc.sh.rst.txt295
-rw-r--r--_sources/utils/searxng.sh.rst.txt42
-rw-r--r--_static/basic.css925
-rw-r--r--_static/doctools.js156
-rw-r--r--_static/documentation_options.js13
-rw-r--r--_static/file.pngbin0 -> 286 bytes
-rw-r--r--_static/language_data.js199
-rw-r--r--_static/minus.pngbin0 -> 90 bytes
-rw-r--r--_static/plus.pngbin0 -> 90 bytes
-rw-r--r--_static/pocoo.css525
-rw-r--r--_static/pygments.css84
-rw-r--r--_static/searchtools.js619
-rw-r--r--_static/searxng-wordmark.svg56
-rw-r--r--_static/searxng.css151
-rw-r--r--_static/sphinx_highlight.js154
-rw-r--r--_static/tabs.css89
-rw-r--r--_static/tabs.js145
-rw-r--r--_static/version_warning_offset.js40
-rw-r--r--admin/answer-captcha.html197
-rw-r--r--admin/api.html230
-rw-r--r--admin/architecture.html195
-rw-r--r--admin/buildhosts.html283
-rw-r--r--admin/index.html226
-rw-r--r--admin/installation-apache.html482
-rw-r--r--admin/installation-docker.html331
-rw-r--r--admin/installation-nginx.html360
-rw-r--r--admin/installation-scripts.html195
-rw-r--r--admin/installation-searxng.html613
-rw-r--r--admin/installation-uwsgi.html641
-rw-r--r--admin/installation.html156
-rw-r--r--admin/plugins.html203
-rw-r--r--admin/searx.limiter.html305
-rw-r--r--admin/settings/index.html185
-rw-r--r--admin/settings/settings.html263
-rw-r--r--admin/settings/settings_brand.html174
-rw-r--r--admin/settings/settings_categories_as_tabs.html179
-rw-r--r--admin/settings/settings_engine.html361
-rw-r--r--admin/settings/settings_general.html182
-rw-r--r--admin/settings/settings_outgoing.html247
-rw-r--r--admin/settings/settings_redis.html195
-rw-r--r--admin/settings/settings_search.html246
-rw-r--r--admin/settings/settings_server.html202
-rw-r--r--admin/settings/settings_ui.html208
-rw-r--r--admin/update-searxng.html275
-rw-r--r--dev/contribution_guide.html305
-rw-r--r--dev/engines/demo/demo_offline.html188
-rw-r--r--dev/engines/demo/demo_online.html225
-rw-r--r--dev/engines/engine_overview.html939
-rw-r--r--dev/engines/enginelib.html571
-rw-r--r--dev/engines/engines.html218
-rw-r--r--dev/engines/index.html350
-rw-r--r--dev/engines/mediawiki.html275
-rw-r--r--dev/engines/offline/command-line-engines.html252
-rw-r--r--dev/engines/offline/nosql-engines.html303
-rw-r--r--dev/engines/offline/search-indexer-engines.html292
-rw-r--r--dev/engines/offline/sql-engines.html345
-rw-r--r--dev/engines/offline_concept.html218
-rw-r--r--dev/engines/online/annas_archive.html269
-rw-r--r--dev/engines/online/archlinux.html224
-rw-r--r--dev/engines/online/bing.html343
-rw-r--r--dev/engines/online/bpb.html195
-rw-r--r--dev/engines/online/brave.html341
-rw-r--r--dev/engines/online/bt4g.html246
-rw-r--r--dev/engines/online/dailymotion.html256
-rw-r--r--dev/engines/online/duckduckgo.html335
-rw-r--r--dev/engines/online/google.html465
-rw-r--r--dev/engines/online/lemmy.html242
-rw-r--r--dev/engines/online/loc.html199
-rw-r--r--dev/engines/online/mastodon.html200
-rw-r--r--dev/engines/online/moviepilot.html215
-rw-r--r--dev/engines/online/mrs.html223
-rw-r--r--dev/engines/online/mullvad_leta.html240
-rw-r--r--dev/engines/online/mwmbl.html219
-rw-r--r--dev/engines/online/odysee.html199
-rw-r--r--dev/engines/online/peertube.html242
-rw-r--r--dev/engines/online/piped.html260
-rw-r--r--dev/engines/online/presearch.html260
-rw-r--r--dev/engines/online/qwant.html275
-rw-r--r--dev/engines/online/radio_browser.html225
-rw-r--r--dev/engines/online/recoll.html242
-rw-r--r--dev/engines/online/seekr.html246
-rw-r--r--dev/engines/online/startpage.html339
-rw-r--r--dev/engines/online/tagesschau.html210
-rw-r--r--dev/engines/online/torznab.html264
-rw-r--r--dev/engines/online/void.html217
-rw-r--r--dev/engines/online/wallhaven.html215
-rw-r--r--dev/engines/online/wikipedia.html367
-rw-r--r--dev/engines/online/yacy.html280
-rw-r--r--dev/engines/online/yahoo.html225
-rw-r--r--dev/engines/online/zlibrary.html257
-rw-r--r--dev/engines/online_url_search/tineye.html232
-rw-r--r--dev/engines/xpath.html441
-rw-r--r--dev/index.html217
-rw-r--r--dev/lxcdev.html463
-rw-r--r--dev/makefile.html592
-rw-r--r--dev/plugins.html265
-rw-r--r--dev/quickstart.html201
-rw-r--r--dev/reST.html1748
-rw-r--r--dev/rtm_asdf.html234
-rw-r--r--dev/search_api.html230
-rw-r--r--dev/searxng_extra/index.html168
-rw-r--r--dev/searxng_extra/standalone_searx.py.html238
-rw-r--r--dev/searxng_extra/update.html376
-rw-r--r--dev/translation.html197
-rw-r--r--genindex.html2088
-rw-r--r--index.html224
-rw-r--r--objects.invbin0 -> 10795 bytes
-rw-r--r--own-instance.html205
-rw-r--r--py-modindex.html627
-rw-r--r--search.html123
-rw-r--r--searchindex.js1
-rw-r--r--src/index.html263
-rw-r--r--src/searx.babel_extract.html165
-rw-r--r--src/searx.botdetection.html581
-rw-r--r--src/searx.exceptions.html249
-rw-r--r--src/searx.infopage.html265
-rw-r--r--src/searx.locales.html426
-rw-r--r--src/searx.plugins.tor_check.html185
-rw-r--r--src/searx.plugins.unit_converter.html211
-rw-r--r--src/searx.redisdb.html161
-rw-r--r--src/searx.redislib.html293
-rw-r--r--src/searx.search.html220
-rw-r--r--src/searx.search.processors.html303
-rw-r--r--src/searx.utils.html600
-rw-r--r--user/about.html198
-rw-r--r--user/configured_engines.html3175
-rw-r--r--user/index.html157
-rw-r--r--user/search-syntax.html232
-rw-r--r--utils/index.html158
-rw-r--r--utils/lxc.sh.html520
-rw-r--r--utils/searxng.sh.html195
322 files changed, 73438 insertions, 0 deletions
diff --git a/.buildinfo b/.buildinfo
new file mode 100644
index 000000000..a08fb3908
--- /dev/null
+++ b/.buildinfo
@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
+config: 1f84d86828c99465039ab716107a780e
+tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/.nojekyll
diff --git a/404.html b/404.html
new file mode 100644
index 000000000..1f319f8c1
--- /dev/null
+++ b/404.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Page not found &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="/_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="/_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="/_static/tabs.css?v=a5c4661c" />
+ <script src="/_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="/_static/doctools.js?v=9a2dae69"></script>
+ <script src="/_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="/_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="/genindex.html" />
+ <link rel="search" title="Search" href="/search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="/genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="/py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="/index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Page not found</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Page not found</h1>
+
+Unfortunately we couldn't find the content you were looking for.
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="/index.html">
+ <img class="logo" src="/_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="/index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="/user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="/own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="/admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="/dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="/utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="/src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="/index.html">Overview</a>
+
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="/search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="/_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/CNAME b/CNAME
new file mode 100644
index 000000000..5e170067d
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+docs.searxng.org \ No newline at end of file
diff --git a/_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst b/_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst
new file mode 100644
index 000000000..e539617b7
--- /dev/null
+++ b/_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst
@@ -0,0 +1,1438 @@
+.. _reST primer:
+
+===========
+reST primer
+===========
+
+.. sidebar:: KISS_ and readability_
+
+ Instead of defining more and more roles, we at SearXNG encourage our
+ contributors to follow principles like KISS_ and readability_.
+
+We at SearXNG are using reStructuredText (aka reST_) markup for all kind of
+documentation. With the builders from the Sphinx_ project a HTML output is
+generated and deployed at docs.searxng.org_. For build prerequisites read
+:ref:`docs build`.
+
+.. _docs.searxng.org: https://docs.searxng.org/
+
+The source files of SearXNG's documentation are located at :origin:`docs`.
+Sphinx assumes source files to be encoded in UTF-8 by default. Run :ref:`make
+docs.live <make docs.live>` to build HTML while editing.
+
+.. sidebar:: Further reading
+
+ - Sphinx-Primer_
+ - `Sphinx markup constructs`_
+ - reST_, docutils_, `docutils FAQ`_
+ - Sphinx_, `sphinx-doc FAQ`_
+ - `sphinx config`_, doctree_
+ - `sphinx cross references`_
+ - linuxdoc_
+ - intersphinx_
+ - sphinx-jinja_
+ - `Sphinx's autodoc`_
+ - `Sphinx's Python domain`_, `Sphinx's C domain`_
+ - SVG_, ImageMagick_
+ - DOT_, `Graphviz's dot`_, Graphviz_
+
+
+.. contents::
+ :depth: 3
+ :local:
+ :backlinks: entry
+
+Sphinx_ and reST_ have their place in the python ecosystem. Over that reST is
+used in popular projects, e.g the Linux kernel documentation `[kernel doc]`_.
+
+.. _[kernel doc]: https://www.kernel.org/doc/html/latest/doc-guide/sphinx.html
+
+.. sidebar:: Content matters
+
+ The readability_ of the reST sources has its value, therefore we recommend to
+ make sparse usage of reST markup / .. content matters!
+
+**reST** is a plaintext markup language, its markup is *mostly* intuitive and
+you will not need to learn much to produce well formed articles with. I use the
+word *mostly*: like everything in live, reST has its advantages and
+disadvantages, some markups feel a bit grumpy (especially if you are used to
+other plaintext markups).
+
+Soft skills
+===========
+
+Before going any deeper into the markup let's face on some **soft skills** a
+trained author brings with, to reach a well feedback from readers:
+
+- Documentation is dedicated to an audience and answers questions from the
+ audience point of view.
+- Don't detail things which are general knowledge from the audience point of
+ view.
+- Limit the subject, use cross links for any further reading.
+
+To be more concrete what a *point of view* means. In the (:origin:`docs`)
+folder we have three sections (and the *blog* folder), each dedicate to a
+different group of audience.
+
+User's POV: :origin:`docs/user`
+ A typical user knows about search engines and might have heard about
+ meta crawlers and privacy.
+
+Admin's POV: :origin:`docs/admin`
+ A typical Admin knows about setting up services on a linux system, but he does
+ not know all the pros and cons of a SearXNG setup.
+
+Developer's POV: :origin:`docs/dev`
+ Depending on the readability_ of code, a typical developer is able to read and
+ understand source code. Describe what a item aims to do (e.g. a function).
+ If the chronological order matters, describe it. Name the *out-of-limits
+ conditions* and all the side effects a external developer will not know.
+
+.. _reST inline markup:
+
+Basic inline markup
+===================
+
+.. sidebar:: Inline markup
+
+ - :ref:`reST roles`
+ - :ref:`reST smart ref`
+
+Basic inline markup is done with asterisks and backquotes. If asterisks or
+backquotes appear in running text and could be confused with inline markup
+delimiters, they have to be escaped with a backslash (``\*pointer``).
+
+.. table:: basic inline markup
+ :widths: 4 3 7
+
+ ================================================ ==================== ========================
+ description rendered markup
+ ================================================ ==================== ========================
+ one asterisk for emphasis *italics* ``*italics*``
+ two asterisks for strong emphasis **boldface** ``**boldface**``
+ backquotes for code samples and literals ``foo()`` ````foo()````
+ quote asterisks or backquotes \*foo is a pointer ``\*foo is a pointer``
+ ================================================ ==================== ========================
+
+.. _reST basic structure:
+
+Basic article structure
+=======================
+
+The basic structure of an article makes use of heading adornments to markup
+chapter, sections and subsections.
+
+.. _reST template:
+
+reST template
+-------------
+
+reST template for an simple article:
+
+.. code:: reST
+
+ .. _doc refname:
+
+ ==============
+ Document title
+ ==============
+
+ Lorem ipsum dolor sit amet, consectetur adipisici elit .. Further read
+ :ref:`chapter refname`.
+
+ .. _chapter refname:
+
+ Chapter
+ =======
+
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquid ex ea commodi consequat ...
+
+ .. _section refname:
+
+ Section
+ -------
+
+ lorem ..
+
+ .. _subsection refname:
+
+ Subsection
+ ~~~~~~~~~~
+
+ lorem ..
+
+
+Headings
+--------
+
+#. title - with overline for document title:
+
+ .. code:: reST
+
+ ==============
+ Document title
+ ==============
+
+
+#. chapter - with anchor named ``anchor name``:
+
+ .. code:: reST
+
+ .. _anchor name:
+
+ Chapter
+ =======
+
+#. section
+
+ .. code:: reST
+
+ Section
+ -------
+
+#. subsection
+
+ .. code:: reST
+
+ Subsection
+ ~~~~~~~~~~
+
+
+
+Anchors & Links
+===============
+
+.. _reST anchor:
+
+Anchors
+-------
+
+.. _ref role:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref
+
+To refer a point in the documentation a anchor is needed. The :ref:`reST
+template <reST template>` shows an example where a chapter titled *"Chapters"*
+gets an anchor named ``chapter title``. Another example from *this* document,
+where the anchor named ``reST anchor``:
+
+.. code:: reST
+
+ .. _reST anchor:
+
+ Anchors
+ -------
+
+ To refer a point in the documentation a anchor is needed ...
+
+To refer anchors use the `ref role`_ markup:
+
+.. code:: reST
+
+ Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
+ bar <reST anchor>`.
+
+.. admonition:: ``:ref:`` role
+ :class: rst-example
+
+ Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
+ bar <reST anchor>`.
+
+.. _reST ordinary ref:
+
+Link ordinary URL
+-----------------
+
+If you need to reference external URLs use *named* hyperlinks to maintain
+readability of reST sources. Here is a example taken from *this* article:
+
+.. code:: reST
+
+ .. _Sphinx Field Lists:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
+
+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
+ readable.
+
+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
+ Lists
+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
+
+.. admonition:: Named hyperlink
+ :class: rst-example
+
+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
+ readable.
+
+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
+ Lists
+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
+
+
+.. _reST smart ref:
+
+Smart refs
+----------
+
+With the power of sphinx.ext.extlinks_ and intersphinx_ referencing external
+content becomes smart.
+
+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
+ :widths: 4 3 7
+
+ ========================== ================================== ====================================
+ refer ... rendered example markup
+ ========================== ================================== ====================================
+ :rst:role:`rfc` :rfc:`822` ``:rfc:`822```
+ :rst:role:`pep` :pep:`8` ``:pep:`8```
+ sphinx.ext.extlinks_
+ --------------------------------------------------------------------------------------------------
+ project's wiki article :wiki:`Offline-engines` ``:wiki:`Offline-engines```
+ to docs public URL :docs:`dev/reST.html` ``:docs:`dev/reST.html```
+ files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
+ pull request :pull:`4` ``:pull:`4```
+ patch :patch:`af2cae6` ``:patch:`af2cae6```
+ PyPi package :pypi:`httpx` ``:pypi:`httpx```
+ manual page man :man:`bash` ``:man:`bash```
+ intersphinx_
+ --------------------------------------------------------------------------------------------------
+ external anchor :ref:`python:and` ``:ref:`python:and```
+ external doc anchor :doc:`jinja:templates` ``:doc:`jinja:templates```
+ python code object :py:obj:`datetime.datetime` ``:py:obj:`datetime.datetime```
+ flask code object :py:obj:`flask.Flask` ``:py:obj:`flask.Flask```
+ ========================== ================================== ====================================
+
+
+Intersphinx is configured in :origin:`docs/conf.py`:
+
+.. code:: python
+
+ intersphinx_mapping = {
+ "python": ("https://docs.python.org/3/", None),
+ "flask": ("https://flask.palletsprojects.com/", None),
+ "jinja": ("https://jinja.palletsprojects.com/", None),
+ "linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
+ "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
+ }
+
+
+To list all anchors of the inventory (e.g. ``python``) use:
+
+.. code:: sh
+
+ $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
+ ...
+ $ python -m sphinx.ext.intersphinx https://docs.searxng.org/objects.inv
+ ...
+
+Literal blocks
+==============
+
+The simplest form of :duref:`literal-blocks` is a indented block introduced by
+two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
+code` directive. To include literals from external files use
+:rst:dir:`literalinclude` or :ref:`kernel-include <kernel-include-directive>`
+directive (latter one expands environment variables in the path name).
+
+.. _reST literal:
+
+``::``
+------
+
+.. code:: reST
+
+ ::
+
+ Literal block
+
+ Lorem ipsum dolor::
+
+ Literal block
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore ::
+
+ Literal block
+
+.. admonition:: Literal block
+ :class: rst-example
+
+ ::
+
+ Literal block
+
+ Lorem ipsum dolor::
+
+ Literal block
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore ::
+
+ Literal block
+
+
+.. _reST code:
+
+``code-block``
+--------------
+
+.. _pygments: https://pygments.org/languages/
+
+.. sidebar:: Syntax highlighting
+
+ is handled by pygments_.
+
+The :rst:dir:`code-block` directive is a variant of the :dudir:`code` directive
+with additional options. To learn more about code literals visit
+:ref:`sphinx:code-examples`.
+
+.. code-block:: reST
+
+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
+
+ .. code-block:: Python
+ :caption: python code block
+ :name: stats-handle
+
+ @app.route('/stats', methods=['GET'])
+ def stats():
+ """Render engine statistics page."""
+ stats = get_engines_stats()
+ return render(
+ 'stats.html'
+ , stats = stats )
+
+.. code-block:: reST
+
+.. admonition:: Code block
+ :class: rst-example
+
+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
+
+ .. code-block:: Python
+ :caption: python code block
+ :name: stats-handle
+
+ @app.route('/stats', methods=['GET'])
+ def stats():
+ """Render engine statistics page."""
+ stats = get_engines_stats()
+ return render(
+ 'stats.html'
+ , stats = stats )
+
+Unicode substitution
+====================
+
+The :dudir:`unicode directive <unicode-character-codes>` converts Unicode
+character codes (numerical values) to characters. This directive can only be
+used within a substitution definition.
+
+.. code-block:: reST
+
+ .. |copy| unicode:: 0xA9 .. copyright sign
+ .. |(TM)| unicode:: U+2122
+
+ Trademark |(TM)| and copyright |copy| glyphs.
+
+.. admonition:: Unicode
+ :class: rst-example
+
+ .. |copy| unicode:: 0xA9 .. copyright sign
+ .. |(TM)| unicode:: U+2122
+
+ Trademark |(TM)| and copyright |copy| glyphs.
+
+
+.. _reST roles:
+
+Roles
+=====
+
+.. sidebar:: Further reading
+
+ - `Sphinx Roles`_
+ - :doc:`sphinx:usage/restructuredtext/domains`
+
+
+A *custom interpreted text role* (:duref:`ref <roles>`) is an inline piece of
+explicit markup. It signifies that that the enclosed text should be interpreted
+in a specific way.
+
+The general markup is one of:
+
+.. code:: reST
+
+ :rolename:`ref-name`
+ :rolename:`ref text <ref-name>`
+
+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
+ :widths: 4 3 7
+
+ ========================== ================================== ====================================
+ role rendered example markup
+ ========================== ================================== ====================================
+ :rst:role:`guilabel` :guilabel:`&Cancel` ``:guilabel:`&Cancel```
+ :rst:role:`kbd` :kbd:`C-x C-f` ``:kbd:`C-x C-f```
+ :rst:role:`menuselection` :menuselection:`Open --> File` ``:menuselection:`Open --> File```
+ :rst:role:`download` :download:`this file <reST.rst>` ``:download:`this file <reST.rst>```
+ math_ :math:`a^2 + b^2 = c^2` ``:math:`a^2 + b^2 = c^2```
+ :rst:role:`ref` :ref:`svg image example` ``:ref:`svg image example```
+ :rst:role:`command` :command:`ls -la` ``:command:`ls -la```
+ :durole:`emphasis` :emphasis:`italic` ``:emphasis:`italic```
+ :durole:`strong` :strong:`bold` ``:strong:`bold```
+ :durole:`literal` :literal:`foo()` ``:literal:`foo()```
+ :durole:`subscript` H\ :sub:`2`\ O ``H\ :sub:`2`\ O``
+ :durole:`superscript` E = mc\ :sup:`2` ``E = mc\ :sup:`2```
+ :durole:`title-reference` :title:`Time` ``:title:`Time```
+ ========================== ================================== ====================================
+
+Figures & Images
+================
+
+.. sidebar:: Image processing
+
+ With the directives from :ref:`linuxdoc <linuxdoc:kfigure>` the build process
+ is flexible. To get best results in the generated output format, install
+ ImageMagick_ and Graphviz_.
+
+SearXNG's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scalable here means;
+scalable in sense of the build process. Normally in absence of a converter
+tool, the build process will break. From the authors POV it’s annoying to care
+about the build process when handling with images, especially since he has no
+access to the build process. With :ref:`linuxdoc:kfigure` the build process
+continues and scales output quality in dependence of installed image processors.
+
+If you want to add an image, you should use the ``kernel-figure`` (inheritance
+of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`)
+directives. E.g. to insert a figure with a scalable image format use SVG
+(:ref:`svg image example`):
+
+.. code:: reST
+
+ .. _svg image example:
+
+ .. kernel-figure:: svg_image.svg
+ :alt: SVG image example
+
+ Simple SVG image
+
+ To refer the figure, a caption block is needed: :ref:`svg image example`.
+
+.. _svg image example:
+
+.. kernel-figure:: svg_image.svg
+ :alt: SVG image example
+
+ Simple SVG image.
+
+To refer the figure, a caption block is needed: :ref:`svg image example`.
+
+DOT files (aka Graphviz)
+------------------------
+
+With :ref:`linuxdoc:kernel-figure` reST support for **DOT** formatted files is
+given.
+
+- `Graphviz's dot`_
+- DOT_
+- Graphviz_
+
+A simple example is shown in :ref:`dot file example`:
+
+.. code:: reST
+
+ .. _dot file example:
+
+ .. kernel-figure:: hello.dot
+ :alt: hello world
+
+ DOT's hello world example
+
+.. admonition:: hello.dot
+ :class: rst-example
+
+ .. _dot file example:
+
+ .. kernel-figure:: hello.dot
+ :alt: hello world
+
+ DOT's hello world example
+
+``kernel-render`` DOT
+---------------------
+
+Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
+:ref:`linuxdoc:kernel-render` directive. A simple example of embedded DOT_ is
+shown in figure :ref:`dot render example`:
+
+.. code:: reST
+
+ .. _dot render example:
+
+ .. kernel-render:: DOT
+ :alt: digraph
+ :caption: Embedded DOT (Graphviz) code
+
+ digraph foo {
+ "bar" -> "baz";
+ }
+
+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
+ render example`.
+
+Please note :ref:`build tools <linuxdoc:kfigure_build_tools>`. If Graphviz_ is
+installed, you will see an vector image. If not, the raw markup is inserted as
+*literal-block*.
+
+.. admonition:: kernel-render DOT
+ :class: rst-example
+
+ .. _dot render example:
+
+ .. kernel-render:: DOT
+ :alt: digraph
+ :caption: Embedded DOT (Graphviz) code
+
+ digraph foo {
+ "bar" -> "baz";
+ }
+
+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
+ render example`.
+
+``kernel-render`` SVG
+---------------------
+
+A simple example of embedded SVG_ is shown in figure :ref:`svg render example`:
+
+.. code:: reST
+
+ .. _svg render example:
+
+ .. kernel-render:: SVG
+ :caption: Embedded **SVG** markup
+ :alt: so-nw-arrow
+..
+
+ .. code:: xml
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ baseProfile="full" width="70px" height="40px"
+ viewBox="0 0 700 400"
+ >
+ <line x1="180" y1="370"
+ x2="500" y2="50"
+ stroke="black" stroke-width="15px"
+ />
+ <polygon points="585 0 525 25 585 50"
+ transform="rotate(135 525 25)"
+ />
+ </svg>
+
+.. admonition:: kernel-render SVG
+ :class: rst-example
+
+ .. _svg render example:
+
+ .. kernel-render:: SVG
+ :caption: Embedded **SVG** markup
+ :alt: so-nw-arrow
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ baseProfile="full" width="70px" height="40px"
+ viewBox="0 0 700 400"
+ >
+ <line x1="180" y1="370"
+ x2="500" y2="50"
+ stroke="black" stroke-width="15px"
+ />
+ <polygon points="585 0 525 25 585 50"
+ transform="rotate(135 525 25)"
+ />
+ </svg>
+
+
+
+
+.. _reST lists:
+
+List markups
+============
+
+Bullet list
+-----------
+
+List markup (:duref:`ref <bullet-lists>`) is simple:
+
+.. code:: reST
+
+ - This is a bulleted list.
+
+ 1. Nested lists are possible, but be aware that they must be separated from
+ the parent list items by blank line
+ 2. Second item of nested list
+
+ - It has two items, the second
+ item uses two lines.
+
+ #. This is a numbered list.
+ #. It has two items too.
+
+.. admonition:: bullet list
+ :class: rst-example
+
+ - This is a bulleted list.
+
+ 1. Nested lists are possible, but be aware that they must be separated from
+ the parent list items by blank line
+ 2. Second item of nested list
+
+ - It has two items, the second
+ item uses two lines.
+
+ #. This is a numbered list.
+ #. It has two items too.
+
+
+Horizontal list
+---------------
+
+The :rst:dir:`.. hlist:: <hlist>` transforms a bullet list into a more compact
+list.
+
+.. code:: reST
+
+ .. hlist::
+
+ - first list item
+ - second list item
+ - third list item
+ ...
+
+.. admonition:: hlist
+ :class: rst-example
+
+ .. hlist::
+
+ - first list item
+ - second list item
+ - third list item
+ - next list item
+ - next list item xxxx
+ - next list item yyyy
+ - next list item zzzz
+
+
+Definition list
+---------------
+
+.. sidebar:: Note ..
+
+ - the term cannot have more than one line of text
+
+ - there is **no blank line between term and definition block** // this
+ distinguishes definition lists (:duref:`ref <definition-lists>`) from block
+ quotes (:duref:`ref <block-quotes>`).
+
+Each definition list (:duref:`ref <definition-lists>`) item contains a term,
+optional classifiers and a definition. A term is a simple one-line word or
+phrase. Optional classifiers may follow the term on the same line, each after
+an inline ' : ' (**space, colon, space**). A definition is a block indented
+relative to the term, and may contain multiple paragraphs and other body
+elements. There may be no blank line between a term line and a definition block
+(*this distinguishes definition lists from block quotes*). Blank lines are
+required before the first and after the last definition list item, but are
+optional in-between.
+
+Definition lists are created as follows:
+
+.. code:: reST
+
+ term 1 (up to a line of text)
+ Definition 1.
+
+ See the typo : this line is not a term!
+
+ And this is not term's definition. **There is a blank line** in between
+ the line above and this paragraph. That's why this paragraph is taken as
+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
+
+ term 2
+ Definition 2, paragraph 1.
+
+ Definition 2, paragraph 2.
+
+ term 3 : classifier
+ Definition 3.
+
+ term 4 : classifier one : classifier two
+ Definition 4.
+
+.. admonition:: definition list
+ :class: rst-example
+
+ term 1 (up to a line of text)
+ Definition 1.
+
+ See the typo : this line is not a term!
+
+ And this is not term's definition. **There is a blank line** in between
+ the line above and this paragraph. That's why this paragraph is taken as
+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
+
+
+ term 2
+ Definition 2, paragraph 1.
+
+ Definition 2, paragraph 2.
+
+ term 3 : classifier
+ Definition 3.
+
+ term 4 : classifier one : classifier two
+
+
+Quoted paragraphs
+-----------------
+
+Quoted paragraphs (:duref:`ref <block-quotes>`) are created by just indenting
+them more than the surrounding paragraphs. Line blocks (:duref:`ref
+<line-blocks>`) are a way of preserving line breaks:
+
+.. code:: reST
+
+ normal paragraph ...
+ lorem ipsum.
+
+ Quoted paragraph ...
+ lorem ipsum.
+
+ | These lines are
+ | broken exactly like in
+ | the source file.
+
+
+.. admonition:: Quoted paragraph and line block
+ :class: rst-example
+
+ normal paragraph ...
+ lorem ipsum.
+
+ Quoted paragraph ...
+ lorem ipsum.
+
+ | These lines are
+ | broken exactly like in
+ | the source file.
+
+
+.. _reST field list:
+
+Field Lists
+-----------
+
+.. _Sphinx Field Lists:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
+
+.. sidebar:: bibliographic fields
+
+ First lines fields are bibliographic fields, see `Sphinx Field Lists`_.
+
+Field lists are used as part of an extension syntax, such as options for
+directives, or database-like records meant for further processing. Field lists
+are mappings from field names to field bodies. They marked up like this:
+
+.. code:: reST
+
+ :fieldname: Field content
+ :foo: first paragraph in field foo
+
+ second paragraph in field foo
+
+ :bar: Field content
+
+.. admonition:: Field List
+ :class: rst-example
+
+ :fieldname: Field content
+ :foo: first paragraph in field foo
+
+ second paragraph in field foo
+
+ :bar: Field content
+
+
+They are commonly used in Python documentation:
+
+.. code:: python
+
+ def my_function(my_arg, my_other_arg):
+ """A function just for me.
+
+ :param my_arg: The first of my arguments.
+ :param my_other_arg: The second of my arguments.
+
+ :returns: A message (just for me, of course).
+ """
+
+Further list blocks
+-------------------
+
+- field lists (:duref:`ref <field-lists>`, with caveats noted in
+ :ref:`reST field list`)
+- option lists (:duref:`ref <option-lists>`)
+- quoted literal blocks (:duref:`ref <quoted-literal-blocks>`)
+- doctest blocks (:duref:`ref <doctest-blocks>`)
+
+
+Admonitions
+===========
+
+Sidebar
+-------
+
+Sidebar is an eye catcher, often used for admonitions pointing further stuff or
+site effects. Here is the source of the sidebar :ref:`on top of this page <reST
+primer>`.
+
+.. code:: reST
+
+ .. sidebar:: KISS_ and readability_
+
+ Instead of defining more and more roles, we at SearXNG encourage our
+ contributors to follow principles like KISS_ and readability_.
+
+Generic admonition
+------------------
+
+The generic :dudir:`admonition <admonitions>` needs a title:
+
+.. code:: reST
+
+ .. admonition:: generic admonition title
+
+ lorem ipsum ..
+
+
+.. admonition:: generic admonition title
+
+ lorem ipsum ..
+
+
+Specific admonitions
+--------------------
+
+Specific admonitions: :dudir:`hint`, :dudir:`note`, :dudir:`tip` :dudir:`attention`,
+:dudir:`caution`, :dudir:`danger`, :dudir:`error`, , :dudir:`important`, and
+:dudir:`warning` .
+
+.. code:: reST
+
+ .. hint::
+
+ lorem ipsum ..
+
+ .. note::
+
+ lorem ipsum ..
+
+ .. warning::
+
+ lorem ipsum ..
+
+
+.. hint::
+
+ lorem ipsum ..
+
+.. note::
+
+ lorem ipsum ..
+
+.. tip::
+
+ lorem ipsum ..
+
+.. attention::
+
+ lorem ipsum ..
+
+.. caution::
+
+ lorem ipsum ..
+
+.. danger::
+
+ lorem ipsum ..
+
+.. important::
+
+ lorem ipsum ..
+
+.. error::
+
+ lorem ipsum ..
+
+.. warning::
+
+ lorem ipsum ..
+
+
+Tables
+======
+
+.. sidebar:: Nested tables
+
+ Nested tables are ugly! Not all builder support nested tables, don't use
+ them!
+
+ASCII-art tables like :ref:`reST simple table` and :ref:`reST grid table` might
+be comfortable for readers of the text-files, but they have huge disadvantages
+in the creation and modifying. First, they are hard to edit. Think about
+adding a row or a column to a ASCII-art table or adding a paragraph in a cell,
+it is a nightmare on big tables.
+
+
+.. sidebar:: List tables
+
+ For meaningful patch and diff use :ref:`reST flat table`.
+
+Second the diff of modifying ASCII-art tables is not meaningful, e.g. widening a
+cell generates a diff in which also changes are included, which are only
+ascribable to the ASCII-art. Anyway, if you prefer ASCII-art for any reason,
+here are some helpers:
+
+* `Emacs Table Mode`_
+* `Online Tables Generator`_
+
+.. _reST simple table:
+
+Simple tables
+-------------
+
+:duref:`Simple tables <simple-tables>` allow *colspan* but not *rowspan*. If
+your table need some metadata (e.g. a title) you need to add the ``.. table::
+directive`` :dudir:`(ref) <table>` in front and place the table in its body:
+
+.. code:: reST
+
+ .. table:: foo gate truth table
+ :widths: grid
+ :align: left
+
+ ====== ====== ======
+ Inputs Output
+ ------------- ------
+ A B A or B
+ ====== ====== ======
+ False
+ --------------------
+ True
+ --------------------
+ True False True
+ (foo)
+ ------ ------ ------
+ False True
+ (foo)
+ ====== =============
+
+.. admonition:: Simple ASCII table
+ :class: rst-example
+
+ .. table:: foo gate truth table
+ :widths: grid
+ :align: left
+
+ ====== ====== ======
+ Inputs Output
+ ------------- ------
+ A B A or B
+ ====== ====== ======
+ False
+ --------------------
+ True
+ --------------------
+ True False True
+ (foo)
+ ------ ------ ------
+ False True
+ (foo)
+ ====== =============
+
+
+
+.. _reST grid table:
+
+Grid tables
+-----------
+
+:duref:`Grid tables <grid-tables>` allow colspan *colspan* and *rowspan*:
+
+.. code:: reST
+
+ .. table:: grid table example
+ :widths: 1 1 5
+
+ +------------+------------+-----------+
+ | Header 1 | Header 2 | Header 3 |
+ +============+============+===========+
+ | body row 1 | column 2 | column 3 |
+ +------------+------------+-----------+
+ | body row 2 | Cells may span columns.|
+ +------------+------------+-----------+
+ | body row 3 | Cells may | - Cells |
+ +------------+ span rows. | - contain |
+ | body row 4 | | - blocks. |
+ +------------+------------+-----------+
+
+.. admonition:: ASCII grid table
+ :class: rst-example
+
+ .. table:: grid table example
+ :widths: 1 1 5
+
+ +------------+------------+-----------+
+ | Header 1 | Header 2 | Header 3 |
+ +============+============+===========+
+ | body row 1 | column 2 | column 3 |
+ +------------+------------+-----------+
+ | body row 2 | Cells may span columns.|
+ +------------+------------+-----------+
+ | body row 3 | Cells may | - Cells |
+ +------------+ span rows. | - contain |
+ | body row 4 | | - blocks. |
+ +------------+------------+-----------+
+
+
+.. _reST flat table:
+
+flat-table
+----------
+
+The ``flat-table`` is a further developed variant of the :ref:`list tables
+<linuxdoc:list-table-directives>`. It is a double-stage list similar to the
+:dudir:`list-table` with some additional features:
+
+column-span: ``cspan``
+ with the role ``cspan`` a cell can be extended through additional columns
+
+row-span: ``rspan``
+ with the role ``rspan`` a cell can be extended through additional rows
+
+auto-span:
+ spans rightmost cell of a table row over the missing cells on the right side
+ of that table-row. With Option ``:fill-cells:`` this behavior can changed
+ from *auto span* to *auto fill*, which automatically inserts (empty) cells
+ instead of spanning the last cell.
+
+options:
+ :header-rows: [int] count of header rows
+ :stub-columns: [int] count of stub columns
+ :widths: [[int] [int] ... ] widths of columns
+ :fill-cells: instead of auto-span missing cells, insert missing cells
+
+roles:
+ :cspan: [int] additional columns (*morecols*)
+ :rspan: [int] additional rows (*morerows*)
+
+The example below shows how to use this markup. The first level of the staged
+list is the *table-row*. In the *table-row* there is only one markup allowed,
+the list of the cells in this *table-row*. Exception are *comments* ( ``..`` )
+and *targets* (e.g. a ref to :ref:`row 2 of table's body <row body 2>`).
+
+.. code:: reST
+
+ .. flat-table:: ``flat-table`` example
+ :header-rows: 2
+ :stub-columns: 1
+ :widths: 1 1 1 1 2
+
+ * - :rspan:`1` head / stub
+ - :cspan:`3` head 1.1-4
+
+ * - head 2.1
+ - head 2.2
+ - head 2.3
+ - head 2.4
+
+ * .. row body 1 / this is a comment
+
+ - row 1
+ - :rspan:`2` cell 1-3.1
+ - cell 1.2
+ - cell 1.3
+ - cell 1.4
+
+ * .. Comments and targets are allowed on *table-row* stage.
+ .. _`row body 2`:
+
+ - row 2
+ - cell 2.2
+ - :rspan:`1` :cspan:`1`
+ cell 2.3 with a span over
+
+ * col 3-4 &
+ * row 2-3
+
+ * - row 3
+ - cell 3.2
+
+ * - row 4
+ - cell 4.1
+ - cell 4.2
+ - cell 4.3
+ - cell 4.4
+
+ * - row 5
+ - cell 5.1 with automatic span to right end
+
+ * - row 6
+ - cell 6.1
+ - ..
+
+
+.. admonition:: List table
+ :class: rst-example
+
+ .. flat-table:: ``flat-table`` example
+ :header-rows: 2
+ :stub-columns: 1
+ :widths: 1 1 1 1 2
+
+ * - :rspan:`1` head / stub
+ - :cspan:`3` head 1.1-4
+
+ * - head 2.1
+ - head 2.2
+ - head 2.3
+ - head 2.4
+
+ * .. row body 1 / this is a comment
+
+ - row 1
+ - :rspan:`2` cell 1-3.1
+ - cell 1.2
+ - cell 1.3
+ - cell 1.4
+
+ * .. Comments and targets are allowed on *table-row* stage.
+ .. _`row body 2`:
+
+ - row 2
+ - cell 2.2
+ - :rspan:`1` :cspan:`1`
+ cell 2.3 with a span over
+
+ * col 3-4 &
+ * row 2-3
+
+ * - row 3
+ - cell 3.2
+
+ * - row 4
+ - cell 4.1
+ - cell 4.2
+ - cell 4.3
+ - cell 4.4
+
+ * - row 5
+ - cell 5.1 with automatic span to right end
+
+ * - row 6
+ - cell 6.1
+ - ..
+
+
+CSV table
+---------
+
+CSV table might be the choice if you want to include CSV-data from a outstanding
+(build) process into your documentation.
+
+.. code:: reST
+
+ .. csv-table:: CSV table example
+ :header: .. , Column 1, Column 2
+ :widths: 2 5 5
+ :stub-columns: 1
+ :file: csv_table.txt
+
+Content of file ``csv_table.txt``:
+
+.. literalinclude:: csv_table.txt
+
+.. admonition:: CSV table
+ :class: rst-example
+
+ .. csv-table:: CSV table example
+ :header: .. , Column 1, Column 2
+ :widths: 3 5 5
+ :stub-columns: 1
+ :file: csv_table.txt
+
+Templating
+==========
+
+.. sidebar:: Build environment
+
+ All *generic-doc* tasks are running in the :ref:`make install`.
+
+Templating is suitable for documentation which is created generic at the build
+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
+install` (with SearXNG modules installed). We use this e.g. to build chapter:
+:ref:`configured engines`. Below the jinja directive from the
+:origin:`docs/admin/engines.rst` is shown:
+
+.. literalinclude:: ../user/configured_engines.rst
+ :language: reST
+ :start-after: .. _configured engines:
+
+The context for the template is selected in the line ``.. jinja:: searx``. In
+sphinx's build configuration (:origin:`docs/conf.py`) the ``searx`` context
+contains the ``engines`` and ``plugins``.
+
+.. code:: py
+
+ import searx.search
+ import searx.engines
+ import searx.plugins
+ searx.search.initialize()
+ jinja_contexts = {
+ 'searx': {
+ 'engines': searx.engines.engines,
+ 'plugins': searx.plugins.plugins
+ },
+ }
+
+
+Tabbed views
+============
+
+.. _sphinx-tabs: https://github.com/djungelorm/sphinx-tabs
+.. _basic-tabs: https://github.com/djungelorm/sphinx-tabs#basic-tabs
+.. _group-tabs: https://github.com/djungelorm/sphinx-tabs#group-tabs
+.. _code-tabs: https://github.com/djungelorm/sphinx-tabs#code-tabs
+
+With `sphinx-tabs`_ extension we have *tabbed views*. To provide installation
+instructions with one tab per distribution we use the `group-tabs`_ directive,
+others are basic-tabs_ and code-tabs_. Below a *group-tab* example from
+:ref:`docs build` is shown:
+
+.. literalinclude:: ../admin/buildhosts.rst
+ :language: reST
+ :start-after: .. SNIP sh lint requirements
+ :end-before: .. SNAP sh lint requirements
+
+.. _math:
+
+Math equations
+==============
+
+.. _Mathematics: https://en.wikibooks.org/wiki/LaTeX/Mathematics
+.. _amsmath user guide:
+ http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/macros/latex/required/amsmath/amsldoc.pdf
+
+.. sidebar:: About LaTeX
+
+ - `amsmath user guide`_
+ - Mathematics_
+ - :ref:`docs build`
+
+The input language for mathematics is LaTeX markup using the :ctan:`amsmath`
+package.
+
+To embed LaTeX markup in reST documents, use role :rst:role:`:math: <math>` for
+inline and directive :rst:dir:`.. math:: <math>` for block markup.
+
+.. code:: reST
+
+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
+ is shown.
+
+ .. math::
+ :label: schroedinger general
+
+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle.
+
+.. admonition:: LaTeX math equation
+ :class: rst-example
+
+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
+ is shown.
+
+ .. math::
+ :label: schroedinger general
+
+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle.
+
+
+The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
+(*displaystyle*) used in a inline markup or another fraction.
+
+.. code:: reST
+
+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
+ ``\dfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
+
+.. admonition:: Line spacing
+ :class: rst-example
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+ voluptua. ...
+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+ voluptua. ...
+ ``\tfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
+
+
+.. _KISS: https://en.wikipedia.org/wiki/KISS_principle
+
+.. _readability: https://docs.python-guide.org/writing/style/
+.. _Sphinx-Primer:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
+.. _reST: https://docutils.sourceforge.io/rst.html
+.. _Sphinx Roles:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
+.. _Sphinx: https://www.sphinx-doc.org
+.. _`sphinx-doc FAQ`: https://www.sphinx-doc.org/en/stable/faq.html
+.. _Sphinx markup constructs:
+ https://www.sphinx-doc.org/en/stable/markup/index.html
+.. _`sphinx cross references`:
+ https://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
+.. _sphinx.ext.extlinks:
+ https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
+.. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
+.. _sphinx config: https://www.sphinx-doc.org/en/stable/config.html
+.. _Sphinx's autodoc: https://www.sphinx-doc.org/en/stable/ext/autodoc.html
+.. _Sphinx's Python domain:
+ https://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
+.. _Sphinx's C domain:
+ https://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
+.. _doctree:
+ https://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
+.. _docutils: http://docutils.sourceforge.net/docs/index.html
+.. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
+.. _linuxdoc: https://return42.github.io/linuxdoc
+.. _jinja: https://jinja.palletsprojects.com/
+.. _sphinx-jinja: https://github.com/tardyp/sphinx-jinja
+.. _SVG: https://www.w3.org/TR/SVG11/expanded-toc.html
+.. _DOT: https://graphviz.gitlab.io/_pages/doc/info/lang.html
+.. _`Graphviz's dot`: https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf
+.. _Graphviz: https://graphviz.gitlab.io
+.. _ImageMagick: https://www.imagemagick.org
+
+.. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
+.. _`Online Tables Generator`: https://www.tablesgenerator.com/text_tables
+.. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
diff --git a/_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.dot b/_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.dot
new file mode 100644
index 000000000..eaec9f36b
--- /dev/null
+++ b/_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.dot
@@ -0,0 +1,3 @@
+digraph foo {
+ "bar" -> "baz";
+} \ No newline at end of file
diff --git a/_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg b/_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg
new file mode 100644
index 000000000..a5b367334
--- /dev/null
+++ b/_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.43.0 (0)
+ -->
+<!-- Title: foo Pages: 1 -->
+<svg width="62pt" height="116pt"
+ viewBox="0.00 0.00 62.00 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
+<title>foo</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-112 58,-112 58,4 -4,4"/>
+<!-- bar -->
+<g id="node1" class="node">
+<title>bar</title>
+<ellipse fill="none" stroke="black" cx="27" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-86.3" font-family="Times,serif" font-size="14.00">bar</text>
+</g>
+<!-- baz -->
+<g id="node2" class="node">
+<title>baz</title>
+<ellipse fill="none" stroke="black" cx="27" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-14.3" font-family="Times,serif" font-size="14.00">baz</text>
+</g>
+<!-- bar&#45;&gt;baz -->
+<g id="edge1" class="edge">
+<title>bar&#45;&gt;baz</title>
+<path fill="none" stroke="black" d="M27,-71.7C27,-63.98 27,-54.71 27,-46.11"/>
+<polygon fill="black" stroke="black" points="30.5,-46.1 27,-36.1 23.5,-46.1 30.5,-46.1"/>
+</g>
+</g>
+</svg>
diff --git a/_images/SVG-1fb7029fa2cc454a267bae271cccb2c591387416.svg b/_images/SVG-1fb7029fa2cc454a267bae271cccb2c591387416.svg
new file mode 100644
index 000000000..783577ecd
--- /dev/null
+++ b/_images/SVG-1fb7029fa2cc454a267bae271cccb2c591387416.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ baseProfile="full" width="70px" height="40px"
+ viewBox="0 0 700 400"
+ >
+ <line x1="180" y1="370"
+ x2="500" y2="50"
+ stroke="black" stroke-width="15px"
+ />
+ <polygon points="585 0 525 25 585 50"
+ transform="rotate(135 525 25)"
+ />
+</svg> \ No newline at end of file
diff --git a/_images/arch_public.dot b/_images/arch_public.dot
new file mode 100644
index 000000000..526fb53da
--- /dev/null
+++ b/_images/arch_public.dot
@@ -0,0 +1,30 @@
+digraph G {
+
+ node [style=filled, shape=box, fillcolor="#ffffcc", fontname=Sans];
+ edge [fontname="Sans"];
+
+ browser [label="browser", shape=tab, fillcolor=aliceblue];
+ rp [label="reverse proxy"];
+ static [label="static files", shape=folder, href="url to configure static files", fillcolor=lightgray];
+ uwsgi [label="uwsgi", shape=parallelogram href="https://docs.searxng.org/utils/searx.sh.html"]
+ redis [label="redis DB", shape=cylinder];
+ searxng1 [label="SearXNG #1", fontcolor=blue3];
+ searxng2 [label="SearXNG #2", fontcolor=blue3];
+ searxng3 [label="SearXNG #3", fontcolor=blue3];
+ searxng4 [label="SearXNG #4", fontcolor=blue3];
+
+ browser -> rp [label="HTTPS"]
+
+ subgraph cluster_searxng {
+ label = "SearXNG instance" fontname=Sans;
+ bgcolor="#fafafa";
+ { rank=same; static rp };
+ rp -> static [label="optional: reverse proxy serves static files", fillcolor=slategray, fontcolor=slategray];
+ rp -> uwsgi [label="http:// (tcp) or unix:// (socket)"];
+ uwsgi -> searxng1 -> redis;
+ uwsgi -> searxng2 -> redis;
+ uwsgi -> searxng3 -> redis;
+ uwsgi -> searxng4 -> redis;
+ }
+
+}
diff --git a/_images/arch_public.svg b/_images/arch_public.svg
new file mode 100644
index 000000000..0a0a79ae2
--- /dev/null
+++ b/_images/arch_public.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.43.0 (0)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="543pt" height="401pt"
+ viewBox="0.00 0.00 543.00 401.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 397)">
+<title>G</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-397 539,-397 539,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>cluster_searxng</title>
+<polygon fill="#fafafa" stroke="black" points="8,-8 8,-316 527,-316 527,-8 8,-8"/>
+<text text-anchor="middle" x="267.5" y="-300.8" font-family="Sans" font-size="14.00">SearXNG instance</text>
+</g>
+<!-- browser -->
+<g id="node1" class="node">
+<title>browser</title>
+<polygon fill="aliceblue" stroke="black" points="108,-393 48,-393 48,-397 36,-397 36,-357 108,-357 108,-393"/>
+<polyline fill="none" stroke="black" points="36,-393 48,-393 "/>
+<text text-anchor="middle" x="72" y="-371.3" font-family="Sans" font-size="14.00">browser</text>
+</g>
+<!-- rp -->
+<g id="node2" class="node">
+<title>rp</title>
+<polygon fill="#ffffcc" stroke="black" points="128,-285 16,-285 16,-249 128,-249 128,-285"/>
+<text text-anchor="middle" x="72" y="-263.3" font-family="Sans" font-size="14.00">reverse proxy</text>
+</g>
+<!-- browser&#45;&gt;rp -->
+<g id="edge1" class="edge">
+<title>browser&#45;&gt;rp</title>
+<path fill="none" stroke="black" d="M72,-356.97C72,-340.38 72,-314.88 72,-295.43"/>
+<polygon fill="black" stroke="black" points="75.5,-295.34 72,-285.34 68.5,-295.34 75.5,-295.34"/>
+<text text-anchor="middle" x="94.5" y="-327.8" font-family="Sans" font-size="14.00">HTTPS</text>
+</g>
+<!-- static -->
+<g id="node3" class="node">
+<title>static</title>
+<g id="a_node3"><a xlink:href="url to configure static files" xlink:title="static files">
+<polygon fill="lightgray" stroke="black" points="518.5,-285 515.5,-289 494.5,-289 491.5,-285 431.5,-285 431.5,-249 518.5,-249 518.5,-285"/>
+<text text-anchor="middle" x="475" y="-263.3" font-family="Sans" font-size="14.00">static files</text>
+</a>
+</g>
+</g>
+<!-- rp&#45;&gt;static -->
+<g id="edge2" class="edge">
+<title>rp&#45;&gt;static</title>
+<path fill="none" stroke="black" d="M128.04,-267C205.6,-267 344.74,-267 421.13,-267"/>
+<polygon fill="slategray" stroke="black" points="421.48,-270.5 431.48,-267 421.48,-263.5 421.48,-270.5"/>
+<text text-anchor="middle" x="279.75" y="-273.8" font-family="Sans" font-size="14.00" fill="slategray">optional: reverse proxy serves static files</text>
+</g>
+<!-- uwsgi -->
+<g id="node4" class="node">
+<title>uwsgi</title>
+<g id="a_node4"><a xlink:href="https://docs.searxng.org/utils/searx.sh.html" xlink:title="uwsgi">
+<polygon fill="#ffffcc" stroke="black" points="244.14,-198 158.02,-198 135.86,-162 221.98,-162 244.14,-198"/>
+<text text-anchor="middle" x="190" y="-176.3" font-family="Sans" font-size="14.00">uwsgi</text>
+</a>
+</g>
+</g>
+<!-- rp&#45;&gt;uwsgi -->
+<g id="edge3" class="edge">
+<title>rp&#45;&gt;uwsgi</title>
+<path fill="none" stroke="black" d="M95.88,-248.8C113.71,-235.95 138.28,-218.26 157.84,-204.17"/>
+<polygon fill="black" stroke="black" points="160.09,-206.86 166.16,-198.18 156,-201.18 160.09,-206.86"/>
+<text text-anchor="middle" x="240.5" y="-219.8" font-family="Sans" font-size="14.00">http:// (tcp) or unix:// (socket)</text>
+</g>
+<!-- searxng1 -->
+<g id="node6" class="node">
+<title>searxng1</title>
+<polygon fill="#ffffcc" stroke="black" points="120,-125 16,-125 16,-89 120,-89 120,-125"/>
+<text text-anchor="middle" x="68" y="-103.3" font-family="Sans" font-size="14.00" fill="#0000cd">SearXNG #1</text>
+</g>
+<!-- uwsgi&#45;&gt;searxng1 -->
+<g id="edge4" class="edge">
+<title>uwsgi&#45;&gt;searxng1</title>
+<path fill="none" stroke="black" d="M160.78,-161.99C144.45,-152.49 123.91,-140.54 106.31,-130.29"/>
+<polygon fill="black" stroke="black" points="107.81,-127.12 97.41,-125.11 104.29,-133.17 107.81,-127.12"/>
+</g>
+<!-- searxng2 -->
+<g id="node7" class="node">
+<title>searxng2</title>
+<polygon fill="#ffffcc" stroke="black" points="242,-125 138,-125 138,-89 242,-89 242,-125"/>
+<text text-anchor="middle" x="190" y="-103.3" font-family="Sans" font-size="14.00" fill="#0000cd">SearXNG #2</text>
+</g>
+<!-- uwsgi&#45;&gt;searxng2 -->
+<g id="edge6" class="edge">
+<title>uwsgi&#45;&gt;searxng2</title>
+<path fill="none" stroke="black" d="M190,-161.81C190,-153.79 190,-144.05 190,-135.07"/>
+<polygon fill="black" stroke="black" points="193.5,-135.03 190,-125.03 186.5,-135.03 193.5,-135.03"/>
+</g>
+<!-- searxng3 -->
+<g id="node8" class="node">
+<title>searxng3</title>
+<polygon fill="#ffffcc" stroke="black" points="364,-125 260,-125 260,-89 364,-89 364,-125"/>
+<text text-anchor="middle" x="312" y="-103.3" font-family="Sans" font-size="14.00" fill="#0000cd">SearXNG #3</text>
+</g>
+<!-- uwsgi&#45;&gt;searxng3 -->
+<g id="edge8" class="edge">
+<title>uwsgi&#45;&gt;searxng3</title>
+<path fill="none" stroke="black" d="M219.22,-161.99C235.55,-152.49 256.09,-140.54 273.69,-130.29"/>
+<polygon fill="black" stroke="black" points="275.71,-133.17 282.59,-125.11 272.19,-127.12 275.71,-133.17"/>
+</g>
+<!-- searxng4 -->
+<g id="node9" class="node">
+<title>searxng4</title>
+<polygon fill="#ffffcc" stroke="black" points="486,-125 382,-125 382,-89 486,-89 486,-125"/>
+<text text-anchor="middle" x="434" y="-103.3" font-family="Sans" font-size="14.00" fill="#0000cd">SearXNG #4</text>
+</g>
+<!-- uwsgi&#45;&gt;searxng4 -->
+<g id="edge10" class="edge">
+<title>uwsgi&#45;&gt;searxng4</title>
+<path fill="none" stroke="black" d="M226,-168.52C264.37,-157.36 325.82,-139.48 372,-126.04"/>
+<polygon fill="black" stroke="black" points="372.99,-129.4 381.61,-123.24 371.03,-122.68 372.99,-129.4"/>
+</g>
+<!-- redis -->
+<g id="node5" class="node">
+<title>redis</title>
+<path fill="#ffffcc" stroke="black" d="M288.5,-48.73C288.5,-50.53 271.69,-52 251,-52 230.31,-52 213.5,-50.53 213.5,-48.73 213.5,-48.73 213.5,-19.27 213.5,-19.27 213.5,-17.47 230.31,-16 251,-16 271.69,-16 288.5,-17.47 288.5,-19.27 288.5,-19.27 288.5,-48.73 288.5,-48.73"/>
+<path fill="none" stroke="black" d="M288.5,-48.73C288.5,-46.92 271.69,-45.45 251,-45.45 230.31,-45.45 213.5,-46.92 213.5,-48.73"/>
+<text text-anchor="middle" x="251" y="-30.3" font-family="Sans" font-size="14.00">redis DB</text>
+</g>
+<!-- searxng1&#45;&gt;redis -->
+<g id="edge5" class="edge">
+<title>searxng1&#45;&gt;redis</title>
+<path fill="none" stroke="black" d="M111.83,-88.99C139.55,-78.24 175.36,-64.35 203.71,-53.35"/>
+<polygon fill="black" stroke="black" points="205.35,-56.47 213.4,-49.59 202.81,-49.94 205.35,-56.47"/>
+</g>
+<!-- searxng2&#45;&gt;redis -->
+<g id="edge7" class="edge">
+<title>searxng2&#45;&gt;redis</title>
+<path fill="none" stroke="black" d="M204.77,-88.81C212.26,-80.09 221.5,-69.34 229.74,-59.75"/>
+<polygon fill="black" stroke="black" points="232.51,-61.89 236.37,-52.03 227.2,-57.33 232.51,-61.89"/>
+</g>
+<!-- searxng3&#45;&gt;redis -->
+<g id="edge9" class="edge">
+<title>searxng3&#45;&gt;redis</title>
+<path fill="none" stroke="black" d="M297.23,-88.81C289.74,-80.09 280.5,-69.34 272.26,-59.75"/>
+<polygon fill="black" stroke="black" points="274.8,-57.33 265.63,-52.03 269.49,-61.89 274.8,-57.33"/>
+</g>
+<!-- searxng4&#45;&gt;redis -->
+<g id="edge11" class="edge">
+<title>searxng4&#45;&gt;redis</title>
+<path fill="none" stroke="black" d="M390.17,-88.99C362.45,-78.24 326.64,-64.35 298.29,-53.35"/>
+<polygon fill="black" stroke="black" points="299.19,-49.94 288.6,-49.59 296.65,-56.47 299.19,-49.94"/>
+</g>
+</g>
+</svg>
diff --git a/_images/ffox-setting-proxy-socks.png b/_images/ffox-setting-proxy-socks.png
new file mode 100644
index 000000000..3da85d2c0
--- /dev/null
+++ b/_images/ffox-setting-proxy-socks.png
Binary files differ
diff --git a/_images/hello.dot b/_images/hello.dot
new file mode 100644
index 000000000..504621dfc
--- /dev/null
+++ b/_images/hello.dot
@@ -0,0 +1,3 @@
+graph G {
+ Hello -- World
+}
diff --git a/_images/hello.svg b/_images/hello.svg
new file mode 100644
index 000000000..7d7af8e24
--- /dev/null
+++ b/_images/hello.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.43.0 (0)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="85pt" height="116pt"
+ viewBox="0.00 0.00 84.69 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
+<title>G</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-112 80.69,-112 80.69,4 -4,4"/>
+<!-- Hello -->
+<g id="node1" class="node">
+<title>Hello</title>
+<ellipse fill="none" stroke="black" cx="38.35" cy="-90" rx="35.19" ry="18"/>
+<text text-anchor="middle" x="38.35" y="-86.3" font-family="Times,serif" font-size="14.00">Hello</text>
+</g>
+<!-- World -->
+<g id="node2" class="node">
+<title>World</title>
+<ellipse fill="none" stroke="black" cx="38.35" cy="-18" rx="38.19" ry="18"/>
+<text text-anchor="middle" x="38.35" y="-14.3" font-family="Times,serif" font-size="14.00">World</text>
+</g>
+<!-- Hello&#45;&#45;World -->
+<g id="edge1" class="edge">
+<title>Hello&#45;&#45;World</title>
+<path fill="none" stroke="black" d="M38.35,-71.7C38.35,-60.85 38.35,-46.92 38.35,-36.1"/>
+</g>
+</g>
+</svg>
diff --git a/_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg b/_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg
new file mode 100644
index 000000000..80edca1d9
--- /dev/null
+++ b/_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg
@@ -0,0 +1,25 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.8.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='36.523255pt' height='48.422712pt' viewBox='57.608781 53.798251 36.523255 48.422712'>
+<defs>
+<path id='g0-0' d='M9.191532-3.20797C9.428643-3.20797 9.679701-3.20797 9.679701-3.486924S9.428643-3.765878 9.191532-3.765878H1.645828C1.408717-3.765878 1.157659-3.765878 1.157659-3.486924S1.408717-3.20797 1.645828-3.20797H9.191532Z'/>
+<path id='g1-120' d='M6.611208-5.69066C6.164882-5.606974 5.997509-5.272229 5.997509-5.007223C5.997509-4.672478 6.262516-4.560897 6.457783-4.560897C6.876214-4.560897 7.169116-4.923537 7.169116-5.300125C7.169116-5.885928 6.499626-6.150934 5.913823-6.150934C5.063014-6.150934 4.588792-5.314072 4.463263-5.049066C4.142466-6.095143 3.277709-6.150934 3.02665-6.150934C1.603985-6.150934 .850809-4.323786 .850809-4.016936C.850809-3.961146 .9066-3.891407 1.004234-3.891407C1.115816-3.891407 1.143711-3.975093 1.171606-4.030884C1.645828-5.579078 2.580324-5.87198 2.984807-5.87198C3.612453-5.87198 3.737983-5.286177 3.737983-4.951432C3.737983-4.644583 3.654296-4.323786 3.486924-3.654296L3.012702-1.743462C2.803487-.9066 2.399004-.139477 1.659776-.139477C1.590037-.139477 1.241345-.139477 .948443-.320797C1.45056-.418431 1.562142-.836862 1.562142-1.004234C1.562142-1.283188 1.352927-1.45056 1.08792-1.45056C.753176-1.45056 .390535-1.157659 .390535-.711333C.390535-.125529 1.046077 .139477 1.645828 .139477C2.315318 .139477 2.789539-.390535 3.082441-.962391C3.305604-.139477 4.002989 .139477 4.519054 .139477C5.941719 .139477 6.694894-1.687671 6.694894-1.994521C6.694894-2.064259 6.639103-2.12005 6.555417-2.12005C6.429888-2.12005 6.41594-2.050311 6.374097-1.93873C5.997509-.711333 5.188543-.139477 4.560897-.139477C4.072727-.139477 3.807721-.502117 3.807721-1.073973C3.807721-1.380822 3.863512-1.603985 4.086675-2.524533L4.574844-4.42142C4.78406-5.258281 5.258281-5.87198 5.899875-5.87198C5.927771-5.87198 6.318306-5.87198 6.611208-5.69066Z'/>
+<path id='g1-121' d='M3.668244 1.562142C3.291656 2.092154 2.747696 2.566376 2.064259 2.566376C1.896887 2.566376 1.227397 2.538481 1.018182 1.896887C1.060025 1.910834 1.129763 1.910834 1.157659 1.910834C1.57609 1.910834 1.855044 1.548194 1.855044 1.227397S1.590037 .795019 1.380822 .795019C1.157659 .795019 .669489 .962391 .669489 1.645828C.669489 2.357161 1.26924 2.84533 2.064259 2.84533C3.459029 2.84533 4.867746 1.562142 5.258281 .013948L6.625156-5.425654C6.639103-5.495392 6.666999-5.579078 6.666999-5.662765C6.666999-5.87198 6.499626-6.011457 6.290411-6.011457C6.164882-6.011457 5.87198-5.955666 5.760399-5.537235L4.728269-1.436613C4.658531-1.185554 4.658531-1.157659 4.546949-1.004234C4.267995-.613699 3.807721-.139477 3.138232-.139477C2.357161-.139477 2.287422-.9066 2.287422-1.283188C2.287422-2.078207 2.66401-3.152179 3.040598-4.156413C3.194022-4.560897 3.277709-4.756164 3.277709-5.035118C3.277709-5.620922 2.859278-6.150934 2.175841-6.150934C.892653-6.150934 .376588-4.128518 .376588-4.016936C.376588-3.961146 .432379-3.891407 .530012-3.891407C.655542-3.891407 .669489-3.947198 .72528-4.142466C1.060025-5.314072 1.590037-5.87198 2.133998-5.87198C2.259527-5.87198 2.496638-5.87198 2.496638-5.411706C2.496638-5.049066 2.343213-4.644583 2.133998-4.11457C1.45056-2.287422 1.45056-1.827148 1.45056-1.492403C1.45056-.167372 2.399004 .139477 3.096389 .139477C3.500872 .139477 4.002989 .013948 4.491158-.502117L4.505106-.488169C4.29589 .334745 4.156413 .878705 3.668244 1.562142Z'/>
+<path id='g1-122' d='M1.771357-1.129763C2.371108-1.8132 2.859278-2.245579 3.556663-2.873225C4.393524-3.598506 4.756164-3.947198 4.951432-4.156413C5.927771-5.118804 6.41594-5.927771 6.41594-6.039352S6.304359-6.150934 6.276463-6.150934C6.178829-6.150934 6.150934-6.095143 6.081196-5.997509C5.732503-5.397758 5.397758-5.104857 5.035118-5.104857C4.742217-5.104857 4.588792-5.230386 4.323786-5.565131C4.030884-5.913823 3.793773-6.150934 3.38929-6.150934C2.371108-6.150934 1.75741-4.881694 1.75741-4.588792C1.75741-4.546949 1.771357-4.463263 1.896887-4.463263C2.008468-4.463263 2.022416-4.519054 2.064259-4.616687C2.30137-5.174595 2.970859-5.272229 3.235866-5.272229C3.528767-5.272229 3.807721-5.174595 4.100623-5.049066C4.630635-4.825903 4.853798-4.825903 4.993275-4.825903C5.090909-4.825903 5.1467-4.825903 5.216438-4.839851C4.756164-4.29589 4.002989-3.626401 3.375342-3.054545L1.966625-1.75741C1.115816-.892653 .599751-.069738 .599751 .027895C.599751 .111582 .669489 .139477 .753176 .139477S.850809 .125529 .948443-.041843C1.171606-.390535 1.617933-.9066 2.133998-.9066C2.426899-.9066 2.566376-.808966 2.84533-.460274C3.110336-.153425 3.347447 .139477 3.793773 .139477C5.160648 .139477 5.941719-1.63188 5.941719-1.952677C5.941719-2.008468 5.927771-2.092154 5.788294-2.092154C5.676712-2.092154 5.662765-2.036364 5.620922-1.896887C5.314072-1.073973 4.491158-.739228 3.947198-.739228C3.654296-.739228 3.375342-.836862 3.082441-.962391C2.524533-1.185554 2.371108-1.185554 2.189788-1.185554C2.050311-1.185554 1.896887-1.185554 1.771357-1.129763Z'/>
+<path id='g2-43' d='M5.565131-3.221918H9.414695C9.609963-3.221918 9.861021-3.221918 9.861021-3.472976C9.861021-3.737983 9.62391-3.737983 9.414695-3.737983H5.565131V-7.587547C5.565131-7.782814 5.565131-8.033873 5.314072-8.033873C5.049066-8.033873 5.049066-7.796762 5.049066-7.587547V-3.737983H1.199502C1.004234-3.737983 .753176-3.737983 .753176-3.486924C.753176-3.221918 .990286-3.221918 1.199502-3.221918H5.049066V.627646C5.049066 .822914 5.049066 1.073973 5.300125 1.073973C5.565131 1.073973 5.565131 .836862 5.565131 .627646V-3.221918Z'/>
+<path id='g2-49' d='M4.016936-8.940473C4.016936-9.26127 4.016936-9.275218 3.737983-9.275218C3.403238-8.89863 2.705853-8.382565 1.26924-8.382565V-7.978082C1.590037-7.978082 2.287422-7.978082 3.054545-8.340722V-1.073973C3.054545-.571856 3.012702-.404483 1.785305-.404483H1.352927V0C1.729514-.027895 3.082441-.027895 3.542715-.027895S5.341968-.027895 5.718555 0V-.404483H5.286177C4.05878-.404483 4.016936-.571856 4.016936-1.073973V-8.940473Z'/>
+</defs>
+<g id='page1'>
+<use x='59.270442' y='62.786766' xlink:href='#g2-49'/>
+<rect x='58.804295' y='68.456606' height='.55789' width='7.760768'/>
+<use x='58.804295' y='81.789907' xlink:href='#g1-120'/>
+<use x='70.860038' y='72.222482' xlink:href='#g2-43'/>
+<use x='85.942577' y='62.786766' xlink:href='#g2-49'/>
+<rect x='85.777106' y='68.456606' height='.55789' width='7.159416'/>
+<use x='85.777106' y='81.789907' xlink:href='#g1-121'/>
+<rect x='57.608781' y='86.175621' height='.55789' width='36.523255'/>
+<use x='60.284264' y='99.508922' xlink:href='#g1-121'/>
+<use x='70.543155' y='99.508922' xlink:href='#g0-0'/>
+<use x='84.490862' y='99.508922' xlink:href='#g1-122'/>
+</g>
+</svg> \ No newline at end of file
diff --git a/_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg b/_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg
new file mode 100644
index 000000000..7c11c8b42
--- /dev/null
+++ b/_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg
@@ -0,0 +1,25 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.8.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='23.092891pt' height='29.523663pt' viewBox='57.608781 53.79825 23.092891 29.523663'>
+<defs>
+<path id='g0-0' d='M6.434044-2.245569C6.600021-2.245569 6.775761-2.245569 6.775761-2.440836S6.600021-2.636103 6.434044-2.636103H1.152075C.986098-2.636103 .810358-2.636103 .810358-2.440836S.986098-2.245569 1.152075-2.245569H6.434044Z'/>
+<path id='g1-120' d='M3.260957-2.94853C3.319537-3.202377 3.544094-4.100605 4.227528-4.100605C4.276345-4.100605 4.510665-4.100605 4.715696-3.973681C4.442322-3.924865 4.247055-3.680781 4.247055-3.446461C4.247055-3.290247 4.354452-3.104744 4.618062-3.104744C4.832856-3.104744 5.145283-3.280484 5.145283-3.671018C5.145283-4.178712 4.569245-4.315398 4.237292-4.315398C3.671018-4.315398 3.329301-3.797941 3.21214-3.573384C2.968057-4.217765 2.440836-4.315398 2.157699-4.315398C1.142311-4.315398 .585801-3.055927 .585801-2.811843C.585801-2.71421 .683434-2.71421 .702961-2.71421C.781068-2.71421 .810358-2.733737 .829884-2.821607C1.161838-3.856521 1.806219-4.100605 2.138172-4.100605C2.323676-4.100605 2.665393-4.012735 2.665393-3.446461C2.665393-3.143797 2.499416-2.489653 2.138172-1.122785C1.981959-.517457 1.640242-.107397 1.210655-.107397C1.152075-.107397 .927518-.107397 .722488-.23432C.966571-.283137 1.181365-.488167 1.181365-.761541C1.181365-1.025151 .966571-1.103258 .820121-1.103258C.527221-1.103258 .283137-.849411 .283137-.536984C.283137-.08787 .771304 .107397 1.200891 .107397C1.845272 .107397 2.196753-.576037 2.226043-.634617C2.343203-.273374 2.694683 .107397 3.280484 .107397C4.286108 .107397 4.842619-1.152075 4.842619-1.396158C4.842619-1.493792 4.754749-1.493792 4.725459-1.493792C4.637589-1.493792 4.618062-1.454738 4.598535-1.386395C4.276345-.341717 3.612438-.107397 3.300011-.107397C2.91924-.107397 2.763027-.419824 2.763027-.751778C2.763027-.966571 2.821607-1.181365 2.929003-1.610952L3.260957-2.94853Z'/>
+<path id='g1-121' d='M4.744986-3.719834C4.784039-3.856521 4.784039-3.876048 4.784039-3.944391C4.784039-4.120131 4.647352-4.208002 4.500902-4.208002C4.403268-4.208002 4.247055-4.149422 4.159185-4.002971C4.139658-3.954155 4.061551-3.651491 4.022498-3.475751C3.954155-3.221904 3.885811-2.958293 3.827231-2.694683L3.387881-.937281C3.348827-.790831 2.929003-.107397 2.284623-.107397C1.786692-.107397 1.679295-.536984 1.679295-.898228C1.679295-1.347342 1.845272-1.952669 2.177226-2.811843C2.333439-3.21214 2.372493-3.319537 2.372493-3.514804C2.372493-3.954155 2.060066-4.315398 1.571899-4.315398C.644381-4.315398 .283137-2.899713 .283137-2.811843C.283137-2.71421 .38077-2.71421 .400297-2.71421C.497931-2.71421 .507694-2.733737 .556511-2.88995C.820121-3.807704 1.210655-4.100605 1.542608-4.100605C1.620715-4.100605 1.786692-4.100605 1.786692-3.788178C1.786692-3.544094 1.689059-3.290247 1.620715-3.104744C1.230181-2.069829 1.054441-1.513318 1.054441-1.054441C1.054441-.185504 1.669532 .107397 2.245569 .107397C2.62634 .107397 2.958293-.05858 3.231667-.331954C3.104744 .17574 2.987583 .654144 2.59705 1.171601C2.343203 1.503555 1.972196 1.786692 1.523082 1.786692C1.386395 1.786692 .947044 1.757402 .781068 1.376632C.937281 1.376632 1.064205 1.376632 1.200891 1.259471C1.298525 1.171601 1.396158 1.044678 1.396158 .859174C1.396158 .556511 1.132548 .517457 1.034915 .517457C.810358 .517457 .488167 .673671 .488167 1.152075C.488167 1.640242 .917754 2.001486 1.523082 2.001486C2.528706 2.001486 3.534331 1.113021 3.807704 .009763L4.744986-3.719834Z'/>
+<path id='g1-122' d='M1.298525-.810358C1.825745-1.376632 2.108882-1.620715 2.460363-1.923379C2.460363-1.933142 3.06569-2.4506 3.417171-2.80208C4.344688-3.710071 4.559482-4.178712 4.559482-4.217765C4.559482-4.315398 4.471612-4.315398 4.452085-4.315398C4.383742-4.315398 4.354452-4.295872 4.305635-4.208002C4.012735-3.739361 3.807704-3.583148 3.573384-3.583148S3.221904-3.729598 3.075454-3.895575C2.88995-4.120131 2.723973-4.315398 2.401783-4.315398C1.669532-4.315398 1.220418-3.407407 1.220418-3.202377C1.220418-3.15356 1.249708-3.09498 1.337578-3.09498S1.444975-3.143797 1.464502-3.202377C1.650005-3.651491 2.216279-3.661254 2.294386-3.661254C2.499416-3.661254 2.68492-3.592911 2.909477-3.514804C3.300011-3.368354 3.407407-3.368354 3.661254-3.368354C3.309774-2.94853 2.489653-2.245569 2.304149-2.089356L1.425448-1.269235C.761541-.615091 .419824-.05858 .419824 .009763C.419824 .107397 .517457 .107397 .536984 .107397C.615091 .107397 .634617 .08787 .693197-.019527C.917754-.361244 1.210655-.624854 1.523082-.624854C1.747639-.624854 1.845272-.536984 2.089356-.253847C2.255333-.048817 2.431073 .107397 2.71421 .107397C3.680781 .107397 4.247055-1.132548 4.247055-1.396158C4.247055-1.444975 4.208002-1.493792 4.129895-1.493792C4.042025-1.493792 4.022498-1.435212 3.993208-1.366868C3.768651-.732251 3.143797-.546747 2.821607-.546747C2.62634-.546747 2.4506-.605327 2.245569-.673671C1.913616-.800594 1.767165-.839648 1.562135-.839648C1.542608-.839648 1.386395-.839648 1.298525-.810358Z'/>
+<path id='g2-43' d='M3.993208-2.245569H6.717181C6.853868-2.245569 7.039372-2.245569 7.039372-2.440836S6.853868-2.636103 6.717181-2.636103H3.993208V-5.36984C3.993208-5.506526 3.993208-5.69203 3.797941-5.69203S3.602674-5.506526 3.602674-5.36984V-2.636103H.868938C.732251-2.636103 .546747-2.636103 .546747-2.440836S.732251-2.245569 .868938-2.245569H3.602674V.488167C3.602674 .624854 3.602674 .810358 3.797941 .810358S3.993208 .624854 3.993208 .488167V-2.245569Z'/>
+<path id='g2-49' d='M2.870423-6.248541C2.870423-6.482861 2.870423-6.502388 2.645866-6.502388C2.040539-5.877534 1.181365-5.877534 .868938-5.877534V-5.57487C1.064205-5.57487 1.640242-5.57487 2.147936-5.828717V-.771304C2.147936-.419824 2.118646-.302664 1.239945-.302664H.927518V0C1.269235-.02929 2.118646-.02929 2.50918-.02929S3.749124-.02929 4.090841 0V-.302664H3.778414C2.899713-.302664 2.870423-.41006 2.870423-.771304V-6.248541Z'/>
+</defs>
+<g id='page1'>
+<use x='59.153464' y='60.090183' xlink:href='#g2-49'/>
+<rect x='58.804295' y='61.81595' height='.55789' width='5.580027'/>
+<use x='58.804295' y='70.391549' xlink:href='#g1-120'/>
+<use x='65.579836' y='65.581827' xlink:href='#g2-43'/>
+<use x='74.496784' y='60.090183' xlink:href='#g2-49'/>
+<rect x='74.369089' y='61.81595' height='.55789' width='5.137078'/>
+<use x='74.369089' y='70.391549' xlink:href='#g1-121'/>
+<rect x='57.608781' y='72.847884' height='.55789' width='23.092891'/>
+<use x='60.304908' y='81.423483' xlink:href='#g1-121'/>
+<use x='65.441996' y='81.423483' xlink:href='#g0-0'/>
+<use x='73.035735' y='81.423483' xlink:href='#g1-122'/>
+</g>
+</svg> \ No newline at end of file
diff --git a/_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg b/_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg
new file mode 100644
index 000000000..8be77010f
--- /dev/null
+++ b/_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.8.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='69.686469pt' height='12.418845pt' viewBox='56.413267 54.399982 69.686469 12.418845'>
+<defs>
+<path id='g2-43' d='M5.565131-3.221918H9.414695C9.609963-3.221918 9.861021-3.221918 9.861021-3.472976C9.861021-3.737983 9.62391-3.737983 9.414695-3.737983H5.565131V-7.587547C5.565131-7.782814 5.565131-8.033873 5.314072-8.033873C5.049066-8.033873 5.049066-7.796762 5.049066-7.587547V-3.737983H1.199502C1.004234-3.737983 .753176-3.737983 .753176-3.486924C.753176-3.221918 .990286-3.221918 1.199502-3.221918H5.049066V.627646C5.049066 .822914 5.049066 1.073973 5.300125 1.073973C5.565131 1.073973 5.565131 .836862 5.565131 .627646V-3.221918Z'/>
+<path id='g2-61' d='M9.414695-4.519054C9.609963-4.519054 9.861021-4.519054 9.861021-4.770112C9.861021-5.035118 9.62391-5.035118 9.414695-5.035118H1.199502C1.004234-5.035118 .753176-5.035118 .753176-4.78406C.753176-4.519054 .990286-4.519054 1.199502-4.519054H9.414695ZM9.414695-1.924782C9.609963-1.924782 9.861021-1.924782 9.861021-2.175841C9.861021-2.440847 9.62391-2.440847 9.414695-2.440847H1.199502C1.004234-2.440847 .753176-2.440847 .753176-2.189788C.753176-1.924782 .990286-1.924782 1.199502-1.924782H9.414695Z'/>
+<path id='g1-50' d='M1.239945-.751778L2.274859-1.757402C3.797941-3.104744 4.383742-3.631964 4.383742-4.608299C4.383742-5.72132 3.505041-6.502388 2.313913-6.502388C1.210655-6.502388 .488167-5.60416 .488167-4.735222C.488167-4.188475 .976334-4.188475 1.005625-4.188475C1.171601-4.188475 1.513318-4.305635 1.513318-4.705932C1.513318-4.959779 1.337578-5.213626 .995861-5.213626C.917754-5.213626 .898228-5.213626 .868938-5.203863C1.093495-5.83848 1.620715-6.199724 2.186989-6.199724C3.075454-6.199724 3.495277-5.408893 3.495277-4.608299C3.495277-3.827231 3.00711-3.055927 2.470126-2.4506L.595564-.361244C.488167-.253847 .488167-.23432 .488167 0H4.110368L4.383742-1.698822H4.139658C4.090841-1.405922 4.022498-.976334 3.924865-.829884C3.856521-.751778 3.21214-.751778 2.997347-.751778H1.239945Z'/>
+<path id='g0-97' d='M4.198257-1.659776C4.128518-1.422665 4.128518-1.39477 3.93325-1.129763C3.626401-.739228 3.012702-.139477 2.357161-.139477C1.785305-.139477 1.464508-.655542 1.464508-1.478456C1.464508-2.245579 1.896887-3.807721 2.161893-4.393524C2.636115-5.369863 3.291656-5.87198 3.835616-5.87198C4.756164-5.87198 4.937484-4.728269 4.937484-4.616687C4.937484-4.60274 4.895641-4.42142 4.881694-4.393524L4.198257-1.659776ZM5.090909-5.230386C4.937484-5.593026 4.560897-6.150934 3.835616-6.150934C2.259527-6.150934 .557908-4.11457 .557908-2.050311C.557908-.669489 1.366874 .139477 2.315318 .139477C3.082441 .139477 3.737983-.460274 4.128518-.920548C4.267995-.097634 4.923537 .139477 5.341968 .139477S6.095143-.111582 6.346202-.613699C6.569365-1.08792 6.764633-1.93873 6.764633-1.994521C6.764633-2.064259 6.708842-2.12005 6.625156-2.12005C6.499626-2.12005 6.485679-2.050311 6.429888-1.841096C6.220672-1.018182 5.955666-.139477 5.383811-.139477C4.979328-.139477 4.951432-.502117 4.951432-.781071C4.951432-1.101868 4.993275-1.255293 5.118804-1.799253C5.216438-2.147945 5.286177-2.454795 5.397758-2.859278C5.913823-4.951432 6.039352-5.453549 6.039352-5.537235C6.039352-5.732503 5.885928-5.885928 5.676712-5.885928C5.230386-5.885928 5.118804-5.397758 5.090909-5.230386Z'/>
+<path id='g0-98' d='M3.221918-9.331009C3.235866-9.3868 3.263761-9.470486 3.263761-9.540224C3.263761-9.679701 3.124284-9.679701 3.096389-9.679701C3.082441-9.679701 2.580324-9.637858 2.329265-9.609963C2.092154-9.596015 1.882939-9.56812 1.63188-9.554172C1.297136-9.526276 1.199502-9.512329 1.199502-9.26127C1.199502-9.121793 1.338979-9.121793 1.478456-9.121793C2.189788-9.121793 2.189788-8.996264 2.189788-8.856787C2.189788-8.759153 2.078207-8.35467 2.022416-8.103611L1.687671-6.764633C1.548194-6.206725 .753176-3.040598 .697385-2.789539C.627646-2.440847 .627646-2.203736 .627646-2.022416C.627646-.599751 1.422665 .139477 2.329265 .139477C3.947198 .139477 5.620922-1.93873 5.620922-3.961146C5.620922-5.244334 4.895641-6.150934 3.849564-6.150934C3.124284-6.150934 2.468742-5.551183 2.203736-5.272229L3.221918-9.331009ZM2.343213-.139477C1.896887-.139477 1.408717-.474222 1.408717-1.562142C1.408717-2.022416 1.45056-2.287422 1.701619-3.263761C1.743462-3.445081 1.966625-4.337733 2.022416-4.519054C2.050311-4.630635 2.873225-5.87198 3.821669-5.87198C4.435367-5.87198 4.714321-5.258281 4.714321-4.533001C4.714321-3.863512 4.323786-2.287422 3.975093-1.562142C3.626401-.808966 2.984807-.139477 2.343213-.139477Z'/>
+<path id='g0-99' d='M5.453549-5.244334C5.188543-5.244334 5.063014-5.244334 4.867746-5.076961C4.78406-5.007223 4.630635-4.798007 4.630635-4.574844C4.630635-4.29589 4.839851-4.128518 5.104857-4.128518C5.439601-4.128518 5.816189-4.407472 5.816189-4.96538C5.816189-5.634869 5.174595-6.150934 4.212204-6.150934C2.385056-6.150934 .557908-4.156413 .557908-2.175841C.557908-.962391 1.311083 .139477 2.733748 .139477C4.630635 .139477 5.830137-1.338979 5.830137-1.520299C5.830137-1.603985 5.746451-1.673724 5.69066-1.673724C5.648817-1.673724 5.634869-1.659776 5.50934-1.534247C4.616687-.348692 3.291656-.139477 2.761644-.139477C1.799253-.139477 1.492403-.976339 1.492403-1.673724C1.492403-2.161893 1.729514-3.514819 2.231631-4.463263C2.594271-5.118804 3.347447-5.87198 4.226152-5.87198C4.407472-5.87198 5.174595-5.844085 5.453549-5.244334Z'/>
+</defs>
+<g id='page1'>
+<use x='56.413267' y='65.753425' xlink:href='#g0-97'/>
+<use x='63.582369' y='60.691915' xlink:href='#g1-50'/>
+<use x='72.061649' y='65.753425' xlink:href='#g2-43'/>
+<use x='85.783204' y='65.753425' xlink:href='#g0-98'/>
+<use x='91.589827' y='60.691915' xlink:href='#g1-50'/>
+<use x='100.843973' y='65.753425' xlink:href='#g2-61'/>
+<use x='115.340392' y='65.753425' xlink:href='#g0-99'/>
+<use x='121.218045' y='60.691915' xlink:href='#g1-50'/>
+</g>
+</svg> \ No newline at end of file
diff --git a/_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg b/_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg
new file mode 100644
index 000000000..27ae39410
--- /dev/null
+++ b/_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg
@@ -0,0 +1,43 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.8.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='134.289458pt' height='28.68903pt' viewBox='165.981071 78.308016 134.289458 28.68903'>
+<defs>
+<path id='g1-105' d='M3.807721-3.249813C3.87746-3.417186 3.87746-3.445081 3.87746-3.486924S3.87746-3.556663 3.807721-3.724035L1.366874-10.139975C1.283188-10.377086 1.199502-10.460772 1.046077-10.460772S.767123-10.335243 .767123-10.181818C.767123-10.139975 .767123-10.11208 .836862-9.958655L3.305604-3.486924L.836862 2.956912C.767123 3.110336 .767123 3.138232 .767123 3.20797C.767123 3.361395 .892653 3.486924 1.046077 3.486924C1.227397 3.486924 1.283188 3.347447 1.338979 3.20797L3.807721-3.249813Z'/>
+<path id='g1-106' d='M2.217684-9.958655C2.217684-10.209714 2.217684-10.460772 1.93873-10.460772S1.659776-10.209714 1.659776-9.958655V2.984807C1.659776 3.235866 1.659776 3.486924 1.93873 3.486924S2.217684 3.235866 2.217684 2.984807V-9.958655Z'/>
+<path id='g2-32' d='M6.555417-9.344956C6.555417-9.358904 6.611208-9.540224 6.611208-9.554172C6.611208-9.679701 6.499626-9.679701 6.457783-9.679701C6.332254-9.679701 6.318306-9.609963 6.262516-9.400747L3.961146-.167372C2.803487-.306849 2.371108-.892653 2.371108-1.729514C2.371108-2.036364 2.371108-2.357161 3.02665-4.086675C3.20797-4.588792 3.277709-4.770112 3.277709-5.021171C3.277709-5.648817 2.831382-6.150934 2.175841-6.150934C.892653-6.150934 .376588-4.128518 .376588-4.016936C.376588-3.961146 .432379-3.891407 .530012-3.891407C.655542-3.891407 .669489-3.947198 .72528-4.142466C1.060025-5.355915 1.617933-5.87198 2.133998-5.87198C2.259527-5.87198 2.496638-5.858032 2.496638-5.411706C2.496638-5.355915 2.496638-5.049066 2.259527-4.435367C1.506351-2.454795 1.506351-2.147945 1.506351-1.827148C1.506351-.488169 2.622167 .027895 3.87746 .125529C3.765878 .557908 3.668244 1.004234 3.556663 1.436613C3.333499 2.273474 3.235866 2.66401 3.235866 2.719801C3.235866 2.84533 3.347447 2.84533 3.38929 2.84533C3.417186 2.84533 3.472976 2.84533 3.500872 2.789539C3.556663 2.733748 4.128518 .390535 4.184309 .139477C4.700374 .139477 5.802242 .139477 7.057534-1.157659C7.517808-1.659776 7.936239-2.30137 8.17335-2.901121C8.312827-3.263761 8.647572-4.505106 8.647572-5.216438C8.647572-6.0533 8.229141-6.150934 8.089664-6.150934C7.754919-6.150934 7.44807-5.816189 7.44807-5.537235C7.44807-5.369863 7.545704-5.272229 7.601494-5.216438C7.727024-5.090909 8.103611-4.714321 8.103611-3.989041C8.103611-3.486924 7.824658-2.454795 6.932005-1.45056C5.760399-.139477 4.686426-.139477 4.267995-.139477L6.555417-9.344956Z'/>
+<path id='g2-58' d='M2.566376-.669489C2.566376-1.073973 2.231631-1.352927 1.896887-1.352927C1.492403-1.352927 1.21345-1.018182 1.21345-.683437C1.21345-.278954 1.548194 0 1.882939 0C2.287422 0 2.566376-.334745 2.566376-.669489Z'/>
+<path id='g2-64' d='M6.332254-4.658531C6.248568-5.439601 5.760399-6.374097 4.505106-6.374097C2.538481-6.374097 .530012-4.379577 .530012-2.161893C.530012-1.311083 1.115816 .292902 3.012702 .292902C6.304359 .292902 7.713076-4.505106 7.713076-6.41594C7.713076-8.424408 6.583313-9.972603 4.798007-9.972603C2.775592-9.972603 2.175841-8.201245 2.175841-7.824658C2.175841-7.699128 2.259527-7.392279 2.650062-7.392279C3.138232-7.392279 3.347447-7.838605 3.347447-8.075716C3.347447-8.508095 2.915068-8.508095 2.733748-8.508095C3.305604-9.540224 4.365629-9.637858 4.742217-9.637858C5.969614-9.637858 6.750685-8.661519 6.750685-7.099377C6.750685-6.206725 6.485679-5.174595 6.346202-4.658531H6.332254ZM3.054545-.083686C1.743462-.083686 1.520299-1.115816 1.520299-1.701619C1.520299-2.315318 1.910834-3.75193 2.12005-4.267995C2.30137-4.686426 3.096389-6.095143 4.546949-6.095143C5.816189-6.095143 6.109091-4.993275 6.109091-4.2401C6.109091-3.20797 5.202491-.083686 3.054545-.083686Z'/>
+<path id='g2-72' d='M10.432877-8.508095C10.558406-8.982316 10.586301-9.121793 11.576588-9.121793C11.827646-9.121793 11.967123-9.121793 11.967123-9.372852C11.967123-9.526276 11.841594-9.526276 11.757908-9.526276C11.506849-9.526276 11.213948-9.498381 10.948941-9.498381H9.303113C9.038107-9.498381 8.745205-9.526276 8.480199-9.526276C8.382565-9.526276 8.215193-9.526276 8.215193-9.26127C8.215193-9.121793 8.312827-9.121793 8.577833-9.121793C9.414695-9.121793 9.414695-9.010212 9.414695-8.856787C9.414695-8.828892 9.414695-8.745205 9.358904-8.53599L8.508095-5.160648H4.29589L5.132752-8.508095C5.258281-8.982316 5.286177-9.121793 6.276463-9.121793C6.527522-9.121793 6.666999-9.121793 6.666999-9.372852C6.666999-9.526276 6.541469-9.526276 6.457783-9.526276C6.206725-9.526276 5.913823-9.498381 5.648817-9.498381H4.002989C3.737983-9.498381 3.445081-9.526276 3.180075-9.526276C3.082441-9.526276 2.915068-9.526276 2.915068-9.26127C2.915068-9.121793 3.012702-9.121793 3.277709-9.121793C4.11457-9.121793 4.11457-9.010212 4.11457-8.856787C4.11457-8.828892 4.11457-8.745205 4.05878-8.53599L2.175841-1.03213C2.050311-.54396 2.022416-.404483 1.060025-.404483C.739228-.404483 .641594-.404483 .641594-.139477C.641594 0 .795019 0 .836862 0C1.08792 0 1.380822-.027895 1.645828-.027895H3.291656C3.556663-.027895 3.849564 0 4.11457 0C4.226152 0 4.379577 0 4.379577-.265006C4.379577-.404483 4.254047-.404483 4.044832-.404483C3.194022-.404483 3.194022-.516065 3.194022-.655542C3.194022-.669489 3.194022-.767123 3.221918-.878705L4.184309-4.756164H8.410461C8.17335-3.835616 7.462017-.920548 7.434122-.836862C7.280697-.418431 7.057534-.418431 6.23462-.404483C6.067248-.404483 5.941719-.404483 5.941719-.139477C5.941719 0 6.095143 0 6.136986 0C6.388045 0 6.680946-.027895 6.945953-.027895H8.591781C8.856787-.027895 9.149689 0 9.414695 0C9.526276 0 9.679701 0 9.679701-.265006C9.679701-.404483 9.554172-.404483 9.344956-.404483C8.494147-.404483 8.494147-.516065 8.494147-.655542C8.494147-.669489 8.494147-.767123 8.522042-.878705L10.432877-8.508095Z'/>
+<path id='g2-116' d='M2.803487-5.606974H4.086675C4.351681-5.606974 4.491158-5.606974 4.491158-5.858032C4.491158-6.011457 4.407472-6.011457 4.128518-6.011457H2.901121L3.417186-8.047821C3.472976-8.243088 3.472976-8.270984 3.472976-8.368618C3.472976-8.591781 3.291656-8.71731 3.110336-8.71731C2.998755-8.71731 2.677958-8.675467 2.566376-8.229141L2.022416-6.011457H.711333C.432379-6.011457 .306849-6.011457 .306849-5.746451C.306849-5.606974 .404483-5.606974 .669489-5.606974H1.910834L.990286-1.924782C.878705-1.436613 .836862-1.297136 .836862-1.115816C.836862-.460274 1.297136 .139477 2.078207 .139477C3.486924 .139477 4.2401-1.896887 4.2401-1.994521C4.2401-2.078207 4.184309-2.12005 4.100623-2.12005C4.072727-2.12005 4.016936-2.12005 3.989041-2.064259C3.975093-2.050311 3.961146-2.036364 3.863512-1.8132C3.57061-1.115816 2.929016-.139477 2.12005-.139477C1.701619-.139477 1.673724-.488169 1.673724-.795019C1.673724-.808966 1.673724-1.073973 1.715567-1.241345L2.803487-5.606974Z'/>
+<path id='g0-126' d='M3.556663-7.671233H6.262516C6.499626-7.671233 6.653051-7.671233 6.653051-7.838605C6.653051-8.019925 6.485679-8.019925 6.220672-8.019925H3.640349C3.737983-8.368618 3.737983-8.396513 3.821669-8.745205C3.891407-8.996264 4.016936-9.484433 4.016936-9.512329C4.016936-9.637858 3.93325-9.679701 3.821669-9.679701C3.556663-9.679701 2.454795-9.56812 2.12005-9.540224C2.008468-9.526276 1.855044-9.512329 1.855044-9.247323C1.855044-9.093898 1.994521-9.093898 2.189788-9.093898C2.859278-9.093898 2.887173-8.996264 2.887173-8.856787C2.887173-8.759153 2.761644-8.298879 2.691905-8.019925H1.910834C1.63188-8.019925 1.478456-8.019925 1.478456-7.838605C1.478456-7.671233 1.603985-7.671233 1.868991-7.671233H2.608219L.822914-.557908C.767123-.348692 .767123-.320797 .767123-.237111C.767123 .069738 1.004234 .153425 1.171606 .153425C1.436613 .153425 1.63188-.041843 1.687671-.223163C1.715567-.292902 1.868991-.920548 1.952677-1.26924L2.273474-2.510585C2.315318-2.719801 2.454795-3.249813 2.496638-3.459029C2.566376-3.682192 2.66401-4.11457 2.677958-4.156413C2.789539-4.393524 3.542715-5.858032 4.937484-5.858032C5.551183-5.858032 5.69066-5.355915 5.69066-4.895641C5.69066-4.030884 5.049066-2.329265 4.798007-1.687671C4.714321-1.464508 4.644583-1.26924 4.644583-1.004234C4.644583-.278954 5.160648 .153425 5.788294 .153425C7.127273 .153425 7.615442-1.910834 7.615442-1.994521C7.615442-2.133998 7.489913-2.133998 7.44807-2.133998C7.308593-2.133998 7.308593-2.092154 7.238854-1.882939C6.834371-.460274 6.206725-.153425 5.830137-.153425C5.565131-.153425 5.481445-.320797 5.481445-.613699C5.481445-.962391 5.634869-1.352927 5.718555-1.590037C5.955666-2.203736 6.583313-3.87746 6.583313-4.658531C6.583313-5.676712 5.941719-6.164882 4.979328-6.164882C4.546949-6.164882 3.710087-6.067248 2.915068-5.104857L3.556663-7.671233Z'/>
+<path id='g3-40' d='M4.533001 3.38929C4.533001 3.347447 4.533001 3.319552 4.29589 3.082441C2.901121 1.673724 2.12005-.627646 2.12005-3.472976C2.12005-6.178829 2.775592-8.508095 4.393524-10.153923C4.533001-10.279452 4.533001-10.307347 4.533001-10.349191C4.533001-10.432877 4.463263-10.460772 4.407472-10.460772C4.226152-10.460772 3.082441-9.456538 2.399004-8.089664C1.687671-6.680946 1.366874-5.188543 1.366874-3.472976C1.366874-2.231631 1.562142-.571856 2.287422 .920548C3.110336 2.594271 4.254047 3.500872 4.407472 3.500872C4.463263 3.500872 4.533001 3.472976 4.533001 3.38929Z'/>
+<path id='g3-41' d='M3.93325-3.472976C3.93325-4.533001 3.793773-6.262516 3.012702-7.880448C2.189788-9.554172 1.046077-10.460772 .892653-10.460772C.836862-10.460772 .767123-10.432877 .767123-10.349191C.767123-10.307347 .767123-10.279452 1.004234-10.042341C2.399004-8.633624 3.180075-6.332254 3.180075-3.486924C3.180075-.781071 2.524533 1.548194 .9066 3.194022C.767123 3.319552 .767123 3.347447 .767123 3.38929C.767123 3.472976 .836862 3.500872 .892653 3.500872C1.073973 3.500872 2.217684 2.496638 2.901121 1.129763C3.612453-.292902 3.93325-1.799253 3.93325-3.472976Z'/>
+<path id='g3-61' d='M9.414695-4.519054C9.609963-4.519054 9.861021-4.519054 9.861021-4.770112C9.861021-5.035118 9.62391-5.035118 9.414695-5.035118H1.199502C1.004234-5.035118 .753176-5.035118 .753176-4.78406C.753176-4.519054 .990286-4.519054 1.199502-4.519054H9.414695ZM9.414695-1.924782C9.609963-1.924782 9.861021-1.924782 9.861021-2.175841C9.861021-2.440847 9.62391-2.440847 9.414695-2.440847H1.199502C1.004234-2.440847 .753176-2.440847 .753176-2.189788C.753176-1.924782 .990286-1.924782 1.199502-1.924782H9.414695Z'/>
+<path id='g3-94' d='M3.417186-9.679701L1.590037-7.782814L1.8132-7.573599L3.403238-9.010212L5.007223-7.573599L5.230386-7.782814L3.417186-9.679701Z'/>
+<path id='g3-105' d='M2.426899-8.591781C2.426899-8.954421 2.133998-9.275218 1.743462-9.275218C1.380822-9.275218 1.073973-8.982316 1.073973-8.605729C1.073973-8.187298 1.408717-7.922291 1.743462-7.922291C2.175841-7.922291 2.426899-8.284932 2.426899-8.591781ZM.502117-5.997509V-5.593026C1.39477-5.593026 1.520299-5.50934 1.520299-4.825903V-1.03213C1.520299-.404483 1.366874-.404483 .460274-.404483V0C.850809-.027895 1.520299-.027895 1.924782-.027895C2.078207-.027895 2.887173-.027895 3.361395 0V-.404483C2.454795-.404483 2.399004-.474222 2.399004-1.018182V-6.150934L.502117-5.997509Z'/>
+</defs>
+<g id='page1'>
+<use x='165.981071' y='97.429622' xlink:href='#g3-105'/>
+<use x='169.774676' y='97.429622' xlink:href='#g0-126'/>
+<use x='180.971707' y='87.993906' xlink:href='#g2-64'/>
+<rect x='178.505856' y='93.663745' height='.55789' width='12.899852'/>
+<use x='178.505856' y='106.997046' xlink:href='#g2-64'/>
+<use x='186.474036' y='106.997046' xlink:href='#g2-116'/>
+<use x='192.601222' y='97.429622' xlink:href='#g1-106'/>
+<use x='198.80019' y='97.429622' xlink:href='#g2-32'/>
+<use x='208.179277' y='97.429622' xlink:href='#g3-40'/>
+<use x='213.490324' y='97.429622' xlink:href='#g2-116'/>
+<use x='218.42201' y='97.429622' xlink:href='#g3-41'/>
+<use x='223.733057' y='97.429622' xlink:href='#g1-105'/>
+<use x='233.031506' y='97.429622' xlink:href='#g3-61'/>
+<use x='251.068923' y='93.903964' xlink:href='#g3-94'/>
+<use x='247.527926' y='97.429622' xlink:href='#g2-72'/>
+<use x='259.920966' y='97.429622' xlink:href='#g1-106'/>
+<use x='266.119934' y='97.429622' xlink:href='#g2-32'/>
+<use x='275.499021' y='97.429622' xlink:href='#g3-40'/>
+<use x='280.810068' y='97.429622' xlink:href='#g2-116'/>
+<use x='285.741754' y='97.429622' xlink:href='#g3-41'/>
+<use x='291.052801' y='97.429622' xlink:href='#g1-105'/>
+<use x='296.476924' y='97.429622' xlink:href='#g2-58'/>
+</g>
+</svg> \ No newline at end of file
diff --git a/_images/svg_image.svg b/_images/svg_image.svg
new file mode 100644
index 000000000..5405f85b8
--- /dev/null
+++ b/_images/svg_image.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- originate: https://commons.wikimedia.org/wiki/File:Variable_Resistor.svg -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ version="1.1" baseProfile="full"
+ width="70px" height="40px" viewBox="0 0 700 400">
+ <line x1="0" y1="200" x2="700" y2="200" stroke="black" stroke-width="20px"/>
+ <rect x="100" y="100" width="500" height="200" fill="white" stroke="black" stroke-width="20px"/>
+ <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
+ <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
+</svg>
diff --git a/_images/translation.svg b/_images/translation.svg
new file mode 100644
index 000000000..71f4172b5
--- /dev/null
+++ b/_images/translation.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="999px" preserveAspectRatio="none" style="width:1018px;height:999px;background:#FFFFFF;" version="1.1" viewBox="0 0 1018 999" width="1018px" zoomAndPan="magnify"><defs><filter height="300%" id="flwgy9xrajsm" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FFFFFF" filter="url(#flwgy9xrajsm)" height="351.8594" style="stroke:#000000;stroke-width:2.0;" width="991" x="10" y="116.7266"/><rect fill="#FFFFFF" filter="url(#flwgy9xrajsm)" height="320.7266" style="stroke:#000000;stroke-width:2.0;" width="971" x="20" y="140.8594"/><rect fill="#FFFFFF" filter="url(#flwgy9xrajsm)" height="245.3281" style="stroke:#000000;stroke-width:2.0;" width="555" x="426" y="209.2578"/><rect fill="#FFFFFF" filter="url(#flwgy9xrajsm)" height="324.7266" style="stroke:#000000;stroke-width:2.0;" width="848" x="143" y="525.7188"/><rect fill="#FFFFFF" filter="url(#flwgy9xrajsm)" height="245.3281" style="stroke:#000000;stroke-width:2.0;" width="828" x="153" y="549.8516"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="91" x2="91" y1="56.5938" y2="939.7109"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="270" x2="270" y1="56.5938" y2="939.7109"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="514" x2="514" y1="56.5938" y2="939.7109"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="738" x2="738" y1="56.5938" y2="939.7109"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="899" x2="899" y1="56.5938" y2="939.7109"/><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="30.2969" style="stroke:#A80036;stroke-width:1.5;" width="119" x="30" y="21.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="105" x="37" y="41.292">master branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="30.2969" style="stroke:#A80036;stroke-width:1.5;" width="119" x="30" y="938.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="105" x="37" y="958.7061">master branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="30.2969" style="stroke:#A80036;stroke-width:1.5;" width="211" x="163" y="21.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="197" x="170" y="41.292">translations_update branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="30.2969" style="stroke:#A80036;stroke-width:1.5;" width="211" x="163" y="938.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="197" x="170" y="958.7061">translations_update branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="30.2969" style="stroke:#A80036;stroke-width:1.5;" width="153" x="436" y="21.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="443" y="41.292">translations branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="30.2969" style="stroke:#A80036;stroke-width:1.5;" width="153" x="436" y="938.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="443" y="958.7061">translations branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="46.5938" style="stroke:#A80036;stroke-width:1.5;" width="153" x="660" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="120" x="676.5" y="24.9951">weblate clone of</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="667" y="41.292">translations branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="46.5938" style="stroke:#A80036;stroke-width:1.5;" width="153" x="660" y="938.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="120" x="676.5" y="958.7061">weblate clone of</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="667" y="975.0029">translations branch</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="46.5938" style="stroke:#A80036;stroke-width:1.5;" width="140" x="827" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="58" x="868" y="24.9951">weblate</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="122" x="834" y="41.292">pending changes</text><rect fill="#FEFECE" filter="url(#flwgy9xrajsm)" height="46.5938" style="stroke:#A80036;stroke-width:1.5;" width="140" x="827" y="938.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="58" x="868" y="958.7061">weblate</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="122" x="834" y="975.0029">pending changes</text><rect fill="#EEEEEE" filter="url(#flwgy9xrajsm)" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="1011" x="0" y="87.1602"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1011" y1="87.1602" y2="87.1602"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1011" y1="90.1602" y2="90.1602"/><rect fill="#EEEEEE" filter="url(#flwgy9xrajsm)" height="23.1328" style="stroke:#000000;stroke-width:2.0;" width="230" x="390.5" y="76.5938"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="211" x="396.5" y="92.6606">for each commit on master</text><path d="M10,116.7266 L314,116.7266 L314,123.7266 L304,133.7266 L10,133.7266 L10,116.7266 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.0;"/><rect fill="none" height="351.8594" style="stroke:#000000;stroke-width:2.0;" width="991" x="10" y="116.7266"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="259" x="25" y="129.7935">.github/workflows/integration.yml</text><path d="M20,140.8594 L309,140.8594 L309,147.8594 L299,157.8594 L20,157.8594 L20,140.8594 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.0;"/><rect fill="none" height="320.7266" style="stroke:#000000;stroke-width:2.0;" width="971" x="20" y="140.8594"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="244" x="35" y="153.9263">make weblate.push.translations</text><polygon fill="#A80036" points="502.5,190.2578,512.5,194.2578,502.5,198.2578,506.5,194.2578" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="91.5" x2="508.5" y1="194.2578" y2="194.2578"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="101" x="98.5" y="174.0591">pybabel extract</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="399" x="98.5" y="189.1919">extract messages, store messages.pot on translations branch</text><path d="M426,209.2578 L492,209.2578 L492,216.2578 L482,226.2578 L426,226.2578 L426,209.2578 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.0;"/><rect fill="none" height="245.3281" style="stroke:#000000;stroke-width:2.0;" width="555" x="426" y="209.2578"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="21" x="441" y="222.3247">alt</text><text fill="#000000" font-family="sans-serif" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="299" x="507" y="221.4683">[if there are some changes in messages.pot]</text><polygon fill="#FBFB77" filter="url(#flwgy9xrajsm)" points="711,231.3906,765,231.3906,775,242.3906,765,254.3906,711,254.3906,701,242.3906,711,231.3906" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="50" x="713" y="247.4575">wlc lock</text><polygon fill="#A80036" points="726.5,276.6563,736.5,280.6563,726.5,284.6563,730.5,280.6563" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="514.5" x2="732.5" y1="280.6563" y2="280.6563"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="47" x="521.5" y="275.5903">wlc pull</text><polygon fill="#A80036" points="749.5,305.7891,739.5,309.7891,749.5,313.7891,745.5,309.7891" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="743.5" x2="898" y1="309.7891" y2="309.7891"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="74" x="755.5" y="304.7231">wlc commit</text><polygon fill="#A80036" points="525.5,334.9219,515.5,338.9219,525.5,342.9219,521.5,338.9219" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="519.5" x2="737.5" y1="338.9219" y2="338.9219"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="196" x="531.5" y="333.856">git merge weblate/translations</text><polygon fill="#A80036" points="726.5,409.4531,736.5,413.4531,726.5,417.4531,730.5,413.4531" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="514.5" x2="732.5" y1="413.4531" y2="413.4531"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="200" x="521.5" y="362.9888">pybabel update (messages.po)</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="163" x="521.5" y="378.1216">git add searx/translations</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="69" x="521.5" y="393.2544">git commit</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="51" x="521.5" y="408.3872">git push</text><polygon fill="#FBFB77" filter="url(#flwgy9xrajsm)" points="703,426.4531,773,426.4531,783,437.4531,773,449.4531,703,449.4531,693,437.4531,703,426.4531" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="705" y="442.52">wlc unlock</text><rect fill="#EEEEEE" filter="url(#flwgy9xrajsm)" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="1011" x="0" y="496.1523"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1011" y1="496.1523" y2="496.1523"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1011" y1="499.1523" y2="499.1523"/><rect fill="#EEEEEE" filter="url(#flwgy9xrajsm)" height="23.1328" style="stroke:#000000;stroke-width:2.0;" width="111" x="450" y="485.5859"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="92" x="456" y="501.6528">every Friday</text><path d="M143,525.7188 L513,525.7188 L513,532.7188 L503,542.7188 L143,542.7188 L143,525.7188 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.0;"/><rect fill="none" height="324.7266" style="stroke:#000000;stroke-width:2.0;" width="848" x="143" y="525.7188"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="325" x="158" y="538.7856">.github/workflows/translations-update.yml</text><path d="M153,549.8516 L465,549.8516 L465,556.8516 L455,566.8516 L153,566.8516 L153,549.8516 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.0;"/><rect fill="none" height="245.3281" style="stroke:#000000;stroke-width:2.0;" width="828" x="153" y="549.8516"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="267" x="168" y="562.9185">make weblate.translations.commit</text><polygon fill="#FBFB77" filter="url(#flwgy9xrajsm)" points="711,571.9844,765,571.9844,775,582.9844,765,594.9844,711,594.9844,701,582.9844,711,571.9844" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="50" x="713" y="588.0513">wlc lock</text><polygon fill="#A80036" points="726.5,617.25,736.5,621.25,726.5,625.25,730.5,621.25" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="514.5" x2="732.5" y1="621.25" y2="621.25"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="47" x="521.5" y="616.1841">wlc pull</text><polygon fill="#A80036" points="749.5,646.3828,739.5,650.3828,749.5,654.3828,745.5,650.3828" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="743.5" x2="898" y1="650.3828" y2="650.3828"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="74" x="755.5" y="645.3169">wlc commit</text><polygon fill="#A80036" points="525.5,675.5156,515.5,679.5156,525.5,683.5156,521.5,679.5156" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="519.5" x2="737.5" y1="679.5156" y2="679.5156"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="196" x="531.5" y="674.4497">git merge weblate/translations</text><polygon fill="#A80036" points="281.5,750.0469,271.5,754.0469,281.5,758.0469,277.5,754.0469" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="275.5" x2="513.5" y1="754.0469" y2="754.0469"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="105" x="287.5" y="703.5825">pybabel compile</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="134" x="287.5" y="718.7153">cp searx/translations</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="44" x="287.5" y="733.8481">git add</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="69" x="287.5" y="748.981">git commit</text><polygon fill="#FBFB77" filter="url(#flwgy9xrajsm)" points="703,767.0469,773,767.0469,783,778.0469,773,790.0469,703,790.0469,693,778.0469,703,767.0469" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="705" y="783.1138">wlc unlock</text><polygon fill="#FBFB77" filter="url(#flwgy9xrajsm)" points="175,807.1797,365,807.1797,375,826.1797,365,845.1797,175,845.1797,165,826.1797,175,807.1797" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="186" x="177" y="823.2466">create or update pull request</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="135" x="177" y="838.3794">"Update translations"</text><rect fill="#EEEEEE" filter="url(#flwgy9xrajsm)" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="1011" x="0" y="878.0117"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1011" y1="878.0117" y2="878.0117"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1011" y1="881.0117" y2="881.0117"/><rect fill="#EEEEEE" filter="url(#flwgy9xrajsm)" height="23.1328" style="stroke:#000000;stroke-width:2.0;" width="168" x="421.5" y="867.4453"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="149" x="427.5" y="883.5122">developper's review</text><polygon fill="#A80036" points="102.5,917.7109,92.5,921.7109,102.5,925.7109,98.5,921.7109" style="stroke:#A80036;stroke-width:1.0;"/><line style="stroke:#A80036;stroke-width:1.0;" x1="96.5" x2="269.5" y1="921.7109" y2="921.7109"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="121" x="108.5" y="916.645">merge pull request</text><!--MD5=[5c6c15370b11f873d07f34ae239ca6ad]
+@startuml
+participant "master branch" as master
+participant "translations_update branch" as translations_update
+participant "translations branch" as translations
+participant "weblate clone of\ntranslations branch" as weblate
+participant "weblate\npending changes " as weblate_change
+
+== for each commit on master ==
+
+group .github/workflows/integration.yml
+ group make weblate.push.translations
+ master -> translations: pybabel extract\nextract messages, store messages.pot on translations branch
+ alt if there are some changes in messages.pot
+ hnote over weblate : wlc lock
+ translations -> weblate: wlc pull
+ weblate_change -> weblate: wlc commit
+ weblate -> translations: git merge weblate/translations
+ translations -> weblate: pybabel update (messages.po)\ngit add searx/translations\ngit commit\ngit push
+ hnote over weblate : wlc unlock
+ end
+ end
+end
+
+== every Friday ==
+
+group .github/workflows/translations-update.yml
+ group make weblate.translations.commit
+ hnote over weblate : wlc lock
+ translations -> weblate: wlc pull
+ weblate_change -> weblate: wlc commit
+ weblate -> translations: git merge weblate/translations
+ translations -> translations_update: pybabel compile\ncp searx/translations\ngit add\ngit commit
+ hnote over weblate : wlc unlock
+ end
+ hnote over translations_update : create or update pull request\n"Update translations"
+end
+
+== developper's review ==
+
+translations_update -> master: merge pull request
+@enduml
+
+See
+https://plantuml.com/en/sequence-diagram
+https://www.planttext.com
+--></g></svg> \ No newline at end of file
diff --git a/_modules/index.html b/_modules/index.html
new file mode 100644
index 000000000..b473b48a2
--- /dev/null
+++ b/_modules/index.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Overview: module code &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Overview: module code</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>All modules for which code is available</h1>
+<ul><li><a href="searx/autocomplete.html">searx.autocomplete</a></li>
+<li><a href="searx/babel_extract.html">searx.babel_extract</a></li>
+<li><a href="searx/botdetection/_helpers.html">searx.botdetection._helpers</a></li>
+<li><a href="searx/botdetection/config.html">searx.botdetection.config</a></li>
+<li><a href="searx/botdetection/ip_lists.html">searx.botdetection.ip_lists</a></li>
+<li><a href="searx/botdetection/link_token.html">searx.botdetection.link_token</a></li>
+<li><a href="searx/enginelib.html">searx.enginelib</a></li>
+<ul><li><a href="searx/enginelib/traits.html">searx.enginelib.traits</a></li>
+</ul><li><a href="searx/engines.html">searx.engines</a></li>
+<ul><li><a href="searx/engines/annas_archive.html">searx.engines.annas_archive</a></li>
+<li><a href="searx/engines/archlinux.html">searx.engines.archlinux</a></li>
+<li><a href="searx/engines/bing.html">searx.engines.bing</a></li>
+<li><a href="searx/engines/bing_images.html">searx.engines.bing_images</a></li>
+<li><a href="searx/engines/bing_news.html">searx.engines.bing_news</a></li>
+<li><a href="searx/engines/bing_videos.html">searx.engines.bing_videos</a></li>
+<li><a href="searx/engines/brave.html">searx.engines.brave</a></li>
+<li><a href="searx/engines/command.html">searx.engines.command</a></li>
+<li><a href="searx/engines/dailymotion.html">searx.engines.dailymotion</a></li>
+<li><a href="searx/engines/demo_offline.html">searx.engines.demo_offline</a></li>
+<li><a href="searx/engines/demo_online.html">searx.engines.demo_online</a></li>
+<li><a href="searx/engines/duckduckgo.html">searx.engines.duckduckgo</a></li>
+<li><a href="searx/engines/duckduckgo_definitions.html">searx.engines.duckduckgo_definitions</a></li>
+<li><a href="searx/engines/google.html">searx.engines.google</a></li>
+<li><a href="searx/engines/google_images.html">searx.engines.google_images</a></li>
+<li><a href="searx/engines/google_news.html">searx.engines.google_news</a></li>
+<li><a href="searx/engines/google_scholar.html">searx.engines.google_scholar</a></li>
+<li><a href="searx/engines/google_videos.html">searx.engines.google_videos</a></li>
+<li><a href="searx/engines/mrs.html">searx.engines.mrs</a></li>
+<li><a href="searx/engines/mullvad_leta.html">searx.engines.mullvad_leta</a></li>
+<li><a href="searx/engines/odysee.html">searx.engines.odysee</a></li>
+<li><a href="searx/engines/peertube.html">searx.engines.peertube</a></li>
+<li><a href="searx/engines/qwant.html">searx.engines.qwant</a></li>
+<li><a href="searx/engines/radio_browser.html">searx.engines.radio_browser</a></li>
+<li><a href="searx/engines/sepiasearch.html">searx.engines.sepiasearch</a></li>
+<li><a href="searx/engines/sqlite.html">searx.engines.sqlite</a></li>
+<li><a href="searx/engines/startpage.html">searx.engines.startpage</a></li>
+<li><a href="searx/engines/tineye.html">searx.engines.tineye</a></li>
+<li><a href="searx/engines/torznab.html">searx.engines.torznab</a></li>
+<li><a href="searx/engines/voidlinux.html">searx.engines.voidlinux</a></li>
+<li><a href="searx/engines/wikidata.html">searx.engines.wikidata</a></li>
+<li><a href="searx/engines/wikipedia.html">searx.engines.wikipedia</a></li>
+<li><a href="searx/engines/xpath.html">searx.engines.xpath</a></li>
+<li><a href="searx/engines/yahoo.html">searx.engines.yahoo</a></li>
+<li><a href="searx/engines/zlibrary.html">searx.engines.zlibrary</a></li>
+</ul><li><a href="searx/exceptions.html">searx.exceptions</a></li>
+<li><a href="searx/infopage.html">searx.infopage</a></li>
+<li><a href="searx/limiter.html">searx.limiter</a></li>
+<li><a href="searx/locales.html">searx.locales</a></li>
+<li><a href="searx/plugins/unit_converter.html">searx.plugins.unit_converter</a></li>
+<li><a href="searx/redislib.html">searx.redislib</a></li>
+<li><a href="searx/search.html">searx.search</a></li>
+<ul><li><a href="searx/search/models.html">searx.search.models</a></li>
+<li><a href="searx/search/processors/abstract.html">searx.search.processors.abstract</a></li>
+<li><a href="searx/search/processors/offline.html">searx.search.processors.offline</a></li>
+<li><a href="searx/search/processors/online.html">searx.search.processors.online</a></li>
+<li><a href="searx/search/processors/online_currency.html">searx.search.processors.online_currency</a></li>
+<li><a href="searx/search/processors/online_dictionary.html">searx.search.processors.online_dictionary</a></li>
+<li><a href="searx/search/processors/online_url_search.html">searx.search.processors.online_url_search</a></li>
+</ul><li><a href="searx/utils.html">searx.utils</a></li>
+<li><a href="searxng_extra/standalone_searx.html">searxng_extra.standalone_searx</a></li>
+<li><a href="searxng_extra/update/update_engine_descriptions.html">searxng_extra.update.update_engine_descriptions</a></li>
+<li><a href="searxng_extra/update/update_engine_traits.html">searxng_extra.update.update_engine_traits</a></li>
+<li><a href="searxng_extra/update/update_external_bangs.html">searxng_extra.update.update_external_bangs</a></li>
+<li><a href="searxng_extra/update/update_locales.html">searxng_extra.update.update_locales</a></li>
+<li><a href="searxng_extra/update/update_pygments.html">searxng_extra.update.update_pygments</a></li>
+</ul>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/autocomplete.html b/_modules/searx/autocomplete.html
new file mode 100644
index 000000000..f6c3473e7
--- /dev/null
+++ b/_modules/searx/autocomplete.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.autocomplete &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.autocomplete</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.autocomplete</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;This module implements functions needed for the autocompleter.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=use-dict-literal</span>
+
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span><span class="p">,</span> <span class="n">quote_plus</span>
+
+<span class="kn">import</span> <span class="nn">lxml</span>
+<span class="kn">from</span> <span class="nn">httpx</span> <span class="kn">import</span> <span class="n">HTTPError</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">settings</span>
+<span class="kn">from</span> <span class="nn">searx.engines</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">engines</span><span class="p">,</span>
+ <span class="n">google</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="k">as</span> <span class="n">http_get</span><span class="p">,</span> <span class="n">post</span> <span class="k">as</span> <span class="n">http_post</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineResponseException</span>
+
+
+<span class="k">def</span> <span class="nf">update_kwargs</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="k">if</span> <span class="s1">&#39;timeout&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
+ <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;timeout&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;outgoing&#39;</span><span class="p">][</span><span class="s1">&#39;request_timeout&#39;</span><span class="p">]</span>
+ <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
+
+
+<span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="n">update_kwargs</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">http_get</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="n">update_kwargs</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">http_post</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">brave</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">_lang</span><span class="p">):</span>
+ <span class="c1"># brave search autocompleter</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://search.brave.com/api/suggest?&#39;</span>
+ <span class="n">url</span> <span class="o">+=</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">})</span>
+ <span class="n">country</span> <span class="o">=</span> <span class="s1">&#39;all&#39;</span>
+ <span class="c1"># if lang in _brave:</span>
+ <span class="c1"># country = lang</span>
+ <span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;cookies&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;country&#39;</span><span class="p">:</span> <span class="n">country</span><span class="p">}}</span>
+ <span class="n">resp</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="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="n">data</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="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">dbpedia</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">_lang</span><span class="p">):</span>
+ <span class="c1"># dbpedia autocompleter, no HTTPS</span>
+ <span class="n">autocomplete_url</span> <span class="o">=</span> <span class="s1">&#39;https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?&#39;</span>
+
+ <span class="n">response</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">autocomplete_url</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">QueryString</span><span class="o">=</span><span class="n">query</span><span class="p">)))</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">etree</span><span class="o">.</span><span class="n">fromstring</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="n">results</span> <span class="o">=</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//Result/Label//text()&#39;</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">duckduckgo</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Autocomplete from DuckDuckGo. Supports DuckDuckGo&#39;s languages&quot;&quot;&quot;</span>
+
+ <span class="n">traits</span> <span class="o">=</span> <span class="n">engines</span><span class="p">[</span><span class="s1">&#39;duckduckgo&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">traits</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;kl&#39;</span><span class="p">:</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">),</span>
+ <span class="p">}</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://duckduckgo.com/ac/?type=list&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+ <span class="n">resp</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">ret_val</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="n">j</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="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">ret_val</span> <span class="o">=</span> <span class="n">j</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">ret_val</span>
+
+
+<div class="viewcode-block" id="google_complete">
+<a class="viewcode-back" href="../../dev/engines/online/google.html#searx.autocomplete.google_complete">[docs]</a>
+<span class="k">def</span> <span class="nf">google_complete</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Autocomplete from Google. Supports Google&#39;s languages and subdomains</span>
+<span class="sd"> (:py:obj:`searx.engines.google.get_google_info`) by using the async REST</span>
+<span class="sd"> API::</span>
+
+<span class="sd"> https://{subdomain}/complete/search?{args}</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">google_info</span> <span class="o">=</span> <span class="n">google</span><span class="o">.</span><span class="n">get_google_info</span><span class="p">({</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">:</span> <span class="n">sxng_locale</span><span class="p">},</span> <span class="n">engines</span><span class="p">[</span><span class="s1">&#39;google&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">traits</span><span class="p">)</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://</span><span class="si">{subdomain}</span><span class="s1">/complete/search?</span><span class="si">{args}</span><span class="s1">&#39;</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;client&#39;</span><span class="p">:</span> <span class="s1">&#39;gws-wiz&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;hl&#39;</span><span class="p">:</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;hl&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">subdomain</span><span class="o">=</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">],</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="n">json_txt</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">[</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;[&#39;</span><span class="p">)</span> <span class="p">:</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;]&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">json_txt</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">text_content</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<div class="viewcode-block" id="mwmbl">
+<a class="viewcode-back" href="../../dev/engines/online/mwmbl.html#searx.autocomplete.mwmbl">[docs]</a>
+<span class="k">def</span> <span class="nf">mwmbl</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">_lang</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Autocomplete from Mwmbl_.&quot;&quot;&quot;</span>
+
+ <span class="c1"># mwmbl autocompleter</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://api.mwmbl.org/search/complete?</span><span class="si">{query}</span><span class="s1">&#39;</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">})))</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
+
+ <span class="c1"># results starting with `go:` are direct urls and not useful for auto completion</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">result</span> <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">result</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;go: &quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">result</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;search: &quot;</span><span class="p">)]</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">seznam</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">_lang</span><span class="p">):</span>
+ <span class="c1"># seznam search autocompleter</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://suggest.seznam.cz/fulltext/cs?</span><span class="si">{query}</span><span class="s1">&#39;</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span>
+ <span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span><span class="s1">&#39;phrase&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span> <span class="s1">&#39;cursorPosition&#39;</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">query</span><span class="p">),</span> <span class="s1">&#39;format&#39;</span><span class="p">:</span> <span class="s1">&#39;json-2&#39;</span><span class="p">,</span> <span class="s1">&#39;highlight&#39;</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;count&#39;</span><span class="p">:</span> <span class="s1">&#39;6&#39;</span><span class="p">}</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="n">data</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="k">return</span> <span class="p">[</span>
+ <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">part</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;text&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;text&#39;</span><span class="p">,</span> <span class="p">[])])</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;result&#39;</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;itemType&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;ItemType.TEXT&#39;</span>
+ <span class="p">]</span>
+
+
+<span class="k">def</span> <span class="nf">stract</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">_lang</span><span class="p">):</span>
+ <span class="c1"># stract autocompleter (beta)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;https://stract.com/beta/api/autosuggest?q=</span><span class="si">{</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">query</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">post</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="k">return</span> <span class="p">[</span><span class="n">suggestion</span><span class="p">[</span><span class="s1">&#39;raw&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">suggestion</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">json</span><span class="p">()]</span>
+
+
+<span class="k">def</span> <span class="nf">startpage</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Autocomplete from Startpage. Supports Startpage&#39;s languages&quot;&quot;&quot;</span>
+ <span class="n">lui</span> <span class="o">=</span> <span class="n">engines</span><span class="p">[</span><span class="s1">&#39;startpage&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="s1">&#39;english&#39;</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://startpage.com/suggestions?</span><span class="si">{query}</span><span class="s1">&#39;</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span> <span class="s1">&#39;segment&#39;</span><span class="p">:</span> <span class="s1">&#39;startpage.udog&#39;</span><span class="p">,</span> <span class="s1">&#39;lui&#39;</span><span class="p">:</span> <span class="n">lui</span><span class="p">})))</span>
+ <span class="n">data</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="k">return</span> <span class="p">[</span><span class="n">e</span><span class="p">[</span><span class="s1">&#39;text&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;suggestions&#39;</span><span class="p">,</span> <span class="p">[])</span> <span class="k">if</span> <span class="s1">&#39;text&#39;</span> <span class="ow">in</span> <span class="n">e</span><span class="p">]</span>
+
+
+<span class="k">def</span> <span class="nf">swisscows</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">_lang</span><span class="p">):</span>
+ <span class="c1"># swisscows autocompleter</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://swisscows.ch/api/suggest?</span><span class="si">{query}</span><span class="s1">&amp;itemsCount=5&#39;</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">})))</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">resp</span>
+
+
+<span class="k">def</span> <span class="nf">qwant</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Autocomplete from Qwant. Supports Qwant&#39;s regions.&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">engines</span><span class="p">[</span><span class="s1">&#39;qwant&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="s1">&#39;en_US&#39;</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://api.qwant.com/v3/suggest?</span><span class="si">{query}</span><span class="s1">&#39;</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span> <span class="s1">&#39;locale&#39;</span><span class="p">:</span> <span class="n">locale</span><span class="p">,</span> <span class="s1">&#39;version&#39;</span><span class="p">:</span> <span class="s1">&#39;2&#39;</span><span class="p">})))</span>
+
+ <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="n">data</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="k">if</span> <span class="n">data</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;success&#39;</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;items&#39;</span><span class="p">]:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">])</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">wikipedia</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Autocomplete from Wikipedia. Supports Wikipedia&#39;s languages (aka netloc).&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">eng_traits</span> <span class="o">=</span> <span class="n">engines</span><span class="p">[</span><span class="s1">&#39;wikipedia&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">traits</span>
+ <span class="n">wiki_lang</span> <span class="o">=</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span>
+ <span class="n">wiki_netloc</span> <span class="o">=</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">wiki_lang</span><span class="p">,</span> <span class="s1">&#39;en.wikipedia.org&#39;</span><span class="p">)</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://</span><span class="si">{wiki_netloc}</span><span class="s1">/w/api.php?</span><span class="si">{args}</span><span class="s1">&#39;</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;action&#39;</span><span class="p">:</span> <span class="s1">&#39;opensearch&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;format&#39;</span><span class="p">:</span> <span class="s1">&#39;json&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;formatversion&#39;</span><span class="p">:</span> <span class="s1">&#39;2&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;search&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;namespace&#39;</span><span class="p">:</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;limit&#39;</span><span class="p">:</span> <span class="s1">&#39;10&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">wiki_netloc</span><span class="o">=</span><span class="n">wiki_netloc</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="n">data</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="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">yandex</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">_lang</span><span class="p">):</span>
+ <span class="c1"># yandex autocompleter</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;https://suggest.yandex.com/suggest-ff.cgi?</span><span class="si">{0}</span><span class="s2">&quot;</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">urlencode</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">part</span><span class="o">=</span><span class="n">query</span><span class="p">))))</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">resp</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+
+<span class="n">backends</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;dbpedia&#39;</span><span class="p">:</span> <span class="n">dbpedia</span><span class="p">,</span>
+ <span class="s1">&#39;duckduckgo&#39;</span><span class="p">:</span> <span class="n">duckduckgo</span><span class="p">,</span>
+ <span class="s1">&#39;google&#39;</span><span class="p">:</span> <span class="n">google_complete</span><span class="p">,</span>
+ <span class="s1">&#39;mwmbl&#39;</span><span class="p">:</span> <span class="n">mwmbl</span><span class="p">,</span>
+ <span class="s1">&#39;seznam&#39;</span><span class="p">:</span> <span class="n">seznam</span><span class="p">,</span>
+ <span class="s1">&#39;startpage&#39;</span><span class="p">:</span> <span class="n">startpage</span><span class="p">,</span>
+ <span class="s1">&#39;stract&#39;</span><span class="p">:</span> <span class="n">stract</span><span class="p">,</span>
+ <span class="s1">&#39;swisscows&#39;</span><span class="p">:</span> <span class="n">swisscows</span><span class="p">,</span>
+ <span class="s1">&#39;qwant&#39;</span><span class="p">:</span> <span class="n">qwant</span><span class="p">,</span>
+ <span class="s1">&#39;wikipedia&#39;</span><span class="p">:</span> <span class="n">wikipedia</span><span class="p">,</span>
+ <span class="s1">&#39;brave&#39;</span><span class="p">:</span> <span class="n">brave</span><span class="p">,</span>
+ <span class="s1">&#39;yandex&#39;</span><span class="p">:</span> <span class="n">yandex</span><span class="p">,</span>
+<span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">search_autocomplete</span><span class="p">(</span><span class="n">backend_name</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">):</span>
+ <span class="n">backend</span> <span class="o">=</span> <span class="n">backends</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">backend_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">backend</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">backend</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">)</span>
+ <span class="k">except</span> <span class="p">(</span><span class="n">HTTPError</span><span class="p">,</span> <span class="n">SearxEngineResponseException</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">[]</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/babel_extract.html b/_modules/searx/babel_extract.html
new file mode 100644
index 000000000..6768bb9ff
--- /dev/null
+++ b/_modules/searx/babel_extract.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.babel_extract &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.babel_extract</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.babel_extract</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;This module implements the :origin:`searxng_msg &lt;babel.cfg&gt;` extractor to</span>
+<span class="sd">extract messages from:</span>
+
+<span class="sd">- :origin:`searx/searxng.msg`</span>
+
+<span class="sd">The ``searxng.msg`` files are selected by Babel_, see Babel&#39;s configuration in</span>
+<span class="sd">:origin:`babel.cfg`::</span>
+
+<span class="sd"> searxng_msg = searx.babel_extract.extract</span>
+<span class="sd"> ...</span>
+<span class="sd"> [searxng_msg: **/searxng.msg]</span>
+
+<span class="sd">A ``searxng.msg`` file is a python file that is *executed* by the</span>
+<span class="sd">:py:obj:`extract` function. Additional ``searxng.msg`` files can be added by:</span>
+
+<span class="sd">1. Adding a ``searxng.msg`` file in one of the SearXNG python packages and</span>
+<span class="sd">2. implement a method in :py:obj:`extract` that yields messages from this file.</span>
+
+<span class="sd">.. _Babel: https://babel.pocoo.org/en/latest/index.html</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="n">path</span>
+
+<span class="n">SEARXNG_MSG_FILE</span> <span class="o">=</span> <span class="s2">&quot;searxng.msg&quot;</span>
+<span class="n">_MSG_FILES</span> <span class="o">=</span> <span class="p">[</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">),</span> <span class="n">SEARXNG_MSG_FILE</span><span class="p">)]</span>
+
+
+<div class="viewcode-block" id="extract">
+<a class="viewcode-back" href="../../src/searx.babel_extract.html#searx.babel_extract.extract">[docs]</a>
+<span class="k">def</span> <span class="nf">extract</span><span class="p">(</span>
+ <span class="c1"># pylint: disable=unused-argument</span>
+ <span class="n">fileobj</span><span class="p">,</span>
+ <span class="n">keywords</span><span class="p">,</span>
+ <span class="n">comment_tags</span><span class="p">,</span>
+ <span class="n">options</span><span class="p">,</span>
+<span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Extract messages from ``searxng.msg`` files by a custom extractor_.</span>
+
+<span class="sd"> .. _extractor:</span>
+<span class="sd"> https://babel.pocoo.org/en/latest/messages.html#writing-extraction-methods</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">fileobj</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_MSG_FILES</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;don&#39;t know how to extract messages from </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">fileobj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="n">namespace</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">exec</span><span class="p">(</span><span class="n">fileobj</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="p">{},</span> <span class="n">namespace</span><span class="p">)</span> <span class="c1"># pylint: disable=exec-used</span>
+
+ <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">namespace</span><span class="p">[</span><span class="s1">&#39;__all__&#39;</span><span class="p">]:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">namespace</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">yield</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">[&#39;</span><span class="si">%s</span><span class="s2">&#39;]&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">k</span><span class="p">)]</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/botdetection/_helpers.html b/_modules/searx/botdetection/_helpers.html
new file mode 100644
index 000000000..d765afb35
--- /dev/null
+++ b/_modules/searx/botdetection/_helpers.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.botdetection._helpers &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.botdetection._helpers</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.botdetection._helpers</h1><div class="highlight"><pre>
+<span></span><span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="c1"># pylint: disable=missing-module-docstring, invalid-name</span>
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+
+<span class="kn">from</span> <span class="nn">ipaddress</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">IPv4Network</span><span class="p">,</span>
+ <span class="n">IPv6Network</span><span class="p">,</span>
+ <span class="n">IPv4Address</span><span class="p">,</span>
+ <span class="n">IPv6Address</span><span class="p">,</span>
+ <span class="n">ip_network</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">import</span> <span class="nn">flask</span>
+<span class="kn">import</span> <span class="nn">werkzeug</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">logger</span>
+<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">config</span>
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;botdetection&#39;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">dump_request</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Request</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">(</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">path</span>
+ <span class="o">+</span> <span class="s2">&quot; || X-Forwarded-For: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;X-Forwarded-For&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || X-Real-IP: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;X-Real-IP&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || form: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span>
+ <span class="o">+</span> <span class="s2">&quot; || Accept: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Accept&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || Accept-Language: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || Accept-Encoding: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Accept-Encoding&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || Content-Type: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Content-Type&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || Content-Length: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Content-Length&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || Connection: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Connection&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot; || User-Agent: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;User-Agent&#39;</span><span class="p">)</span>
+ <span class="p">)</span>
+
+
+<div class="viewcode-block" id="too_many_requests">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.too_many_requests">[docs]</a>
+<span class="k">def</span> <span class="nf">too_many_requests</span><span class="p">(</span><span class="n">network</span><span class="p">:</span> <span class="n">IPv4Network</span> <span class="o">|</span> <span class="n">IPv6Network</span><span class="p">,</span> <span class="n">log_msg</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">werkzeug</span><span class="o">.</span><span class="n">Response</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 a HTTP 429 response object and writes a ERROR message to the</span>
+<span class="sd"> &#39;botdetection&#39; logger. This function is used in part by the filter methods</span>
+<span class="sd"> to return the default ``Too Many Requests`` response.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;BLOCK </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">network</span><span class="o">.</span><span class="n">compressed</span><span class="p">,</span> <span class="n">log_msg</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">flask</span><span class="o">.</span><span class="n">make_response</span><span class="p">((</span><span class="s1">&#39;Too Many Requests&#39;</span><span class="p">,</span> <span class="mi">429</span><span class="p">))</span></div>
+
+
+
+<div class="viewcode-block" id="get_network">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.get_network">[docs]</a>
+<span class="k">def</span> <span class="nf">get_network</span><span class="p">(</span><span class="n">real_ip</span><span class="p">:</span> <span class="n">IPv4Address</span> <span class="o">|</span> <span class="n">IPv6Address</span><span class="p">,</span> <span class="n">cfg</span><span class="p">:</span> <span class="n">config</span><span class="o">.</span><span class="n">Config</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">IPv4Network</span> <span class="o">|</span> <span class="n">IPv6Network</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the (client) network of whether the real_ip is part of.&quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="n">real_ip</span><span class="o">.</span><span class="n">version</span> <span class="o">==</span> <span class="mi">6</span><span class="p">:</span>
+ <span class="n">prefix</span> <span class="o">=</span> <span class="n">cfg</span><span class="p">[</span><span class="s1">&#39;real_ip.ipv6_prefix&#39;</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">prefix</span> <span class="o">=</span> <span class="n">cfg</span><span class="p">[</span><span class="s1">&#39;real_ip.ipv4_prefix&#39;</span><span class="p">]</span>
+ <span class="n">network</span> <span class="o">=</span> <span class="n">ip_network</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">real_ip</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">prefix</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+ <span class="c1"># logger.debug(&quot;get_network(): %s&quot;, network.compressed)</span>
+ <span class="k">return</span> <span class="n">network</span></div>
+
+
+
+<span class="n">_logged_errors</span> <span class="o">=</span> <span class="p">[]</span>
+
+
+<span class="k">def</span> <span class="nf">_log_error_only_once</span><span class="p">(</span><span class="n">err_msg</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">err_msg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_logged_errors</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
+ <span class="n">_logged_errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="get_real_ip">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.get_real_ip">[docs]</a>
+<span class="k">def</span> <span class="nf">get_real_ip</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Request</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;Returns real IP of the request. Since not all proxies set all the HTTP</span>
+<span class="sd"> headers and incoming headers can be faked it may happen that the IP cannot</span>
+<span class="sd"> be determined correctly.</span>
+
+<span class="sd"> .. sidebar:: :py:obj:`flask.Request.remote_addr`</span>
+
+<span class="sd"> SearXNG uses Werkzeug&#39;s ProxyFix_ (with it default ``x_for=1``).</span>
+
+<span class="sd"> This function tries to get the remote IP in the order listed below,</span>
+<span class="sd"> additional some tests are done and if inconsistencies or errors are</span>
+<span class="sd"> detected, they are logged.</span>
+
+<span class="sd"> The remote IP of the request is taken from (first match):</span>
+
+<span class="sd"> - X-Forwarded-For_ header</span>
+<span class="sd"> - `X-real-IP header &lt;https://github.com/searxng/searxng/issues/1237#issuecomment-1147564516&gt;`__</span>
+<span class="sd"> - :py:obj:`flask.Request.remote_addr`</span>
+
+<span class="sd"> .. _ProxyFix:</span>
+<span class="sd"> https://werkzeug.palletsprojects.com/middleware/proxy_fix/</span>
+
+<span class="sd"> .. _X-Forwarded-For:</span>
+<span class="sd"> https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">forwarded_for</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;X-Forwarded-For&quot;</span><span class="p">)</span>
+ <span class="n">real_ip</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;X-Real-IP&#39;</span><span class="p">)</span>
+ <span class="n">remote_addr</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">remote_addr</span>
+ <span class="c1"># logger.debug(</span>
+ <span class="c1"># &quot;X-Forwarded-For: %s || X-Real-IP: %s || request.remote_addr: %s&quot;, forwarded_for, real_ip, remote_addr</span>
+ <span class="c1"># )</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">forwarded_for</span><span class="p">:</span>
+ <span class="n">_log_error_only_once</span><span class="p">(</span><span class="s2">&quot;X-Forwarded-For header is not set!&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">cfg</span> <span class="c1"># pylint: disable=import-outside-toplevel, cyclic-import</span>
+
+ <span class="n">forwarded_for</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">forwarded_for</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)]</span>
+ <span class="n">x_for</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">cfg</span><span class="p">[</span><span class="s1">&#39;real_ip.x_for&#39;</span><span class="p">]</span> <span class="c1"># type: ignore</span>
+ <span class="n">forwarded_for</span> <span class="o">=</span> <span class="n">forwarded_for</span><span class="p">[</span><span class="o">-</span><span class="nb">min</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">forwarded_for</span><span class="p">),</span> <span class="n">x_for</span><span class="p">)]</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">real_ip</span><span class="p">:</span>
+ <span class="n">_log_error_only_once</span><span class="p">(</span><span class="s2">&quot;X-Real-IP header is not set!&quot;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">forwarded_for</span> <span class="ow">and</span> <span class="n">real_ip</span> <span class="ow">and</span> <span class="n">forwarded_for</span> <span class="o">!=</span> <span class="n">real_ip</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;IP from X-Real-IP (</span><span class="si">%s</span><span class="s2">) is not equal to IP from X-Forwarded-For (</span><span class="si">%s</span><span class="s2">)&quot;</span><span class="p">,</span> <span class="n">real_ip</span><span class="p">,</span> <span class="n">forwarded_for</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">forwarded_for</span> <span class="ow">and</span> <span class="n">remote_addr</span> <span class="ow">and</span> <span class="n">forwarded_for</span> <span class="o">!=</span> <span class="n">remote_addr</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
+ <span class="s2">&quot;IP from WSGI environment (</span><span class="si">%s</span><span class="s2">) is not equal to IP from X-Forwarded-For (</span><span class="si">%s</span><span class="s2">)&quot;</span><span class="p">,</span> <span class="n">remote_addr</span><span class="p">,</span> <span class="n">forwarded_for</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">real_ip</span> <span class="ow">and</span> <span class="n">remote_addr</span> <span class="ow">and</span> <span class="n">real_ip</span> <span class="o">!=</span> <span class="n">remote_addr</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;IP from WSGI environment (</span><span class="si">%s</span><span class="s2">) is not equal to IP from X-Real-IP (</span><span class="si">%s</span><span class="s2">)&quot;</span><span class="p">,</span> <span class="n">remote_addr</span><span class="p">,</span> <span class="n">real_ip</span><span class="p">)</span>
+
+ <span class="n">request_ip</span> <span class="o">=</span> <span class="n">forwarded_for</span> <span class="ow">or</span> <span class="n">real_ip</span> <span class="ow">or</span> <span class="n">remote_addr</span> <span class="ow">or</span> <span class="s1">&#39;0.0.0.0&#39;</span>
+ <span class="c1"># logger.debug(&quot;get_real_ip() -&gt; %s&quot;, request_ip)</span>
+ <span class="k">return</span> <span class="n">request_ip</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/botdetection/config.html b/_modules/searx/botdetection/config.html
new file mode 100644
index 000000000..1d19c5e84
--- /dev/null
+++ b/_modules/searx/botdetection/config.html
@@ -0,0 +1,535 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.botdetection.config &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.botdetection.config</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.botdetection.config</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;Configuration class :py:class:`Config` with deep-update, schema validation</span>
+<span class="sd">and deprecated names.</span>
+
+<span class="sd">The :py:class:`Config` class implements a configuration that is based on</span>
+<span class="sd">structured dictionaries. The configuration schema is defined in a dictionary</span>
+<span class="sd">structure and the configuration data is given in a dictionary structure.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span>
+
+<span class="kn">import</span> <span class="nn">copy</span>
+<span class="kn">import</span> <span class="nn">typing</span>
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">pathlib</span>
+
+<span class="k">try</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">tomllib</span>
+
+ <span class="n">pytomlpp</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">USE_TOMLLIB</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">pytomlpp</span>
+
+ <span class="n">tomllib</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">USE_TOMLLIB</span> <span class="o">=</span> <span class="kc">False</span>
+
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Config&#39;</span><span class="p">,</span> <span class="s1">&#39;UNSET&#39;</span><span class="p">,</span> <span class="s1">&#39;SchemaIssue&#39;</span><span class="p">]</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">FALSE</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class of ``False`` singelton&quot;&quot;&quot;</span>
+
+ <span class="c1"># pylint: disable=multiple-statements</span>
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span>
+
+ <span class="k">def</span> <span class="fm">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="k">def</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">msg</span>
+
+ <span class="fm">__repr__</span> <span class="o">=</span> <span class="fm">__str__</span>
+
+
+<span class="n">UNSET</span> <span class="o">=</span> <span class="n">FALSE</span><span class="p">(</span><span class="s1">&#39;&lt;UNSET&gt;&#39;</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="SchemaIssue">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.SchemaIssue">[docs]</a>
+<span class="k">class</span> <span class="nc">SchemaIssue</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Exception to store and/or raise a message from a schema issue.&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s1">&#39;warn&#39;</span><span class="p">,</span> <span class="s1">&#39;invalid&#39;</span><span class="p">],</span> <span class="n">msg</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">level</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+
+ <span class="k">def</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="sa">f</span><span class="s2">&quot;[cfg schema </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">level</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">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span></div>
+
+
+
+<div class="viewcode-block" id="Config">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config">[docs]</a>
+<span class="k">class</span> <span class="nc">Config</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Base class used for configuration&quot;&quot;&quot;</span>
+
+ <span class="n">UNSET</span> <span class="o">=</span> <span class="n">UNSET</span>
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">from_toml</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">schema_file</span><span class="p">:</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">,</span> <span class="n">cfg_file</span><span class="p">:</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">,</span> <span class="n">deprecated</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Config</span><span class="p">:</span>
+
+ <span class="c1"># init schema</span>
+
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;load schema file: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">schema_file</span><span class="p">)</span>
+ <span class="n">cfg</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">(</span><span class="n">cfg_schema</span><span class="o">=</span><span class="n">toml_load</span><span class="p">(</span><span class="n">schema_file</span><span class="p">),</span> <span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">cfg_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;missing config file: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">cfg_file</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">cfg</span>
+
+ <span class="c1"># load configuration</span>
+
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;load config file: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">cfg_file</span><span class="p">)</span>
+ <span class="n">upd_cfg</span> <span class="o">=</span> <span class="n">toml_load</span><span class="p">(</span><span class="n">cfg_file</span><span class="p">)</span>
+
+ <span class="n">is_valid</span><span class="p">,</span> <span class="n">issue_list</span> <span class="o">=</span> <span class="n">cfg</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">upd_cfg</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">msg</span> <span class="ow">in</span> <span class="n">issue_list</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">is_valid</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;schema of </span><span class="si">{</span><span class="n">cfg_file</span><span class="si">}</span><span class="s2"> is invalid!&quot;</span><span class="p">)</span>
+ <span class="n">cfg</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">upd_cfg</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">cfg</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cfg_schema</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Dict</span><span class="p">,</span> <span class="n">deprecated</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">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="w"> </span><span class="sd">&quot;&quot;&quot;Construtor of class Config.</span>
+
+<span class="sd"> :param cfg_schema: Schema of the configuration</span>
+<span class="sd"> :param deprecated: dictionary that maps deprecated configuration names to a messages</span>
+
+<span class="sd"> These values are needed for validation, see :py:obj:`validate`.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cfg_schema</span> <span class="o">=</span> <span class="n">cfg_schema</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">deprecated</span> <span class="o">=</span> <span class="n">deprecated</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cfg</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">cfg_schema</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+
+<div class="viewcode-block" id="Config.validate">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config.validate">[docs]</a>
+ <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cfg</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Validation of dictionary ``cfg`` on :py:obj:`Config.SCHEMA`.</span>
+<span class="sd"> Validation is done by :py:obj:`validate`.&quot;&quot;&quot;</span>
+
+ <span class="k">return</span> <span class="n">validate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cfg_schema</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">deprecated</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Config.update">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config.update">[docs]</a>
+ <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">upd_cfg</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Update this configuration by ``upd_cfg``.&quot;&quot;&quot;</span>
+
+ <span class="n">dict_deepupdate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cfg</span><span class="p">,</span> <span class="n">upd_cfg</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Config.default">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config.default">[docs]</a>
+ <span class="k">def</span> <span class="nf">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns default value of field ``name`` in ``self.cfg_schema``.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">value</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cfg_schema</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Config.get">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config.get">[docs]</a>
+ <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">default</span><span class="p">:</span> <span class="n">Any</span> <span class="o">=</span> <span class="n">UNSET</span><span class="p">,</span> <span class="n">replace</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the value to which ``name`` points in the configuration.</span>
+
+<span class="sd"> If there is no such ``name`` in the config and the ``default`` is</span>
+<span class="sd"> :py:obj:`UNSET`, a :py:obj:`KeyError` is raised.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_parent_dict</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="n">parent</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">UNSET</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="n">default</span>
+
+ <span class="k">if</span> <span class="n">replace</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="n">val</span> <span class="o">%</span> <span class="bp">self</span>
+ <span class="k">return</span> <span class="n">val</span></div>
+
+
+<div class="viewcode-block" id="Config.set">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config.set">[docs]</a>
+ <span class="k">def</span> <span class="nf">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the value to which ``name`` points in the configuration.</span>
+
+<span class="sd"> If there is no such ``name`` in the config, a :py:obj:`KeyError` is</span>
+<span class="sd"> raised.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_parent_dict</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">parent</span><span class="p">[</span><span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="n">val</span></div>
+
+
+ <span class="k">def</span> <span class="nf">_get_parent_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="n">parent_name</span> <span class="o">=</span> <span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">parent_name</span><span class="p">:</span>
+ <span class="n">parent</span> <span class="o">=</span> <span class="n">value</span><span class="p">(</span><span class="n">parent_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cfg</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cfg</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">parent</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)):</span>
+ <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">parent_name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">parent</span>
+
+<div class="viewcode-block" id="Config.path">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config.path">[docs]</a>
+ <span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">UNSET</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get a :py:class:`pathlib.Path` object from a config string.&quot;&quot;&quot;</span>
+
+ <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">default</span>
+ <span class="k">return</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="Config.pyobj">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.config.Config.pyobj">[docs]</a>
+ <span class="k">def</span> <span class="nf">pyobj</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">UNSET</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get python object refered by full qualiffied name (FQN) in the config</span>
+<span class="sd"> string.&quot;&quot;&quot;</span>
+
+ <span class="n">fqn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">fqn</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">default</span>
+ <span class="p">(</span><span class="n">modulename</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">fqn</span><span class="p">)</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="n">m</span> <span class="o">=</span> <span class="nb">__import__</span><span class="p">(</span><span class="n">modulename</span><span class="p">,</span> <span class="p">{},</span> <span class="p">{},</span> <span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div>
+</div>
+
+
+
+<span class="k">def</span> <span class="nf">toml_load</span><span class="p">(</span><span class="n">file_name</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">USE_TOMLLIB</span><span class="p">:</span>
+ <span class="c1"># Python &gt;= 3.11</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">tomllib</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">tomllib</span><span class="o">.</span><span class="n">TOMLDecodeError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\t</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">file_name</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
+ <span class="k">raise</span>
+ <span class="c1"># fallback to pytomlpp for Python &lt; 3.11</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">pytomlpp</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">pytomlpp</span><span class="o">.</span><span class="n">DecodeError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\t</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">file_name</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
+ <span class="k">raise</span>
+
+
+<span class="c1"># working with dictionaries</span>
+
+
+<span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">data_dict</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the value to which ``name`` points in the ``dat_dict``.</span>
+
+<span class="sd"> .. code: python</span>
+
+<span class="sd"> &gt;&gt;&gt; data_dict = {</span>
+<span class="sd"> &quot;foo&quot;: {&quot;bar&quot;: 1 },</span>
+<span class="sd"> &quot;bar&quot;: {&quot;foo&quot;: 2 },</span>
+<span class="sd"> &quot;foobar&quot;: [1, 2, 3],</span>
+<span class="sd"> }</span>
+<span class="sd"> &gt;&gt;&gt; value(&#39;foobar&#39;, data_dict)</span>
+<span class="sd"> [1, 2, 3]</span>
+<span class="sd"> &gt;&gt;&gt; value(&#39;foo.bar&#39;, data_dict)</span>
+<span class="sd"> 1</span>
+<span class="sd"> &gt;&gt;&gt; value(&#39;foo.bar.xxx&#39;, data_dict)</span>
+<span class="sd"> &lt;UNSET&gt;</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">ret_val</span> <span class="o">=</span> <span class="n">data_dict</span>
+ <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ret_val</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="n">ret_val</span> <span class="o">=</span> <span class="n">ret_val</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">part</span><span class="p">,</span> <span class="n">UNSET</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">ret_val</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="k">return</span> <span class="n">ret_val</span>
+
+
+<span class="k">def</span> <span class="nf">validate</span><span class="p">(</span>
+ <span class="n">schema_dict</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Dict</span><span class="p">,</span> <span class="n">data_dict</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Dict</span><span class="p">,</span> <span class="n">deprecated</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">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="p">)</span> <span class="o">-&gt;</span> <span class="n">typing</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">list</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Deep validation of dictionary in ``data_dict`` against dictionary in</span>
+<span class="sd"> ``schema_dict``. Argument deprecated is a dictionary that maps deprecated</span>
+<span class="sd"> configuration names to a messages::</span>
+
+<span class="sd"> deprecated = {</span>
+<span class="sd"> &quot;foo.bar&quot; : &quot;config &#39;foo.bar&#39; is deprecated, use &#39;bar.foo&#39;&quot;,</span>
+<span class="sd"> &quot;...&quot; : &quot;...&quot;</span>
+<span class="sd"> }</span>
+
+<span class="sd"> The function returns a python tuple ``(is_valid, issue_list)``:</span>
+
+<span class="sd"> ``is_valid``:</span>
+<span class="sd"> A bool value indicating ``data_dict`` is valid or not.</span>
+
+<span class="sd"> ``issue_list``:</span>
+<span class="sd"> A list of messages (:py:obj:`SchemaIssue`) from the validation::</span>
+
+<span class="sd"> [schema warn] data_dict: deprecated &#39;fontlib.foo&#39;: &lt;DEPRECATED[&#39;foo.bar&#39;]&gt;</span>
+<span class="sd"> [schema invalid] data_dict: key unknown &#39;fontlib.foo&#39;</span>
+<span class="sd"> [schema invalid] data_dict: type mismatch &#39;fontlib.foo&#39;: expected ..., is ...</span>
+
+<span class="sd"> If ``schema_dict`` or ``data_dict`` is not a dictionary type a</span>
+<span class="sd"> :py:obj:`SchemaIssue` is raised.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">names</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">is_valid</span> <span class="o">=</span> <span class="kc">True</span>
+ <span class="n">issue_list</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema_dict</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SchemaIssue</span><span class="p">(</span><span class="s1">&#39;invalid&#39;</span><span class="p">,</span> <span class="s2">&quot;schema_dict is not a dict type&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data_dict</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SchemaIssue</span><span class="p">(</span><span class="s1">&#39;invalid&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;data_dict issue</span><span class="si">{</span><span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span><span class="si">}</span><span class="s2"> is not a dict type&quot;</span><span class="p">)</span>
+
+ <span class="n">is_valid</span><span class="p">,</span> <span class="n">issue_list</span> <span class="o">=</span> <span class="n">_validate</span><span class="p">(</span><span class="n">names</span><span class="p">,</span> <span class="n">issue_list</span><span class="p">,</span> <span class="n">schema_dict</span><span class="p">,</span> <span class="n">data_dict</span><span class="p">,</span> <span class="n">deprecated</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">is_valid</span><span class="p">,</span> <span class="n">issue_list</span>
+
+
+<span class="k">def</span> <span class="nf">_validate</span><span class="p">(</span>
+ <span class="n">names</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">List</span><span class="p">,</span>
+ <span class="n">issue_list</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">List</span><span class="p">,</span>
+ <span class="n">schema_dict</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Dict</span><span class="p">,</span>
+ <span class="n">data_dict</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Dict</span><span class="p">,</span>
+ <span class="n">deprecated</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">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="p">)</span> <span class="o">-&gt;</span> <span class="n">typing</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">List</span><span class="p">]:</span>
+
+ <span class="n">is_valid</span> <span class="o">=</span> <span class="kc">True</span>
+
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">data_value</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+
+ <span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span>
+
+ <span class="n">deprecated_msg</span> <span class="o">=</span> <span class="n">deprecated</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="c1"># print(&quot;XXX %s: key %s // data_value: %s&quot; % (name, key, data_value))</span>
+ <span class="k">if</span> <span class="n">deprecated_msg</span><span class="p">:</span>
+ <span class="n">issue_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SchemaIssue</span><span class="p">(</span><span class="s1">&#39;warn&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;data_dict &#39;</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39;: deprecated - </span><span class="si">{</span><span class="n">deprecated_msg</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">))</span>
+
+ <span class="n">schema_value</span> <span class="o">=</span> <span class="n">value</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">schema_dict</span><span class="p">)</span>
+ <span class="c1"># print(&quot;YYY %s: key %s // schema_value: %s&quot; % (name, key, schema_value))</span>
+ <span class="k">if</span> <span class="n">schema_value</span> <span class="ow">is</span> <span class="n">UNSET</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">deprecated_msg</span><span class="p">:</span>
+ <span class="n">issue_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SchemaIssue</span><span class="p">(</span><span class="s1">&#39;invalid&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;data_dict &#39;</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39;: key unknown in schema_dict&quot;</span><span class="p">))</span>
+ <span class="n">is_valid</span> <span class="o">=</span> <span class="kc">False</span>
+
+ <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">schema_value</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">type</span><span class="p">(</span><span class="n">data_value</span><span class="p">):</span> <span class="c1"># pylint: disable=unidiomatic-typecheck</span>
+ <span class="n">issue_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="n">SchemaIssue</span><span class="p">(</span>
+ <span class="s1">&#39;invalid&#39;</span><span class="p">,</span>
+ <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;data_dict: type mismatch &#39;</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39;:&quot;</span> <span class="sa">f</span><span class="s2">&quot; expected </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">schema_value</span><span class="p">)</span><span class="si">}</span><span class="s2">, is: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">data_value</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">),</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+ <span class="n">is_valid</span> <span class="o">=</span> <span class="kc">False</span>
+
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data_value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="n">_valid</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">_validate</span><span class="p">(</span><span class="n">names</span><span class="p">,</span> <span class="n">issue_list</span><span class="p">,</span> <span class="n">schema_dict</span><span class="p">,</span> <span class="n">data_value</span><span class="p">,</span> <span class="n">deprecated</span><span class="p">)</span>
+ <span class="n">is_valid</span> <span class="o">=</span> <span class="n">is_valid</span> <span class="ow">and</span> <span class="n">_valid</span>
+ <span class="n">names</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
+
+ <span class="k">return</span> <span class="n">is_valid</span><span class="p">,</span> <span class="n">issue_list</span>
+
+
+<span class="k">def</span> <span class="nf">dict_deepupdate</span><span class="p">(</span><span class="n">base_dict</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">upd_dict</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">names</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Deep-update of dictionary in ``base_dict`` by dictionary in ``upd_dict``.</span>
+
+<span class="sd"> For each ``upd_key`` &amp; ``upd_val`` pair in ``upd_dict``:</span>
+
+<span class="sd"> 0. If types of ``base_dict[upd_key]`` and ``upd_val`` do not match raise a</span>
+<span class="sd"> :py:obj:`TypeError`.</span>
+
+<span class="sd"> 1. If ``base_dict[upd_key]`` is a dict: recursively deep-update it by ``upd_val``.</span>
+
+<span class="sd"> 2. If ``base_dict[upd_key]`` not exist: set ``base_dict[upd_key]`` from a</span>
+<span class="sd"> (deep-) copy of ``upd_val``.</span>
+
+<span class="sd"> 3. If ``upd_val`` is a list, extend list in ``base_dict[upd_key]`` by the</span>
+<span class="sd"> list in ``upd_val``.</span>
+
+<span class="sd"> 4. If ``upd_val`` is a set, update set in ``base_dict[upd_key]`` by set in</span>
+<span class="sd"> ``upd_val``.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-branches</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base_dict</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;argument &#39;base_dict&#39; is not a ditionary type&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">upd_dict</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;argument &#39;upd_dict&#39; is not a ditionary type&quot;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">names</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">names</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">upd_key</span><span class="p">,</span> <span class="n">upd_val</span> <span class="ow">in</span> <span class="n">upd_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="c1"># For each upd_key &amp; upd_val pair in upd_dict:</span>
+
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">upd_val</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+
+ <span class="k">if</span> <span class="n">upd_key</span> <span class="ow">in</span> <span class="n">base_dict</span><span class="p">:</span>
+ <span class="c1"># if base_dict[upd_key] exists, recursively deep-update it</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">],</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;type mismatch </span><span class="si">{</span><span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span><span class="si">}</span><span class="s2">: is not a dict type in base_dict&quot;</span><span class="p">)</span>
+ <span class="n">dict_deepupdate</span><span class="p">(</span>
+ <span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">],</span>
+ <span class="n">upd_val</span><span class="p">,</span>
+ <span class="n">names</span>
+ <span class="o">+</span> <span class="p">[</span>
+ <span class="n">upd_key</span><span class="p">,</span>
+ <span class="p">],</span>
+ <span class="p">)</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># if base_dict[upd_key] not exist, set base_dict[upd_key] from deepcopy of upd_val</span>
+ <span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">upd_val</span><span class="p">)</span>
+
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">upd_val</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+
+ <span class="k">if</span> <span class="n">upd_key</span> <span class="ow">in</span> <span class="n">base_dict</span><span class="p">:</span>
+ <span class="c1"># if base_dict[upd_key] exists, base_dict[up_key] is extended by</span>
+ <span class="c1"># the list from upd_val</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">],</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;type mismatch </span><span class="si">{</span><span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span><span class="si">}</span><span class="s2">: is not a list type in base_dict&quot;</span><span class="p">)</span>
+ <span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">]</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">upd_val</span><span class="p">)</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># if base_dict[upd_key] doesn&#39;t exists, set base_dict[key] from a deepcopy of the</span>
+ <span class="c1"># list in upd_val.</span>
+ <span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">upd_val</span><span class="p">)</span>
+
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">upd_val</span><span class="p">,</span> <span class="nb">set</span><span class="p">):</span>
+
+ <span class="k">if</span> <span class="n">upd_key</span> <span class="ow">in</span> <span class="n">base_dict</span><span class="p">:</span>
+ <span class="c1"># if base_dict[upd_key] exists, base_dict[up_key] is updated by the set in upd_val</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">],</span> <span class="nb">set</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;type mismatch </span><span class="si">{</span><span class="s1">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span><span class="si">}</span><span class="s2">: is not a set type in base_dict&quot;</span><span class="p">)</span>
+ <span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">upd_val</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># if base_dict[upd_key] doesn&#39;t exists, set base_dict[upd_key] from a copy of the</span>
+ <span class="c1"># set in upd_val</span>
+ <span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">upd_val</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># for any other type of upd_val replace or add base_dict[upd_key] by a copy</span>
+ <span class="c1"># of upd_val</span>
+ <span class="n">base_dict</span><span class="p">[</span><span class="n">upd_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">upd_val</span><span class="p">)</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/botdetection/ip_lists.html b/_modules/searx/botdetection/ip_lists.html
new file mode 100644
index 000000000..f41b80629
--- /dev/null
+++ b/_modules/searx/botdetection/ip_lists.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.botdetection.ip_lists &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.botdetection.ip_lists</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.botdetection.ip_lists</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;.. _botdetection.ip_lists:</span>
+
+<span class="sd">Method ``ip_lists``</span>
+<span class="sd">-------------------</span>
+
+<span class="sd">The ``ip_lists`` method implements IP :py:obj:`block- &lt;block_ip&gt;` and</span>
+<span class="sd">:py:obj:`pass-lists &lt;pass_ip&gt;`.</span>
+
+<span class="sd">.. code:: toml</span>
+
+<span class="sd"> [botdetection.ip_lists]</span>
+
+<span class="sd"> pass_ip = [</span>
+<span class="sd"> &#39;167.235.158.251&#39;, # IPv4 of check.searx.space</span>
+<span class="sd"> &#39;192.168.0.0/16&#39;, # IPv4 private network</span>
+<span class="sd"> &#39;fe80::/10&#39; # IPv6 linklocal</span>
+<span class="sd"> ]</span>
+<span class="sd"> block_ip = [</span>
+<span class="sd"> &#39;93.184.216.34&#39;, # IPv4 of example.org</span>
+<span class="sd"> &#39;257.1.1.1&#39;, # invalid IP --&gt; will be ignored, logged in ERROR class</span>
+<span class="sd"> ]</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=unused-argument</span>
+
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Tuple</span>
+<span class="kn">from</span> <span class="nn">ipaddress</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">ip_network</span><span class="p">,</span>
+ <span class="n">IPv4Address</span><span class="p">,</span>
+ <span class="n">IPv6Address</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">config</span>
+<span class="kn">from</span> <span class="nn">._helpers</span> <span class="kn">import</span> <span class="n">logger</span>
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;ip_limit&#39;</span><span class="p">)</span>
+
+<span class="n">SEARXNG_ORG</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="c1"># https://github.com/searxng/searxng/pull/2484#issuecomment-1576639195</span>
+ <span class="s1">&#39;167.235.158.251&#39;</span><span class="p">,</span> <span class="c1"># IPv4 check.searx.space</span>
+ <span class="s1">&#39;2a01:04f8:1c1c:8fc2::/64&#39;</span><span class="p">,</span> <span class="c1"># IPv6 check.searx.space</span>
+<span class="p">]</span>
+<span class="sd">&quot;&quot;&quot;Passlist of IPs from the SearXNG organization, e.g. `check.searx.space`.&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="pass_ip">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.ip_lists.pass_ip">[docs]</a>
+<span class="k">def</span> <span class="nf">pass_ip</span><span class="p">(</span><span class="n">real_ip</span><span class="p">:</span> <span class="n">IPv4Address</span> <span class="o">|</span> <span class="n">IPv6Address</span><span class="p">,</span> <span class="n">cfg</span><span class="p">:</span> <span class="n">config</span><span class="o">.</span><span class="n">Config</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if the IP on the subnet is in one of the members of the</span>
+<span class="sd"> ``botdetection.ip_lists.pass_ip`` list.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;botdetection.ip_lists.pass_searxng_org&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">SEARXNG_ORG</span><span class="p">:</span>
+ <span class="n">net</span> <span class="o">=</span> <span class="n">ip_network</span><span class="p">(</span><span class="n">net</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">real_ip</span><span class="o">.</span><span class="n">version</span> <span class="o">==</span> <span class="n">net</span><span class="o">.</span><span class="n">version</span> <span class="ow">and</span> <span class="n">real_ip</span> <span class="ow">in</span> <span class="n">net</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;IP matches </span><span class="si">{</span><span class="n">net</span><span class="o">.</span><span class="n">compressed</span><span class="si">}</span><span class="s2"> in SEARXNG_ORG list.&quot;</span>
+ <span class="k">return</span> <span class="n">ip_is_subnet_of_member_in_list</span><span class="p">(</span><span class="n">real_ip</span><span class="p">,</span> <span class="s1">&#39;botdetection.ip_lists.pass_ip&#39;</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="block_ip">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.ip_lists.block_ip">[docs]</a>
+<span class="k">def</span> <span class="nf">block_ip</span><span class="p">(</span><span class="n">real_ip</span><span class="p">:</span> <span class="n">IPv4Address</span> <span class="o">|</span> <span class="n">IPv6Address</span><span class="p">,</span> <span class="n">cfg</span><span class="p">:</span> <span class="n">config</span><span class="o">.</span><span class="n">Config</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if the IP on the subnet is in one of the members of the</span>
+<span class="sd"> ``botdetection.ip_lists.block_ip`` list.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">block</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">ip_is_subnet_of_member_in_list</span><span class="p">(</span><span class="n">real_ip</span><span class="p">,</span> <span class="s1">&#39;botdetection.ip_lists.block_ip&#39;</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">block</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot; To remove IP from list, please contact the maintainer of the service.&quot;</span>
+ <span class="k">return</span> <span class="n">block</span><span class="p">,</span> <span class="n">msg</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">ip_is_subnet_of_member_in_list</span><span class="p">(</span>
+ <span class="n">real_ip</span><span class="p">:</span> <span class="n">IPv4Address</span> <span class="o">|</span> <span class="n">IPv6Address</span><span class="p">,</span> <span class="n">list_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cfg</span><span class="p">:</span> <span class="n">config</span><span class="o">.</span><span class="n">Config</span>
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
+
+ <span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">list_name</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[]):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">net</span> <span class="o">=</span> <span class="n">ip_network</span><span class="p">(</span><span class="n">net</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;invalid IP </span><span class="si">%s</span><span class="s2"> in </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">net</span><span class="p">,</span> <span class="n">list_name</span><span class="p">)</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="n">real_ip</span><span class="o">.</span><span class="n">version</span> <span class="o">==</span> <span class="n">net</span><span class="o">.</span><span class="n">version</span> <span class="ow">and</span> <span class="n">real_ip</span> <span class="ow">in</span> <span class="n">net</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;IP matches </span><span class="si">{</span><span class="n">net</span><span class="o">.</span><span class="n">compressed</span><span class="si">}</span><span class="s2"> in </span><span class="si">{</span><span class="n">list_name</span><span class="si">}</span><span class="s2">.&quot;</span>
+ <span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;IP is not a member of an item in the f</span><span class="si">{</span><span class="n">list_name</span><span class="si">}</span><span class="s2"> list&quot;</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/botdetection/link_token.html b/_modules/searx/botdetection/link_token.html
new file mode 100644
index 000000000..5241f4465
--- /dev/null
+++ b/_modules/searx/botdetection/link_token.html
@@ -0,0 +1,274 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.botdetection.link_token &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.botdetection.link_token</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.botdetection.link_token</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;</span>
+<span class="sd">Method ``link_token``</span>
+<span class="sd">---------------------</span>
+
+<span class="sd">The ``link_token`` method evaluates a request as :py:obj:`suspicious</span>
+<span class="sd">&lt;is_suspicious&gt;` if the URL ``/client&lt;token&gt;.css`` is not requested by the</span>
+<span class="sd">client. By adding a random component (the token) in the URL, a bot can not send</span>
+<span class="sd">a ping by request a static URL.</span>
+
+<span class="sd">.. note::</span>
+
+<span class="sd"> This method requires a redis DB and needs a HTTP X-Forwarded-For_ header.</span>
+
+<span class="sd">To get in use of this method a flask URL route needs to be added:</span>
+
+<span class="sd">.. code:: python</span>
+
+<span class="sd"> @app.route(&#39;/client&lt;token&gt;.css&#39;, methods=[&#39;GET&#39;, &#39;POST&#39;])</span>
+<span class="sd"> def client_token(token=None):</span>
+<span class="sd"> link_token.ping(request, token)</span>
+<span class="sd"> return Response(&#39;&#39;, mimetype=&#39;text/css&#39;)</span>
+
+<span class="sd">And in the HTML template from flask a stylesheet link is needed (the value of</span>
+<span class="sd">``link_token`` comes from :py:obj:`get_token`):</span>
+
+<span class="sd">.. code:: html</span>
+
+<span class="sd"> &lt;link rel=&quot;stylesheet&quot;</span>
+<span class="sd"> href=&quot;{{ url_for(&#39;client_token&#39;, token=link_token) }}&quot;</span>
+<span class="sd"> type=&quot;text/css&quot; /&gt;</span>
+
+<span class="sd">.. _X-Forwarded-For:</span>
+<span class="sd"> https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">from</span> <span class="nn">ipaddress</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">IPv4Network</span><span class="p">,</span>
+ <span class="n">IPv6Network</span><span class="p">,</span>
+ <span class="n">ip_address</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="kn">import</span> <span class="nn">string</span>
+<span class="kn">import</span> <span class="nn">random</span>
+<span class="kn">import</span> <span class="nn">flask</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">logger</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">redisdb</span>
+<span class="kn">from</span> <span class="nn">searx.redislib</span> <span class="kn">import</span> <span class="n">secret_hash</span>
+
+<span class="kn">from</span> <span class="nn">._helpers</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">get_network</span><span class="p">,</span>
+ <span class="n">get_real_ip</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="n">TOKEN_LIVE_TIME</span> <span class="o">=</span> <span class="mi">600</span>
+<span class="sd">&quot;&quot;&quot;Livetime (sec) of limiter&#39;s CSS token.&quot;&quot;&quot;</span>
+
+<span class="n">PING_LIVE_TIME</span> <span class="o">=</span> <span class="mi">3600</span>
+<span class="sd">&quot;&quot;&quot;Livetime (sec) of the ping-key from a client (request)&quot;&quot;&quot;</span>
+
+<span class="n">PING_KEY</span> <span class="o">=</span> <span class="s1">&#39;SearXNG_limiter.ping&#39;</span>
+<span class="sd">&quot;&quot;&quot;Prefix of all ping-keys generated by :py:obj:`get_ping_key`&quot;&quot;&quot;</span>
+
+<span class="n">TOKEN_KEY</span> <span class="o">=</span> <span class="s1">&#39;SearXNG_limiter.token&#39;</span>
+<span class="sd">&quot;&quot;&quot;Key for which the current token is stored in the DB&quot;&quot;&quot;</span>
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;botdetection.link_token&#39;</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="is_suspicious">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.link_token.is_suspicious">[docs]</a>
+<span class="k">def</span> <span class="nf">is_suspicious</span><span class="p">(</span><span class="n">network</span><span class="p">:</span> <span class="n">IPv4Network</span> <span class="o">|</span> <span class="n">IPv6Network</span><span class="p">,</span> <span class="n">request</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Request</span><span class="p">,</span> <span class="n">renew</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks whether a valid ping is exists for this (client) network, if not</span>
+<span class="sd"> this request is rated as *suspicious*. If a valid ping exists and argument</span>
+<span class="sd"> ``renew`` is ``True`` the expire time of this ping is reset to</span>
+<span class="sd"> :py:obj:`PING_LIVE_TIME`.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">redis_client</span> <span class="o">=</span> <span class="n">redisdb</span><span class="o">.</span><span class="n">client</span><span class="p">()</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">redis_client</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="n">ping_key</span> <span class="o">=</span> <span class="n">get_ping_key</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">redis_client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ping_key</span><span class="p">):</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;missing ping (IP: </span><span class="si">%s</span><span class="s2">) / request: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">network</span><span class="o">.</span><span class="n">compressed</span><span class="p">,</span> <span class="n">ping_key</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="k">if</span> <span class="n">renew</span><span class="p">:</span>
+ <span class="n">redis_client</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">ping_key</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">ex</span><span class="o">=</span><span class="n">PING_LIVE_TIME</span><span class="p">)</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;found ping for (client) network </span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">network</span><span class="o">.</span><span class="n">compressed</span><span class="p">,</span> <span class="n">ping_key</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">False</span></div>
+
+
+
+<div class="viewcode-block" id="ping">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.link_token.ping">[docs]</a>
+<span class="k">def</span> <span class="nf">ping</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Request</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;This function is called by a request to URL ``/client&lt;token&gt;.css``. If</span>
+<span class="sd"> ``token`` is valid a :py:obj:`PING_KEY` for the client is stored in the DB.</span>
+<span class="sd"> The expire time of this ping-key is :py:obj:`PING_LIVE_TIME`.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">redis_client</span><span class="p">,</span> <span class="n">cfg</span> <span class="c1"># pylint: disable=import-outside-toplevel, cyclic-import</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">redis_client</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">token_is_valid</span><span class="p">(</span><span class="n">token</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="n">real_ip</span> <span class="o">=</span> <span class="n">ip_address</span><span class="p">(</span><span class="n">get_real_ip</span><span class="p">(</span><span class="n">request</span><span class="p">))</span>
+ <span class="n">network</span> <span class="o">=</span> <span class="n">get_network</span><span class="p">(</span><span class="n">real_ip</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+
+ <span class="n">ping_key</span> <span class="o">=</span> <span class="n">get_ping_key</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;store ping_key for (client) network </span><span class="si">%s</span><span class="s2"> (IP </span><span class="si">%s</span><span class="s2">) -&gt; </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">network</span><span class="o">.</span><span class="n">compressed</span><span class="p">,</span> <span class="n">real_ip</span><span class="p">,</span> <span class="n">ping_key</span><span class="p">)</span>
+ <span class="n">redis_client</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">ping_key</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">ex</span><span class="o">=</span><span class="n">PING_LIVE_TIME</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="get_ping_key">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.link_token.get_ping_key">[docs]</a>
+<span class="k">def</span> <span class="nf">get_ping_key</span><span class="p">(</span><span class="n">network</span><span class="p">:</span> <span class="n">IPv4Network</span> <span class="o">|</span> <span class="n">IPv6Network</span><span class="p">,</span> <span class="n">request</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Request</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;Generates a hashed key that fits (more or less) to a *WEB-browser</span>
+<span class="sd"> session* in a network.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="p">(</span>
+ <span class="n">PING_KEY</span>
+ <span class="o">+</span> <span class="s2">&quot;[&quot;</span>
+ <span class="o">+</span> <span class="n">secret_hash</span><span class="p">(</span>
+ <span class="n">network</span><span class="o">.</span><span class="n">compressed</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;User-Agent&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot;]&quot;</span>
+ <span class="p">)</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">token_is_valid</span><span class="p">(</span><span class="n">token</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+ <span class="n">valid</span> <span class="o">=</span> <span class="n">token</span> <span class="o">==</span> <span class="n">get_token</span><span class="p">()</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;token is valid --&gt; </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">valid</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">valid</span>
+
+
+<div class="viewcode-block" id="get_token">
+<a class="viewcode-back" href="../../../src/searx.botdetection.html#searx.botdetection.link_token.get_token">[docs]</a>
+<span class="k">def</span> <span class="nf">get_token</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;Returns current token. If there is no currently active token a new token</span>
+<span class="sd"> is generated randomly and stored in the redis DB.</span>
+
+<span class="sd"> - :py:obj:`TOKEN_LIVE_TIME`</span>
+<span class="sd"> - :py:obj:`TOKEN_KEY`</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">redis_client</span> <span class="o">=</span> <span class="n">redisdb</span><span class="o">.</span><span class="n">client</span><span class="p">()</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">redis_client</span><span class="p">:</span>
+ <span class="c1"># This function is also called when limiter is inactive / no redis DB</span>
+ <span class="c1"># (see render function in webapp.py)</span>
+ <span class="k">return</span> <span class="s1">&#39;12345678&#39;</span>
+ <span class="n">token</span> <span class="o">=</span> <span class="n">redis_client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">TOKEN_KEY</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">token</span><span class="p">:</span>
+ <span class="n">token</span> <span class="o">=</span> <span class="n">token</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-8&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">token</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">string</span><span class="o">.</span><span class="n">ascii_lowercase</span> <span class="o">+</span> <span class="n">string</span><span class="o">.</span><span class="n">digits</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">16</span><span class="p">))</span>
+ <span class="n">redis_client</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">TOKEN_KEY</span><span class="p">,</span> <span class="n">token</span><span class="p">,</span> <span class="n">ex</span><span class="o">=</span><span class="n">TOKEN_LIVE_TIME</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">token</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/enginelib.html b/_modules/searx/enginelib.html
new file mode 100644
index 000000000..4edeedf88
--- /dev/null
+++ b/_modules/searx/enginelib.html
@@ -0,0 +1,255 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.enginelib &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.enginelib</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.enginelib</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 of the framework for the SearXNG engines.</span>
+
+<span class="sd">.. hint::</span>
+
+<span class="sd"> The long term goal is to modularize all implementations of the engine</span>
+<span class="sd"> framework here in this Python package. ToDo:</span>
+
+<span class="sd"> - move implementations of the :ref:`searx.engines loader` to a new module in</span>
+<span class="sd"> the :py:obj:`searx.enginelib` namespace.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">searx.enginelib</span> <span class="kn">import</span> <span class="n">traits</span>
+
+
+<div class="viewcode-block" id="Engine">
+<a class="viewcode-back" href="../../dev/engines/enginelib.html#searx.enginelib.Engine">[docs]</a>
+<span class="k">class</span> <span class="nc">Engine</span><span class="p">:</span> <span class="c1"># pylint: disable=too-few-public-methods</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class of engine instances build from YAML settings.</span>
+
+<span class="sd"> Further documentation see :ref:`general engine configuration`.</span>
+
+<span class="sd"> .. hint::</span>
+
+<span class="sd"> This class is currently never initialized and only used for type hinting.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="c1"># Common options in the engine module</span>
+
+ <span class="n">engine_type</span><span class="p">:</span> <span class="nb">str</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Type of the engine (:ref:`searx.search.processors`)&quot;&quot;&quot;</span>
+
+ <span class="n">paging</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Engine supports multiple pages.&quot;&quot;&quot;</span>
+
+ <span class="n">time_range_support</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Engine supports search time range.&quot;&quot;&quot;</span>
+
+ <span class="n">safesearch</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Engine supports SafeSearch&quot;&quot;&quot;</span>
+
+ <span class="n">language_support</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Engine supports languages (locales) search.&quot;&quot;&quot;</span>
+
+ <span class="n">language</span><span class="p">:</span> <span class="nb">str</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;For an engine, when there is ``language: ...`` in the YAML settings the engine</span>
+<span class="sd"> does support only this one language:</span>
+
+<span class="sd"> .. code:: yaml</span>
+
+<span class="sd"> - name: google french</span>
+<span class="sd"> engine: google</span>
+<span class="sd"> language: fr</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">region</span><span class="p">:</span> <span class="nb">str</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;For an engine, when there is ``region: ...`` in the YAML settings the engine</span>
+<span class="sd"> does support only this one region::</span>
+
+<span class="sd"> .. code:: yaml</span>
+
+<span class="sd"> - name: google belgium</span>
+<span class="sd"> engine: google</span>
+<span class="sd"> region: fr-BE</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">fetch_traits</span><span class="p">:</span> <span class="n">Callable</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Function to to fetch engine&#39;s traits from origin.&quot;&quot;&quot;</span>
+
+ <span class="n">traits</span><span class="p">:</span> <span class="n">traits</span><span class="o">.</span><span class="n">EngineTraits</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Traits of the engine.&quot;&quot;&quot;</span>
+
+ <span class="c1"># settings.yml</span>
+
+ <span class="n">categories</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Specifies to which :ref:`engine categories` the engine should be added.&quot;&quot;&quot;</span>
+
+ <span class="n">name</span><span class="p">:</span> <span class="nb">str</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Name that will be used across SearXNG to define this engine. In settings, on</span>
+<span class="sd"> the result page ..&quot;&quot;&quot;</span>
+
+ <span class="n">engine</span><span class="p">:</span> <span class="nb">str</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Name of the python file used to handle requests and responses to and from</span>
+<span class="sd"> this search engine (file name from :origin:`searx/engines` without</span>
+<span class="sd"> ``.py``).&quot;&quot;&quot;</span>
+
+ <span class="n">enable_http</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Enable HTTP (by default only HTTPS is enabled).&quot;&quot;&quot;</span>
+
+ <span class="n">shortcut</span><span class="p">:</span> <span class="nb">str</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Code used to execute bang requests (``!foo``)&quot;&quot;&quot;</span>
+
+ <span class="n">timeout</span><span class="p">:</span> <span class="nb">float</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Specific timeout for search-engine.&quot;&quot;&quot;</span>
+
+ <span class="n">display_error_messages</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Display error messages on the web UI.&quot;&quot;&quot;</span>
+
+ <span class="n">proxies</span><span class="p">:</span> <span class="nb">dict</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Set proxies for a specific engine (YAML):</span>
+
+<span class="sd"> .. code:: yaml</span>
+
+<span class="sd"> proxies :</span>
+<span class="sd"> http: socks5://proxy:port</span>
+<span class="sd"> https: socks5://proxy:port</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">disabled</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;To disable by default the engine, but not deleting it. It will allow the</span>
+<span class="sd"> user to manually activate it in the settings.&quot;&quot;&quot;</span>
+
+ <span class="n">inactive</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove the engine from the settings (*disabled &amp; removed*).&quot;&quot;&quot;</span>
+
+ <span class="n">about</span><span class="p">:</span> <span class="nb">dict</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Additional fields describing the engine.</span>
+
+<span class="sd"> .. code:: yaml</span>
+
+<span class="sd"> about:</span>
+<span class="sd"> website: https://example.com</span>
+<span class="sd"> wikidata_id: Q306656</span>
+<span class="sd"> official_api_documentation: https://example.com/api-doc</span>
+<span class="sd"> use_official_api: true</span>
+<span class="sd"> require_api_key: true</span>
+<span class="sd"> results: HTML</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">using_tor_proxy</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Using tor proxy (``true``) or not (``false``) for this engine.&quot;&quot;&quot;</span>
+
+ <span class="n">send_accept_language_header</span><span class="p">:</span> <span class="nb">bool</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;When this option is activated, the language (locale) that is selected by</span>
+<span class="sd"> the user is used to build and send a ``Accept-Language`` header in the</span>
+<span class="sd"> request to the origin search engine.&quot;&quot;&quot;</span>
+
+ <span class="n">tokens</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;A list of secret tokens to make this engine *private*, more details see</span>
+<span class="sd"> :ref:`private engines`.&quot;&quot;&quot;</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/enginelib/traits.html b/_modules/searx/enginelib/traits.html
new file mode 100644
index 000000000..6cce7e69b
--- /dev/null
+++ b/_modules/searx/enginelib/traits.html
@@ -0,0 +1,401 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.enginelib.traits &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../enginelib.html" accesskey="U">searx.enginelib</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.enginelib.traits</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.enginelib.traits</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;Engine&#39;s traits are fetched from the origin engines and stored in a JSON file</span>
+<span class="sd">in the *data folder*. Most often traits are languages and region codes and</span>
+<span class="sd">their mapping from SearXNG&#39;s representation to the representation in the origin</span>
+<span class="sd">search engine. For new traits new properties can be added to the class</span>
+<span class="sd">:py:class:`EngineTraits`.</span>
+
+<span class="sd">To load traits from the persistence :py:obj:`EngineTraitsMap.from_data` can be</span>
+<span class="sd">used.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">import</span> <span class="nn">dataclasses</span>
+<span class="kn">import</span> <span class="nn">types</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Literal</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">locales</span>
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">data_dir</span><span class="p">,</span> <span class="n">ENGINE_TRAITS</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">Engine</span>
+
+
+<div class="viewcode-block" id="EngineTraitsEncoder">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsEncoder">[docs]</a>
+<span class="k">class</span> <span class="nc">EngineTraitsEncoder</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Encodes :class:`EngineTraits` to a serializable object, see</span>
+<span class="sd"> :class:`json.JSONEncoder`.&quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="EngineTraitsEncoder.default">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsEncoder.default">[docs]</a>
+ <span class="k">def</span> <span class="nf">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return dictionary of a :class:`EngineTraits` object.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">EngineTraits</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">o</span><span class="o">.</span><span class="vm">__dict__</span>
+ <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">default</span><span class="p">(</span><span class="n">o</span><span class="p">)</span></div>
+</div>
+
+
+
+<div class="viewcode-block" id="EngineTraits">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits">[docs]</a>
+<span class="nd">@dataclasses</span><span class="o">.</span><span class="n">dataclass</span>
+<span class="k">class</span> <span class="nc">EngineTraits</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;The class is intended to be instantiated for each engine.&quot;&quot;&quot;</span>
+
+ <span class="n">regions</span><span class="p">:</span> <span class="n">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="o">=</span> <span class="n">dataclasses</span><span class="o">.</span><span class="n">field</span><span class="p">(</span><span class="n">default_factory</span><span class="o">=</span><span class="nb">dict</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps SearXNG&#39;s internal representation of a region to the one of the engine.</span>
+
+<span class="sd"> SearXNG&#39;s internal representation can be parsed by babel and the value is</span>
+<span class="sd"> send to the engine:</span>
+
+<span class="sd"> .. code:: python</span>
+
+<span class="sd"> regions ={</span>
+<span class="sd"> &#39;fr-BE&#39; : &lt;engine&#39;s region name&gt;,</span>
+<span class="sd"> }</span>
+
+<span class="sd"> for key, egnine_region regions.items():</span>
+<span class="sd"> searxng_region = babel.Locale.parse(key, sep=&#39;-&#39;)</span>
+<span class="sd"> ...</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">languages</span><span class="p">:</span> <span class="n">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="o">=</span> <span class="n">dataclasses</span><span class="o">.</span><span class="n">field</span><span class="p">(</span><span class="n">default_factory</span><span class="o">=</span><span class="nb">dict</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps SearXNG&#39;s internal representation of a language to the one of the engine.</span>
+
+<span class="sd"> SearXNG&#39;s internal representation can be parsed by babel and the value is</span>
+<span class="sd"> send to the engine:</span>
+
+<span class="sd"> .. code:: python</span>
+
+<span class="sd"> languages = {</span>
+<span class="sd"> &#39;ca&#39; : &lt;engine&#39;s language name&gt;,</span>
+<span class="sd"> }</span>
+
+<span class="sd"> for key, egnine_lang in languages.items():</span>
+<span class="sd"> searxng_lang = babel.Locale.parse(key)</span>
+<span class="sd"> ...</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">all_locale</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;To which locale value SearXNG&#39;s ``all`` language is mapped (shown a &quot;Default</span>
+<span class="sd"> language&quot;).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">data_type</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s1">&#39;traits_v1&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;traits_v1&#39;</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Data type, default is &#39;traits_v1&#39;.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">custom</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Union</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Dict</span><span class="p">],</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="n">dataclasses</span><span class="o">.</span><span class="n">field</span><span class="p">(</span><span class="n">default_factory</span><span class="o">=</span><span class="nb">dict</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;A place to store engine&#39;s custom traits, not related to the SearXNG core.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="EngineTraits.get_language">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.get_language">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_language</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">searxng_locale</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return engine&#39;s language string that *best fits* to SearXNG&#39;s locale.</span>
+
+<span class="sd"> :param searxng_locale: SearXNG&#39;s internal representation of locale</span>
+<span class="sd"> selected by the user.</span>
+
+<span class="sd"> :param default: engine&#39;s default language</span>
+
+<span class="sd"> The *best fits* rules are implemented in</span>
+<span class="sd"> :py:obj:`searx.locales.get_engine_locale`. Except for the special value ``all``</span>
+<span class="sd"> which is determined from :py:obj:`EngineTraits.all_locale`.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">searxng_locale</span> <span class="o">==</span> <span class="s1">&#39;all&#39;</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">all_locale</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="bp">self</span><span class="o">.</span><span class="n">all_locale</span>
+ <span class="k">return</span> <span class="n">locales</span><span class="o">.</span><span class="n">get_engine_locale</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">languages</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="EngineTraits.get_region">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.get_region">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_region</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">searxng_locale</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return engine&#39;s region string that best fits to SearXNG&#39;s locale.</span>
+
+<span class="sd"> :param searxng_locale: SearXNG&#39;s internal representation of locale</span>
+<span class="sd"> selected by the user.</span>
+
+<span class="sd"> :param default: engine&#39;s default region</span>
+
+<span class="sd"> The *best fits* rules are implemented in</span>
+<span class="sd"> :py:obj:`searx.locales.get_engine_locale`. Except for the special value ``all``</span>
+<span class="sd"> which is determined from :py:obj:`EngineTraits.all_locale`.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">searxng_locale</span> <span class="o">==</span> <span class="s1">&#39;all&#39;</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">all_locale</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="bp">self</span><span class="o">.</span><span class="n">all_locale</span>
+ <span class="k">return</span> <span class="n">locales</span><span class="o">.</span><span class="n">get_engine_locale</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">regions</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="EngineTraits.is_locale_supported">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.is_locale_supported">[docs]</a>
+ <span class="k">def</span> <span class="nf">is_locale_supported</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">searxng_locale</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;A *locale* (SearXNG&#39;s internal representation) is considered to be</span>
+<span class="sd"> supported by the engine if the *region* or the *language* is supported</span>
+<span class="sd"> by the engine.</span>
+
+<span class="sd"> For verification the functions :py:func:`EngineTraits.get_region` and</span>
+<span class="sd"> :py:func:`EngineTraits.get_language` are used.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_type</span> <span class="o">==</span> <span class="s1">&#39;traits_v1&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">))</span>
+
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;engine traits of type </span><span class="si">%s</span><span class="s1"> is unknown&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_type</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="EngineTraits.copy">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.copy">[docs]</a>
+ <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a copy of the dataclass object.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">EngineTraits</span><span class="p">(</span><span class="o">**</span><span class="n">dataclasses</span><span class="o">.</span><span class="n">asdict</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="EngineTraits.fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.fetch_traits">[docs]</a>
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Union</span><span class="p">[</span><span class="s1">&#39;EngineTraits&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Call a function ``fetch_traits(engine_traits)`` from engines namespace to fetch</span>
+<span class="sd"> and set properties from the origin engine in the object ``engine_traits``. If</span>
+<span class="sd"> function does not exists, ``None`` is returned.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">fetch_traits</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;fetch_traits&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="n">engine_traits</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="n">fetch_traits</span><span class="p">:</span>
+ <span class="n">engine_traits</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">()</span>
+ <span class="n">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">engine_traits</span></div>
+
+
+<div class="viewcode-block" id="EngineTraits.set_traits">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.set_traits">[docs]</a>
+ <span class="k">def</span> <span class="nf">set_traits</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Set traits from self object in a :py:obj:`.Engine` namespace.</span>
+
+<span class="sd"> :param engine: engine instance build by :py:func:`searx.engines.load_engine`</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_type</span> <span class="o">==</span> <span class="s1">&#39;traits_v1&#39;</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_set_traits_v1</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;engine traits of type </span><span class="si">%s</span><span class="s1"> is unknown&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_type</span><span class="p">)</span></div>
+
+
+ <span class="k">def</span> <span class="nf">_set_traits_v1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span><span class="p">):</span>
+ <span class="c1"># For an engine, when there is `language: ...` in the YAML settings the engine</span>
+ <span class="c1"># does support only this one language (region)::</span>
+ <span class="c1">#</span>
+ <span class="c1"># - name: google italian</span>
+ <span class="c1"># engine: google</span>
+ <span class="c1"># language: it</span>
+ <span class="c1"># region: it-IT # type: ignore</span>
+
+ <span class="n">traits</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+
+ <span class="n">_msg</span> <span class="o">=</span> <span class="s2">&quot;settings.yml - engine: &#39;</span><span class="si">%s</span><span class="s2">&#39; / </span><span class="si">%s</span><span class="s2">: &#39;</span><span class="si">%s</span><span class="s2">&#39; not supported&quot;</span>
+
+ <span class="n">languages</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">languages</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;language&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">engine</span><span class="o">.</span><span class="n">language</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">languages</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">_msg</span> <span class="o">%</span> <span class="p">(</span><span class="n">engine</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;language&#39;</span><span class="p">,</span> <span class="n">engine</span><span class="o">.</span><span class="n">language</span><span class="p">))</span>
+ <span class="n">traits</span><span class="o">.</span><span class="n">languages</span> <span class="o">=</span> <span class="p">{</span><span class="n">engine</span><span class="o">.</span><span class="n">language</span><span class="p">:</span> <span class="n">languages</span><span class="p">[</span><span class="n">engine</span><span class="o">.</span><span class="n">language</span><span class="p">]}</span>
+
+ <span class="n">regions</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">regions</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;region&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">engine</span><span class="o">.</span><span class="n">region</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">regions</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">_msg</span> <span class="o">%</span> <span class="p">(</span><span class="n">engine</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;region&#39;</span><span class="p">,</span> <span class="n">engine</span><span class="o">.</span><span class="n">region</span><span class="p">))</span>
+ <span class="n">traits</span><span class="o">.</span><span class="n">regions</span> <span class="o">=</span> <span class="p">{</span><span class="n">engine</span><span class="o">.</span><span class="n">region</span><span class="p">:</span> <span class="n">regions</span><span class="p">[</span><span class="n">engine</span><span class="o">.</span><span class="n">region</span><span class="p">]}</span>
+
+ <span class="n">engine</span><span class="o">.</span><span class="n">language_support</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">traits</span><span class="o">.</span><span class="n">languages</span> <span class="ow">or</span> <span class="n">traits</span><span class="o">.</span><span class="n">regions</span><span class="p">)</span>
+
+ <span class="c1"># set the copied &amp; modified traits in engine&#39;s namespace</span>
+ <span class="n">engine</span><span class="o">.</span><span class="n">traits</span> <span class="o">=</span> <span class="n">traits</span></div>
+
+
+
+<div class="viewcode-block" id="EngineTraitsMap">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap">[docs]</a>
+<span class="k">class</span> <span class="nc">EngineTraitsMap</span><span class="p">(</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">EngineTraits</span><span class="p">]):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;A python dictionary to map :class:`EngineTraits` by engine name.&quot;&quot;&quot;</span>
+
+ <span class="n">ENGINE_TRAITS_FILE</span> <span class="o">=</span> <span class="p">(</span><span class="n">data_dir</span> <span class="o">/</span> <span class="s1">&#39;engine_traits.json&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">resolve</span><span class="p">()</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;File with persistence of the :py:obj:`EngineTraitsMap`.&quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="EngineTraitsMap.save_data">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.save_data">[docs]</a>
+ <span class="k">def</span> <span class="nf">save_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Store EngineTraitsMap in in file :py:obj:`self.ENGINE_TRAITS_FILE`&quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ENGINE_TRAITS_FILE</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="bp">cls</span><span class="o">=</span><span class="n">EngineTraitsEncoder</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="EngineTraitsMap.from_data">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.from_data">[docs]</a>
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">from_data</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;EngineTraitsMap&#39;</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Instantiate :class:`EngineTraitsMap` object from :py:obj:`ENGINE_TRAITS`&quot;&quot;&quot;</span>
+ <span class="n">obj</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ENGINE_TRAITS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">obj</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">EngineTraits</span><span class="p">(</span><span class="o">**</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">obj</span></div>
+
+
+ <span class="nd">@classmethod</span>
+ <span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">log</span><span class="p">:</span> <span class="n">Callable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s1">&#39;EngineTraitsMap&#39;</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">engines</span> <span class="c1"># pylint: disable=cyclic-import, import-outside-toplevel</span>
+
+ <span class="n">names</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">engines</span><span class="o">.</span><span class="n">engines</span><span class="p">)</span>
+ <span class="n">names</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
+ <span class="n">obj</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">()</span>
+
+ <span class="k">for</span> <span class="n">engine_name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
+ <span class="n">engine</span> <span class="o">=</span> <span class="n">engines</span><span class="o">.</span><span class="n">engines</span><span class="p">[</span><span class="n">engine_name</span><span class="p">]</span>
+
+ <span class="n">traits</span> <span class="o">=</span> <span class="n">EngineTraits</span><span class="o">.</span><span class="n">fetch_traits</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">traits</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">log</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%-20s</span><span class="s2">: SearXNG languages --&gt; </span><span class="si">%s</span><span class="s2"> &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">traits</span><span class="o">.</span><span class="n">languages</span><span class="p">)))</span>
+ <span class="n">log</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%-20s</span><span class="s2">: SearXNG regions --&gt; </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">traits</span><span class="o">.</span><span class="n">regions</span><span class="p">)))</span>
+ <span class="n">obj</span><span class="p">[</span><span class="n">engine_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">traits</span>
+
+ <span class="k">return</span> <span class="n">obj</span>
+
+<div class="viewcode-block" id="EngineTraitsMap.set_traits">
+<a class="viewcode-back" href="../../../dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.set_traits">[docs]</a>
+ <span class="k">def</span> <span class="nf">set_traits</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Set traits in a :py:obj:`Engine` namespace.</span>
+
+<span class="sd"> :param engine: engine instance build by :py:func:`searx.engines.load_engine`</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">engine_traits</span> <span class="o">=</span> <span class="n">EngineTraits</span><span class="p">(</span><span class="n">data_type</span><span class="o">=</span><span class="s1">&#39;traits_v1&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">engine</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
+ <span class="n">engine_traits</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">engine</span><span class="o">.</span><span class="n">name</span><span class="p">]</span>
+
+ <span class="k">elif</span> <span class="n">engine</span><span class="o">.</span><span class="n">engine</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
+ <span class="c1"># The key of the dictionary traits_map is the *engine name*</span>
+ <span class="c1"># configured in settings.xml. When multiple engines are configured</span>
+ <span class="c1"># in settings.yml to use the same origin engine (python module)</span>
+ <span class="c1"># these additional engines can use the languages from the origin</span>
+ <span class="c1"># engine. For this use the configured ``engine: ...`` from</span>
+ <span class="c1"># settings.yml</span>
+ <span class="n">engine_traits</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">engine</span><span class="o">.</span><span class="n">engine</span><span class="p">]</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">set_traits</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span></div>
+</div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../enginelib.html">searx.enginelib</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines.html b/_modules/searx/engines.html
new file mode 100644
index 000000000..bbffee37b
--- /dev/null
+++ b/_modules/searx/engines.html
@@ -0,0 +1,373 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines</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;Load and initialize the ``engines``, see :py:func:`load_engines` and register</span>
+<span class="sd">:py:obj:`engine_shortcuts`.</span>
+
+<span class="sd">usage::</span>
+
+<span class="sd"> load_engines( settings[&#39;engines&#39;] )</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+
+<span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">import</span> <span class="nn">copy</span>
+<span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">realpath</span><span class="p">,</span> <span class="n">dirname</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span><span class="p">,</span> <span class="n">Dict</span>
+<span class="kn">import</span> <span class="nn">types</span>
+<span class="kn">import</span> <span class="nn">inspect</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">logger</span><span class="p">,</span> <span class="n">settings</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">load_module</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">searx.enginelib</span> <span class="kn">import</span> <span class="n">Engine</span>
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;engines&#39;</span><span class="p">)</span>
+<span class="n">ENGINE_DIR</span> <span class="o">=</span> <span class="n">dirname</span><span class="p">(</span><span class="n">realpath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))</span>
+<span class="n">ENGINE_DEFAULT_ARGS</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="c1"># Common options in the engine module</span>
+ <span class="s2">&quot;engine_type&quot;</span><span class="p">:</span> <span class="s2">&quot;online&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;paging&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;time_range_support&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;safesearch&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="c1"># settings.yml</span>
+ <span class="s2">&quot;categories&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;general&quot;</span><span class="p">],</span>
+ <span class="s2">&quot;enable_http&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;shortcut&quot;</span><span class="p">:</span> <span class="s2">&quot;-&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;timeout&quot;</span><span class="p">:</span> <span class="n">settings</span><span class="p">[</span><span class="s2">&quot;outgoing&quot;</span><span class="p">][</span><span class="s2">&quot;request_timeout&quot;</span><span class="p">],</span>
+ <span class="s2">&quot;display_error_messages&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;disabled&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;inactive&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;about&quot;</span><span class="p">:</span> <span class="p">{},</span>
+ <span class="s2">&quot;using_tor_proxy&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;send_accept_language_header&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;tokens&quot;</span><span class="p">:</span> <span class="p">[],</span>
+ <span class="s2">&quot;max_page&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="c1"># set automatically when an engine does not have any tab category</span>
+<span class="n">DEFAULT_CATEGORY</span> <span class="o">=</span> <span class="s1">&#39;other&#39;</span>
+
+
+<span class="c1"># Defaults for the namespace of an engine module, see :py:func:`load_engine`</span>
+
+<span class="n">categories</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;general&#39;</span><span class="p">:</span> <span class="p">[]}</span>
+<span class="n">engines</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="n">engine_shortcuts</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="sd">&quot;&quot;&quot;Simple map of registered *shortcuts* to name of the engine (or ``None``).</span>
+
+<span class="sd">::</span>
+
+<span class="sd"> engine_shortcuts[engine.shortcut] = engine.name</span>
+
+<span class="sd">:meta hide-value:</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">check_engine_module</span><span class="p">(</span><span class="n">module</span><span class="p">:</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">):</span>
+ <span class="c1"># probe unintentional name collisions / for example name collisions caused</span>
+ <span class="c1"># by import statements in the engine module ..</span>
+
+ <span class="c1"># network: https://github.com/searxng/searxng/issues/762#issuecomment-1605323861</span>
+ <span class="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="s1">&#39;network&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">obj</span> <span class="ow">and</span> <span class="n">inspect</span><span class="o">.</span><span class="n">ismodule</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;type of </span><span class="si">{</span><span class="n">module</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1">.network is a module (</span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1">), expected a string&#39;</span>
+ <span class="c1"># logger.error(msg)</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="load_engine">
+<a class="viewcode-back" href="../../dev/engines/engines.html#searx.engines.load_engine">[docs]</a>
+<span class="k">def</span> <span class="nf">load_engine</span><span class="p">(</span><span class="n">engine_data</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Load engine from ``engine_data``.</span>
+
+<span class="sd"> :param dict engine_data: Attributes from YAML ``settings:engines/&lt;engine&gt;``</span>
+<span class="sd"> :return: initialized namespace of the ``&lt;engine&gt;``.</span>
+
+<span class="sd"> 1. create a namespace and load module of the ``&lt;engine&gt;``</span>
+<span class="sd"> 2. update namespace with the defaults from :py:obj:`ENGINE_DEFAULT_ARGS`</span>
+<span class="sd"> 3. update namespace with values from ``engine_data``</span>
+
+<span class="sd"> If engine *is active*, return namespace of the engine, otherwise return</span>
+<span class="sd"> ``None``.</span>
+
+<span class="sd"> This function also returns ``None`` if initialization of the namespace fails</span>
+<span class="sd"> for one of the following reasons:</span>
+
+<span class="sd"> - engine name contains underscore</span>
+<span class="sd"> - engine name is not lowercase</span>
+<span class="sd"> - required attribute is not set :py:func:`is_missing_required_attributes`</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-return-statements</span>
+
+ <span class="n">engine_name</span> <span class="o">=</span> <span class="n">engine_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">engine_name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;An engine does not have a &quot;name&quot; field&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="s1">&#39;_&#39;</span> <span class="ow">in</span> <span class="n">engine_name</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;Engine name contains underscore: &quot;</span><span class="si">{}</span><span class="s1">&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">engine_name</span><span class="p">))</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="n">engine_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="n">engine_name</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;Engine name is not lowercase: &quot;</span><span class="si">{}</span><span class="s1">&quot;, converting to lowercase&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">engine_name</span><span class="p">))</span>
+ <span class="n">engine_name</span> <span class="o">=</span> <span class="n">engine_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="n">engine_data</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_name</span>
+
+ <span class="c1"># load_module</span>
+ <span class="n">module_name</span> <span class="o">=</span> <span class="n">engine_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;engine&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">module_name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;The &quot;engine&quot; field is missing for the engine named &quot;</span><span class="si">{}</span><span class="s1">&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">engine_name</span><span class="p">))</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">engine</span> <span class="o">=</span> <span class="n">load_module</span><span class="p">(</span><span class="n">module_name</span> <span class="o">+</span> <span class="s1">&#39;.py&#39;</span><span class="p">,</span> <span class="n">ENGINE_DIR</span><span class="p">)</span>
+ <span class="k">except</span> <span class="p">(</span><span class="ne">SyntaxError</span><span class="p">,</span> <span class="ne">KeyboardInterrupt</span><span class="p">,</span> <span class="ne">SystemExit</span><span class="p">,</span> <span class="ne">SystemError</span><span class="p">,</span> <span class="ne">ImportError</span><span class="p">,</span> <span class="ne">RuntimeError</span><span class="p">):</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;Fatal exception in engine &quot;</span><span class="si">{}</span><span class="s1">&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">module_name</span><span class="p">))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">BaseException</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;Cannot load engine &quot;</span><span class="si">{}</span><span class="s1">&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">module_name</span><span class="p">))</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">check_engine_module</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
+ <span class="n">update_engine_attributes</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">engine_data</span><span class="p">)</span>
+ <span class="n">update_attributes_for_tor</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
+
+ <span class="c1"># avoid cyclic imports</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+ <span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraitsMap</span>
+
+ <span class="n">trait_map</span> <span class="o">=</span> <span class="n">EngineTraitsMap</span><span class="o">.</span><span class="n">from_data</span><span class="p">()</span>
+ <span class="n">trait_map</span><span class="o">.</span><span class="n">set_traits</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">is_engine_active</span><span class="p">(</span><span class="n">engine</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="n">is_missing_required_attributes</span><span class="p">(</span><span class="n">engine</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">set_loggers</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">engine_name</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">cat</span> <span class="ow">in</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;categories_as_tabs&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">cat</span> <span class="ow">in</span> <span class="n">engine</span><span class="o">.</span><span class="n">categories</span><span class="p">):</span>
+ <span class="n">engine</span><span class="o">.</span><span class="n">categories</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">DEFAULT_CATEGORY</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">engine</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">set_loggers</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">engine_name</span><span class="p">):</span>
+ <span class="c1"># set the logger for engine</span>
+ <span class="n">engine</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="n">engine_name</span><span class="p">)</span>
+ <span class="c1"># the engine may have load some other engines</span>
+ <span class="c1"># may sure the logger is initialized</span>
+ <span class="c1"># use sys.modules.copy() to avoid &quot;RuntimeError: dictionary changed size during iteration&quot;</span>
+ <span class="c1"># see https://github.com/python/cpython/issues/89516</span>
+ <span class="c1"># and https://docs.python.org/3.10/library/sys.html#sys.modules</span>
+ <span class="n">modules</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">module_name</span><span class="p">,</span> <span class="n">module</span> <span class="ow">in</span> <span class="n">modules</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="p">(</span>
+ <span class="n">module_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;searx.engines&quot;</span><span class="p">)</span>
+ <span class="ow">and</span> <span class="n">module_name</span> <span class="o">!=</span> <span class="s2">&quot;searx.engines.__init__&quot;</span>
+ <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="s2">&quot;logger&quot;</span><span class="p">)</span>
+ <span class="p">):</span>
+ <span class="n">module_engine_name</span> <span class="o">=</span> <span class="n">module_name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">module</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="n">module_engine_name</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+
+<span class="k">def</span> <span class="nf">update_engine_attributes</span><span class="p">(</span><span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">,</span> <span class="n">engine_data</span><span class="p">):</span>
+ <span class="c1"># set engine attributes from engine_data</span>
+ <span class="k">for</span> <span class="n">param_name</span><span class="p">,</span> <span class="n">param_value</span> <span class="ow">in</span> <span class="n">engine_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">param_name</span> <span class="o">==</span> <span class="s1">&#39;categories&#39;</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">param_value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">param_value</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">strip</span><span class="p">,</span> <span class="n">param_value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)))</span>
+ <span class="n">engine</span><span class="o">.</span><span class="n">categories</span> <span class="o">=</span> <span class="n">param_value</span> <span class="c1"># type: ignore</span>
+ <span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;about&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">param_name</span> <span class="o">==</span> <span class="s1">&#39;about&#39;</span><span class="p">:</span>
+ <span class="n">engine</span><span class="o">.</span><span class="n">about</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">engine</span><span class="o">.</span><span class="n">about</span><span class="p">,</span> <span class="o">**</span><span class="n">engine_data</span><span class="p">[</span><span class="s1">&#39;about&#39;</span><span class="p">]}</span> <span class="c1"># type: ignore</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="nb">setattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">param_name</span><span class="p">,</span> <span class="n">param_value</span><span class="p">)</span>
+
+ <span class="c1"># set default attributes</span>
+ <span class="k">for</span> <span class="n">arg_name</span><span class="p">,</span> <span class="n">arg_value</span> <span class="ow">in</span> <span class="n">ENGINE_DEFAULT_ARGS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">arg_name</span><span class="p">):</span>
+ <span class="nb">setattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">arg_name</span><span class="p">,</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">arg_value</span><span class="p">))</span>
+
+
+<span class="k">def</span> <span class="nf">update_attributes_for_tor</span><span class="p">(</span><span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">using_tor_proxy</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;onion_url&#39;</span><span class="p">):</span>
+ <span class="n">engine</span><span class="o">.</span><span class="n">search_url</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">onion_url</span> <span class="o">+</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;search_path&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">engine</span><span class="o">.</span><span class="n">timeout</span> <span class="o">+=</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;outgoing&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;extra_proxy_timeout&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+
+<div class="viewcode-block" id="is_missing_required_attributes">
+<a class="viewcode-back" href="../../dev/engines/engines.html#searx.engines.is_missing_required_attributes">[docs]</a>
+<span class="k">def</span> <span class="nf">is_missing_required_attributes</span><span class="p">(</span><span class="n">engine</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;An attribute is required when its name doesn&#39;t start with ``_`` (underline).</span>
+<span class="sd"> Required attributes must not be ``None``.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">missing</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="k">for</span> <span class="n">engine_attr</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">engine</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">engine_attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">engine_attr</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;Missing engine config attribute: &quot;</span><span class="si">{0}</span><span class="s1">.</span><span class="si">{1}</span><span class="s1">&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">engine</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">engine_attr</span><span class="p">))</span>
+ <span class="n">missing</span> <span class="o">=</span> <span class="kc">True</span>
+ <span class="k">return</span> <span class="n">missing</span></div>
+
+
+
+<div class="viewcode-block" id="using_tor_proxy">
+<a class="viewcode-back" href="../../dev/engines/engines.html#searx.engines.using_tor_proxy">[docs]</a>
+<span class="k">def</span> <span class="nf">using_tor_proxy</span><span class="p">(</span><span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return True if the engine configuration declares to use Tor.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;outgoing&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;using_tor_proxy&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;using_tor_proxy&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">is_engine_active</span><span class="p">(</span><span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">):</span>
+ <span class="c1"># check if engine is inactive</span>
+ <span class="k">if</span> <span class="n">engine</span><span class="o">.</span><span class="n">inactive</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="c1"># exclude onion engines if not using tor</span>
+ <span class="k">if</span> <span class="s1">&#39;onions&#39;</span> <span class="ow">in</span> <span class="n">engine</span><span class="o">.</span><span class="n">categories</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">using_tor_proxy</span><span class="p">(</span><span class="n">engine</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="k">return</span> <span class="kc">True</span>
+
+
+<span class="k">def</span> <span class="nf">register_engine</span><span class="p">(</span><span class="n">engine</span><span class="p">:</span> <span class="n">Engine</span> <span class="o">|</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">engine</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">engines</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;Engine config error: ambiguous name: </span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">engine</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="n">engines</span><span class="p">[</span><span class="n">engine</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine</span>
+
+ <span class="k">if</span> <span class="n">engine</span><span class="o">.</span><span class="n">shortcut</span> <span class="ow">in</span> <span class="n">engine_shortcuts</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;Engine config error: ambiguous shortcut: </span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">engine</span><span class="o">.</span><span class="n">shortcut</span><span class="p">))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="n">engine_shortcuts</span><span class="p">[</span><span class="n">engine</span><span class="o">.</span><span class="n">shortcut</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">name</span>
+
+ <span class="k">for</span> <span class="n">category_name</span> <span class="ow">in</span> <span class="n">engine</span><span class="o">.</span><span class="n">categories</span><span class="p">:</span>
+ <span class="n">categories</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">category_name</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="load_engines">
+<a class="viewcode-back" href="../../dev/engines/engines.html#searx.engines.load_engines">[docs]</a>
+<span class="k">def</span> <span class="nf">load_engines</span><span class="p">(</span><span class="n">engine_list</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;usage: ``engine_list = settings[&#39;engines&#39;]``&quot;&quot;&quot;</span>
+ <span class="n">engines</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+ <span class="n">engine_shortcuts</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+ <span class="n">categories</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+ <span class="n">categories</span><span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">engine_data</span> <span class="ow">in</span> <span class="n">engine_list</span><span class="p">:</span>
+ <span class="n">engine</span> <span class="o">=</span> <span class="n">load_engine</span><span class="p">(</span><span class="n">engine_data</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">engine</span><span class="p">:</span>
+ <span class="n">register_engine</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">engines</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/annas_archive.html b/_modules/searx/engines/annas_archive.html
new file mode 100644
index 000000000..0c1badbe5
--- /dev/null
+++ b/_modules/searx/engines/annas_archive.html
@@ -0,0 +1,304 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.annas_archive &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.annas_archive</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.annas_archive</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;`Anna&#39;s Archive`_ is a free non-profit online shadow library metasearch</span>
+<span class="sd">engine providing access to a variety of book resources (also via IPFS), created</span>
+<span class="sd">by a team of anonymous archivists (AnnaArchivist_).</span>
+
+<span class="sd">.. _Anna&#39;s Archive: https://annas-archive.org/</span>
+<span class="sd">.. _AnnaArchivist: https://annas-software.org/AnnaArchivist/annas-archive</span>
+
+<span class="sd">Configuration</span>
+<span class="sd">=============</span>
+
+<span class="sd">The engine has the following additional settings:</span>
+
+<span class="sd">- :py:obj:`aa_content`</span>
+<span class="sd">- :py:obj:`aa_ext`</span>
+<span class="sd">- :py:obj:`aa_sort`</span>
+
+<span class="sd">With this options a SearXNG maintainer is able to configure **additional**</span>
+<span class="sd">engines for specific searches in Anna&#39;s Archive. For example a engine to search</span>
+<span class="sd">for *newest* articles and journals (PDF) / by shortcut ``!aaa &lt;search-term&gt;``.</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: annas articles</span>
+<span class="sd"> engine: annas_archive</span>
+<span class="sd"> shortcut: aaa</span>
+<span class="sd"> aa_content: &#39;magazine&#39;</span>
+<span class="sd"> aa_ext: &#39;pdf&#39;</span>
+<span class="sd"> aa_sort: &#39;newest&#39;</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Optional</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">quote</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">eval_xpath_list</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">ENGINE_TRAITS</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s2">&quot;https://annas-archive.org/&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s2">&quot;Q115288326&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s2">&quot;HTML&quot;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;files&quot;</span><span class="p">]</span>
+<span class="n">paging</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
+
+<span class="c1"># search-url</span>
+<span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;https://annas-archive.org&quot;</span>
+<span class="n">aa_content</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+<span class="sd">&quot;&quot;&quot;Anan&#39;s search form field **Content** / possible values::</span>
+
+<span class="sd"> book_fiction, book_unknown, book_nonfiction,</span>
+<span class="sd"> book_comic, magazine, standards_document</span>
+
+<span class="sd">To not filter use an empty string (default).</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="n">aa_sort</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="sd">&quot;&quot;&quot;Sort Anna&#39;s results, possible values::</span>
+
+<span class="sd"> newest, oldest, largest, smallest</span>
+
+<span class="sd">To sort by *most relevant* use an empty string (default).&quot;&quot;&quot;</span>
+
+<span class="n">aa_ext</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="sd">&quot;&quot;&quot;Filter Anna&#39;s results by a file ending. Common filters for example are</span>
+<span class="sd">``pdf`` and ``epub``.</span>
+
+<span class="sd">.. note::</span>
+
+<span class="sd"> Anna&#39;s Archive is a beta release: Filter results by file extension does not</span>
+<span class="sd"> really work on Anna&#39;s Archive.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="init">
+<a class="viewcode-back" href="../../../dev/engines/online/annas_archive.html#searx.engines.annas_archive.init">[docs]</a>
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="c1"># pylint: disable=unused-argument</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Check of engine&#39;s settings.&quot;&quot;&quot;</span>
+ <span class="n">traits</span> <span class="o">=</span> <span class="n">EngineTraits</span><span class="p">(</span><span class="o">**</span><span class="n">ENGINE_TRAITS</span><span class="p">[</span><span class="s1">&#39;annas archive&#39;</span><span class="p">])</span>
+
+ <span class="k">if</span> <span class="n">aa_content</span> <span class="ow">and</span> <span class="n">aa_content</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;content&#39;</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="s1">&#39;invalid setting content: </span><span class="si">{</span><span class="n">aa_content</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">aa_sort</span> <span class="ow">and</span> <span class="n">aa_sort</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;sort&#39;</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="s1">&#39;invalid setting sort: </span><span class="si">{</span><span class="n">aa_sort</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">aa_ext</span> <span class="ow">and</span> <span class="n">aa_ext</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;ext&#39;</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="s1">&#39;invalid setting ext: </span><span class="si">{</span><span class="n">aa_ext</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
+ <span class="n">q</span> <span class="o">=</span> <span class="n">quote</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;language&quot;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">params</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot;/search?lang=</span><span class="si">{</span><span class="n">lang</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;&#39;</span><span class="si">}</span><span class="s2">&amp;content=</span><span class="si">{</span><span class="n">aa_content</span><span class="si">}</span><span class="s2">&amp;ext=</span><span class="si">{</span><span class="n">aa_ext</span><span class="si">}</span><span class="s2">&amp;sort=</span><span class="si">{</span><span class="n">aa_sort</span><span class="si">}</span><span class="s2">&amp;q=</span><span class="si">{</span><span class="n">q</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]]:</span>
+ <span class="n">results</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//main//div[contains(@class, &quot;h-[125]&quot;)]/a&#39;</span><span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_get_result</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
+
+ <span class="c1"># The rendering of the WEB page is very strange; except the first position</span>
+ <span class="c1"># all other positions of Anna&#39;s result page are enclosed in SGML comments.</span>
+ <span class="c1"># These comments are *uncommented* by some JS code, see query of class</span>
+ <span class="c1"># &#39;.js-scroll-hidden&#39; in Anna&#39;s HTML template:</span>
+ <span class="c1"># https://annas-software.org/AnnaArchivist/annas-archive/-/blob/main/allthethings/templates/macros/md5_list.html</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//main//div[contains(@class, &quot;js-scroll-hidden&quot;)]&#39;</span><span class="p">):</span>
+ <span class="n">item</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;./comment()&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_get_result</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">_get_result</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;paper.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">base_url</span> <span class="o">+</span> <span class="n">item</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;./@href&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//h3/text()[1]&#39;</span><span class="p">)),</span>
+ <span class="s1">&#39;publisher&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;text-sm&quot;)]&#39;</span><span class="p">)),</span>
+ <span class="s1">&#39;authors&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;italic&quot;)]&#39;</span><span class="p">))],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;text-xs&quot;)]&#39;</span><span class="p">)),</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//img/@src&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span>
+ <span class="p">}</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/annas_archive.html#searx.engines.annas_archive.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages and other search arguments from Anna&#39;s search form.&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+
+ <span class="kn">import</span> <span class="nn">babel</span>
+ <span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+ <span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;ext&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;sort&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;/search&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Response from Anna&#39;s search page is not OK.&quot;</span><span class="p">)</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="c1"># supported language codes</span>
+
+ <span class="n">lang_map</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//form//input[@name=&#39;lang&#39;]&quot;</span><span class="p">):</span>
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">eng_lang</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;_empty&#39;</span><span class="p">,</span> <span class="s1">&#39;nl-BE&#39;</span><span class="p">,</span> <span class="s1">&#39;und&#39;</span><span class="p">):</span>
+ <span class="k">continue</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="n">lang_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_lang</span><span class="p">,</span> <span class="n">eng_lang</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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="c1"># silently ignore unknown languages</span>
+ <span class="c1"># print(&quot;ERROR: %s -&gt; %s is unknown by babel&quot; % (x.get(&quot;data-name&quot;), eng_lang))</span>
+ <span class="k">continue</span>
+ <span class="n">sxng_lang</span> <span class="o">=</span> <span class="n">language_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)</span>
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_lang</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_lang</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_lang</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_lang</span>
+
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//form//input[@name=&#39;content&#39;]&quot;</span><span class="p">):</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">))</span>
+
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//form//input[@name=&#39;ext&#39;]&quot;</span><span class="p">):</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;ext&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">))</span>
+
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//form//select[@name=&#39;sort&#39;]//option&quot;</span><span class="p">):</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;sort&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">))</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/archlinux.html b/_modules/searx/engines/archlinux.html
new file mode 100644
index 000000000..be4ce7c6c
--- /dev/null
+++ b/_modules/searx/engines/archlinux.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.archlinux &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.archlinux</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.archlinux</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;</span>
+<span class="sd">Arch Linux Wiki</span>
+<span class="sd">~~~~~~~~~~~~~~~</span>
+
+<span class="sd">This implementation does not use a official API: Mediawiki provides API, but</span>
+<span class="sd">Arch Wiki blocks access to it.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span><span class="p">,</span> <span class="n">urljoin</span><span class="p">,</span> <span class="n">urlparse</span>
+<span class="kn">import</span> <span class="nn">lxml</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">,</span> <span class="n">eval_xpath_getindex</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://wiki.archlinux.org/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q101445877&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;it&#39;</span><span class="p">,</span> <span class="s1">&#39;software wikis&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">main_wiki</span> <span class="o">=</span> <span class="s1">&#39;wiki.archlinux.org&#39;</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+
+ <span class="n">sxng_lang</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">netloc</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_lang</span><span class="p">,</span> <span class="n">main_wiki</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">title</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_lang</span><span class="p">,</span> <span class="s1">&#39;Special:Search&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span> <span class="o">+</span> <span class="n">netloc</span> <span class="o">+</span> <span class="s1">&#39;/index.php?&#39;</span>
+ <span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">20</span>
+
+ <span class="k">if</span> <span class="n">netloc</span> <span class="o">==</span> <span class="n">main_wiki</span><span class="p">:</span>
+ <span class="n">eng_lang</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">sxng_lang</span><span class="p">,</span> <span class="s1">&#39;English&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">query</span> <span class="o">+=</span> <span class="s1">&#39; (&#39;</span> <span class="o">+</span> <span class="n">eng_lang</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span>
+ <span class="k">elif</span> <span class="n">netloc</span> <span class="o">==</span> <span class="s1">&#39;wiki.archlinuxcn.org&#39;</span><span class="p">:</span>
+ <span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span> <span class="o">+</span> <span class="n">netloc</span> <span class="o">+</span> <span class="s1">&#39;/wzh/index.php?&#39;</span>
+
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;search&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;limit&#39;</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span>
+ <span class="s1">&#39;offset&#39;</span><span class="p">:</span> <span class="n">offset</span><span class="p">,</span>
+ <span class="s1">&#39;profile&#39;</span><span class="p">:</span> <span class="s1">&#39;default&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="c1"># get the base URL for the language in which request was made</span>
+ <span class="n">sxng_lang</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">search_params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">netloc</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_lang</span><span class="p">,</span> <span class="n">main_wiki</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span> <span class="o">+</span> <span class="n">netloc</span> <span class="o">+</span> <span class="s1">&#39;/index.php?&#39;</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//ul[@class=&quot;mw-search-results&quot;]/li&#39;</span><span class="p">):</span>
+ <span class="n">link</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;mw-search-result-heading&quot;]/a&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//div[@class=&quot;searchresult&quot;]&#39;</span><span class="p">))</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">urljoin</span><span class="p">(</span><span class="n">base_url</span><span class="p">,</span> <span class="n">link</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;href&#39;</span><span class="p">)),</span> <span class="c1"># type: ignore</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">link</span><span class="p">),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/archlinux.html#searx.engines.archlinux.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages from Archlinux-Wiki. The location of the Wiki address of a</span>
+<span class="sd"> language is mapped in a :py:obj:`custom field</span>
+<span class="sd"> &lt;searx.enginelib.traits.EngineTraits.custom&gt;` (``wiki_netloc``). Depending</span>
+<span class="sd"> on the location, the ``title`` argument in the request is translated.</span>
+
+<span class="sd"> .. code:: python</span>
+
+<span class="sd"> &quot;custom&quot;: {</span>
+<span class="sd"> &quot;wiki_netloc&quot;: {</span>
+<span class="sd"> &quot;de&quot;: &quot;wiki.archlinux.de&quot;,</span>
+<span class="sd"> # ...</span>
+<span class="sd"> &quot;zh&quot;: &quot;wiki.archlinuxcn.org&quot;</span>
+<span class="sd"> }</span>
+<span class="sd"> &quot;title&quot;: {</span>
+<span class="sd"> &quot;de&quot;: &quot;Spezial:Suche&quot;,</span>
+<span class="sd"> # ...</span>
+<span class="sd"> &quot;zh&quot;: &quot;Special:\u641c\u7d22&quot;</span>
+<span class="sd"> },</span>
+<span class="sd"> },</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+ <span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">title_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;de&#39;</span><span class="p">:</span> <span class="s1">&#39;Spezial:Suche&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fa&#39;</span><span class="p">:</span> <span class="s1">&#39;ویژه:جستجو&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ja&#39;</span><span class="p">:</span> <span class="s1">&#39;特別:検索&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;zh&#39;</span><span class="p">:</span> <span class="s1">&#39;Special:搜索&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://wiki.archlinux.org/&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from wiki.archlinux.org is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//a[@class=&#39;interlanguage-link-target&#39;]&quot;</span><span class="p">):</span>
+
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;lang&#39;</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="c1"># zh_Hans --&gt; zh</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">sxng_tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+
+ <span class="n">netloc</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;href&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">netloc</span>
+ <span class="k">if</span> <span class="n">netloc</span> <span class="o">!=</span> <span class="s1">&#39;wiki.archlinux.org&#39;</span><span class="p">:</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">title_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">title</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: title tag from </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">) is unknown&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">netloc</span><span class="p">,</span> <span class="n">sxng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">][</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">netloc</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">][</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">title</span> <span class="c1"># type: ignore</span>
+
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s2">&quot;.//span&quot;</span><span class="p">))</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span> <span class="c1"># type: ignore</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="s1">&#39;en&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;English&#39;</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/bing.html b/_modules/searx/engines/bing.html
new file mode 100644
index 000000000..9af7873ab
--- /dev/null
+++ b/_modules/searx/engines/bing.html
@@ -0,0 +1,382 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.bing &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.bing</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.bing</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;This is the implementation of the Bing-WEB engine. Some of this</span>
+<span class="sd">implementations are shared by other engines:</span>
+
+<span class="sd">- :ref:`bing images engine`</span>
+<span class="sd">- :ref:`bing news engine`</span>
+<span class="sd">- :ref:`bing videos engine`</span>
+
+<span class="sd">On the `preference page`_ Bing offers a lot of languages an regions (see section</span>
+<span class="sd">LANGUAGE and COUNTRY/REGION). The Language is the language of the UI, we need</span>
+<span class="sd">in SearXNG to get the translations of data such as *&quot;published last week&quot;*.</span>
+
+<span class="sd">There is a description of the offical search-APIs_, unfortunately this is not</span>
+<span class="sd">the API we can use or that bing itself would use. You can look up some things</span>
+<span class="sd">in the API to get a better picture of bing, but the value specifications like</span>
+<span class="sd">the market codes are usually outdated or at least no longer used by bing itself.</span>
+
+<span class="sd">The market codes have been harmonized and are identical for web, video and</span>
+<span class="sd">images. The news area has also been harmonized with the other categories. Only</span>
+<span class="sd">political adjustments still seem to be made -- for example, there is no news</span>
+<span class="sd">category for the Chinese market.</span>
+
+<span class="sd">.. _preference page: https://www.bing.com/account/general</span>
+<span class="sd">.. _search-APIs: https://learn.microsoft.com/en-us/bing/search-apis/</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=too-many-branches, invalid-name</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">import</span> <span class="nn">base64</span>
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">time</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">parse_qs</span><span class="p">,</span> <span class="n">urlencode</span><span class="p">,</span> <span class="n">urlparse</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+<span class="kn">import</span> <span class="nn">babel.languages</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">,</span> <span class="n">eval_xpath_getindex</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span><span class="p">,</span> <span class="n">region_tag</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.bing.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q182496&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.microsoft.com/en-us/bing/apis/bing-web-search-api&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">200</span>
+<span class="sd">&quot;&quot;&quot;200 pages maximum (``&amp;first=1991``)&quot;&quot;&quot;</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="sd">&quot;&quot;&quot;Bing results are always SFW. To get NSFW links from bing some age</span>
+<span class="sd">verification by a cookie is needed / thats not possible in SearXNG.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://www.bing.com/search&#39;</span>
+<span class="sd">&quot;&quot;&quot;Bing (Web) search URL&quot;&quot;&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">_page_offset</span><span class="p">(</span><span class="n">pageno</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">pageno</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="mi">1</span>
+
+
+<span class="k">def</span> <span class="nf">set_bing_cookies</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">engine_language</span><span class="p">,</span> <span class="n">engine_region</span><span class="p">):</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;_EDGE_CD&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;m=</span><span class="si">{</span><span class="n">engine_region</span><span class="si">}</span><span class="s1">&amp;u=</span><span class="si">{</span><span class="n">engine_language</span><span class="si">}</span><span class="s1">&#39;</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;_EDGE_S&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;mkt=</span><span class="si">{</span><span class="n">engine_region</span><span class="si">}</span><span class="s1">&amp;ui=</span><span class="si">{</span><span class="n">engine_language</span><span class="si">}</span><span class="s1">&#39;</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;bing cookies: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">])</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble a Bing-Web request.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_region</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">engine_language</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">set_bing_cookies</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">engine_language</span><span class="p">,</span> <span class="n">engine_region</span><span class="p">)</span>
+
+ <span class="n">page</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pageno&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="c1"># if arg &#39;pq&#39; is missed, somtimes on page 4 we get results from page 1,</span>
+ <span class="c1"># don&#39;t ask why it is only sometimes / its M$ and they have never been</span>
+ <span class="c1"># deterministic ;)</span>
+ <span class="s1">&#39;pq&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="c1"># To get correct page, arg first and this arg FORM is needed, the value PERE</span>
+ <span class="c1"># is on page 2, on page 3 its PERE1 and on page 4 its PERE2 .. and so forth.</span>
+ <span class="c1"># The &#39;first&#39; arg should never send on page 1.</span>
+
+ <span class="k">if</span> <span class="n">page</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;first&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_page_offset</span><span class="p">(</span><span class="n">page</span><span class="p">)</span> <span class="c1"># see also arg FORM</span>
+ <span class="k">if</span> <span class="n">page</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;FORM&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;PERE&#39;</span>
+ <span class="k">elif</span> <span class="n">page</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;FORM&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;PERE</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">page</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s1">?</span><span class="si">{</span><span class="n">urlencode</span><span class="p">(</span><span class="n">query_params</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;time_range&#39;</span><span class="p">):</span>
+ <span class="n">unix_day</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">/</span> <span class="mi">86400</span><span class="p">)</span>
+ <span class="n">time_ranges</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="s1">&#39;2&#39;</span><span class="p">,</span> <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="s1">&#39;3&#39;</span><span class="p">,</span> <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s1">&#39;5_</span><span class="si">{</span><span class="n">unix_day</span><span class="o">-</span><span class="mi">365</span><span class="si">}</span><span class="s1">_</span><span class="si">{</span><span class="n">unix_day</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">}</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="sa">f</span><span class="s1">&#39;&amp;filters=ex1:&quot;ez</span><span class="si">{</span><span class="n">time_ranges</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;time_range&quot;</span><span class="p">]]</span><span class="si">}</span><span class="s1">&quot;&#39;</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="c1"># pylint: disable=too-many-locals</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">result_len</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="c1"># parse results again if nothing is found yet</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//ol[@id=&quot;b_results&quot;]/li[contains(@class, &quot;b_algo&quot;)]&#39;</span><span class="p">):</span>
+
+ <span class="n">link</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//h2/a&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">link</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">link</span><span class="o">.</span><span class="n">attrib</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;href&#39;</span><span class="p">)</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">link</span><span class="p">)</span>
+
+ <span class="n">content</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//p&#39;</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">content</span><span class="p">:</span>
+ <span class="c1"># Make sure that the element is free of:</span>
+ <span class="c1"># &lt;span class=&quot;algoSlug_icon&quot; # data-priority=&quot;2&quot;&gt;Web&lt;/span&gt;</span>
+ <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">p</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//span[@class=&quot;algoSlug_icon&quot;]&#39;</span><span class="p">):</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">getparent</span><span class="p">()</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
+
+ <span class="c1"># get the real URL</span>
+ <span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://www.bing.com/ck/a?&#39;</span><span class="p">):</span>
+ <span class="c1"># get the first value of u parameter</span>
+ <span class="n">url_query</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">query</span>
+ <span class="n">parsed_url_query</span> <span class="o">=</span> <span class="n">parse_qs</span><span class="p">(</span><span class="n">url_query</span><span class="p">)</span>
+ <span class="n">param_u</span> <span class="o">=</span> <span class="n">parsed_url_query</span><span class="p">[</span><span class="s2">&quot;u&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+ <span class="c1"># remove &quot;a1&quot; in front</span>
+ <span class="n">encoded_url</span> <span class="o">=</span> <span class="n">param_u</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span>
+ <span class="c1"># add padding</span>
+ <span class="n">encoded_url</span> <span class="o">=</span> <span class="n">encoded_url</span> <span class="o">+</span> <span class="s1">&#39;=&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="n">encoded_url</span><span class="p">)</span> <span class="o">%</span> <span class="mi">4</span><span class="p">)</span>
+ <span class="c1"># decode base64 encoded URL</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">urlsafe_b64decode</span><span class="p">(</span><span class="n">encoded_url</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
+
+ <span class="c1"># append result</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">})</span>
+
+ <span class="c1"># get number_of_results</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">result_len_container</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//span[@class=&quot;sb_count&quot;]//text()&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="s2">&quot;-&quot;</span> <span class="ow">in</span> <span class="n">result_len_container</span><span class="p">:</span>
+
+ <span class="c1"># Remove the part &quot;from-to&quot; for paginated request ...</span>
+ <span class="n">result_len_container</span> <span class="o">=</span> <span class="n">result_len_container</span><span class="p">[</span><span class="n">result_len_container</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span> <span class="p">:]</span>
+
+ <span class="n">result_len_container</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s1">&#39;[^0-9]&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">result_len_container</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result_len_container</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">result_len</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">result_len_container</span><span class="p">)</span>
+
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;result error :</span><span class="se">\n</span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">result_len</span> <span class="ow">and</span> <span class="n">_page_offset</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">search_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;pageno&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span> <span class="o">&gt;</span> <span class="n">result_len</span><span class="p">:</span>
+ <span class="c1"># Avoid reading more results than avalaible.</span>
+ <span class="c1"># For example, if there is 100 results from some search and we try to get results from 120 to 130,</span>
+ <span class="c1"># Bing will send back the results from 0 to 10 and no error.</span>
+ <span class="c1"># If we compare results count with the first parameter of the request we can avoid this &quot;invalid&quot; results.</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;number_of_results&#39;</span><span class="p">:</span> <span class="n">result_len</span><span class="p">})</span>
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages and regions from Bing-Web.&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+
+ <span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s2">&quot;https://www.bing.com/account/general&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from bing is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="c1"># languages</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="s1">&#39;zh&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;zh-hans&#39;</span>
+
+ <span class="n">map_lang</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;prs&#39;</span><span class="p">:</span> <span class="s1">&#39;fa-AF&#39;</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">:</span> <span class="s1">&#39;en-us&#39;</span><span class="p">}</span>
+ <span class="n">bing_ui_lang_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="c1"># HINT: this list probably needs to be supplemented</span>
+ <span class="s1">&#39;en&#39;</span><span class="p">:</span> <span class="s1">&#39;us&#39;</span><span class="p">,</span> <span class="c1"># en --&gt; en-us</span>
+ <span class="s1">&#39;da&#39;</span><span class="p">:</span> <span class="s1">&#39;dk&#39;</span><span class="p">,</span> <span class="c1"># da --&gt; da-dk</span>
+ <span class="p">}</span>
+
+ <span class="k">for</span> <span class="n">href</span> <span class="ow">in</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@id=&quot;language-section&quot;]//li/a/@href&#39;</span><span class="p">):</span>
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">parse_qs</span><span class="p">(</span><span class="n">urlparse</span><span class="p">(</span><span class="n">href</span><span class="p">)</span><span class="o">.</span><span class="n">query</span><span class="p">)[</span><span class="s1">&#39;setlang&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">babel_lang</span> <span class="o">=</span> <span class="n">map_lang</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_lang</span><span class="p">,</span> <span class="n">eng_lang</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">babel_lang</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">)))</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="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: language (</span><span class="si">%s</span><span class="s2">) is unknown by babel&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">babel_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="c1"># Language (e.g. &#39;en&#39; or &#39;de&#39;) from https://www.bing.com/account/general</span>
+ <span class="c1"># is converted by bing to &#39;en-us&#39; or &#39;de-de&#39;. But only if there is not</span>
+ <span class="c1"># already a &#39;-&#39; delemitter in the language. For instance &#39;pt-PT&#39; --&gt;</span>
+ <span class="c1"># &#39;pt-pt&#39; and &#39;pt-br&#39; --&gt; &#39;pt-br&#39;</span>
+ <span class="n">bing_ui_lang</span> <span class="o">=</span> <span class="n">eng_lang</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">bing_ui_lang</span><span class="p">:</span>
+ <span class="n">bing_ui_lang</span> <span class="o">=</span> <span class="n">bing_ui_lang</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">bing_ui_lang_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">bing_ui_lang</span><span class="p">,</span> <span class="n">bing_ui_lang</span><span class="p">)</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">bing_ui_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">{</span><span class="n">sxng_tag</span><span class="si">}</span><span class="s2"> --&gt; </span><span class="si">{</span><span class="n">conflict</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">bing_ui_lang</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">bing_ui_lang</span>
+
+ <span class="c1"># regions (aka &quot;market codes&quot;)</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="s1">&#39;zh-CN&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;zh-cn&#39;</span>
+
+ <span class="n">map_market_codes</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;zh-hk&#39;</span><span class="p">:</span> <span class="s1">&#39;en-hk&#39;</span><span class="p">,</span> <span class="c1"># not sure why, but at M$ this is the market code for Hongkong</span>
+ <span class="p">}</span>
+ <span class="k">for</span> <span class="n">href</span> <span class="ow">in</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@id=&quot;region-section&quot;]//li/a/@href&#39;</span><span class="p">):</span>
+ <span class="n">cc_tag</span> <span class="o">=</span> <span class="n">parse_qs</span><span class="p">(</span><span class="n">urlparse</span><span class="p">(</span><span class="n">href</span><span class="p">)</span><span class="o">.</span><span class="n">query</span><span class="p">)[</span><span class="s1">&#39;cc&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">cc_tag</span> <span class="o">==</span> <span class="s1">&#39;clear&#39;</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="n">cc_tag</span>
+ <span class="k">continue</span>
+
+ <span class="c1"># add market codes from official languages of the country ..</span>
+ <span class="k">for</span> <span class="n">lang_tag</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="n">cc_tag</span><span class="p">,</span> <span class="n">de_facto</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">lang_tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
+ <span class="c1"># print(&quot;ignore lang: %s &lt;-- %s&quot; % (cc_tag, lang_tag))</span>
+ <span class="k">continue</span>
+ <span class="n">lang_tag</span> <span class="o">=</span> <span class="n">lang_tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># zh_Hant --&gt; zh</span>
+ <span class="n">market_code</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">lang_tag</span><span class="si">}</span><span class="s2">-</span><span class="si">{</span><span class="n">cc_tag</span><span class="si">}</span><span class="s2">&quot;</span> <span class="c1"># zh-tw</span>
+
+ <span class="n">market_code</span> <span class="o">=</span> <span class="n">map_market_codes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">market_code</span><span class="p">,</span> <span class="n">market_code</span><span class="p">)</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">region_tag</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">parse</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">_</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">lang_tag</span><span class="p">,</span> <span class="n">cc_tag</span><span class="o">.</span><span class="n">upper</span><span class="p">())))</span>
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">market_code</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">market_code</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">market_code</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/bing_images.html b/_modules/searx/engines/bing_images.html
new file mode 100644
index 000000000..11b5a77bc
--- /dev/null
+++ b/_modules/searx/engines/bing_images.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.bing_images &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.bing_images</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.bing_images</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;Bing-Images: description see :py:obj:`searx.engines.bing`.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=invalid-name</span>
+
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.engines.bing</span> <span class="kn">import</span> <span class="n">set_bing_cookies</span>
+<span class="kn">from</span> <span class="nn">searx.engines.bing</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="c1"># pylint: disable=unused-import</span>
+
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.bing.com/images&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q182496&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.microsoft.com/en-us/bing/apis/bing-image-search-api&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;images&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://www.bing.com/images/async&#39;</span>
+<span class="sd">&quot;&quot;&quot;Bing (Images) search URL&quot;&quot;&quot;</span>
+
+<span class="n">time_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span><span class="p">,</span>
+ <span class="s1">&#39;week&#39;</span><span class="p">:</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="p">,</span>
+ <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">31</span><span class="p">,</span>
+ <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">365</span><span class="p">,</span>
+<span class="p">}</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing_images.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble a Bing-Image request.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_region</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">engine_language</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">set_bing_cookies</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">engine_language</span><span class="p">,</span> <span class="n">engine_region</span><span class="p">)</span>
+
+ <span class="c1"># build URL query</span>
+ <span class="c1"># - example: https://www.bing.com/images/async?q=foo&amp;async=content&amp;first=1&amp;count=35</span>
+ <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;async&#39;</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span>
+ <span class="c1"># to simplify the page count lets use the default of 35 images per page</span>
+ <span class="s1">&#39;first&#39;</span><span class="p">:</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pageno&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">35</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="s1">&#39;count&#39;</span><span class="p">:</span> <span class="mi">35</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="c1"># time range</span>
+ <span class="c1"># - example: one year (525600 minutes) &#39;qft=+filterui:age-lt525600&#39;</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;qft&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;filterui:age-lt</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">time_map</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">query_params</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing_images.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get response from Bing-Images&quot;&quot;&quot;</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//ul[contains(@class, &quot;dgControl_list&quot;)]/li&#39;</span><span class="p">):</span>
+
+ <span class="n">metadata</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//a[@class=&quot;iusc&quot;]/@m&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">metadata</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">metadata</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//a[@class=&quot;iusc&quot;]/@m&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//div[@class=&quot;infnmpt&quot;]//a/text()&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="n">img_format</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//div[@class=&quot;imgpt&quot;]/div/span/text()&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot; · &quot;</span><span class="p">)</span>
+ <span class="n">source</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//div[@class=&quot;imgpt&quot;]//div[@class=&quot;lnkw&quot;]//a/text()&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;images.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">metadata</span><span class="p">[</span><span class="s1">&#39;purl&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;thumbnail_src&#39;</span><span class="p">:</span> <span class="n">metadata</span><span class="p">[</span><span class="s1">&#39;turl&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">metadata</span><span class="p">[</span><span class="s1">&#39;murl&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">metadata</span><span class="p">[</span><span class="s1">&#39;desc&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;source&#39;</span><span class="p">:</span> <span class="n">source</span><span class="p">,</span>
+ <span class="s1">&#39;resolution&#39;</span><span class="p">:</span> <span class="n">img_format</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
+ <span class="s1">&#39;img_format&#39;</span><span class="p">:</span> <span class="n">img_format</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">img_format</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/bing_news.html b/_modules/searx/engines/bing_news.html
new file mode 100644
index 000000000..741ff6e47
--- /dev/null
+++ b/_modules/searx/engines/bing_news.html
@@ -0,0 +1,279 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.bing_news &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.bing_news</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.bing_news</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;Bing-News: description see :py:obj:`searx.engines.bing`.</span>
+
+<span class="sd">.. hint::</span>
+
+<span class="sd"> Bing News is *different* in some ways!</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="c1"># pylint: disable=invalid-name</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">,</span> <span class="n">eval_xpath_getindex</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.engines.bing</span> <span class="kn">import</span> <span class="n">set_bing_cookies</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.bing.com/news&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q2878637&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.microsoft.com/en-us/bing/apis/bing-news-search-api&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;RSS&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;news&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="sd">&quot;&quot;&quot;If go through the pages and there are actually no new results for another</span>
+<span class="sd">page, then bing returns the results from the last page again.&quot;&quot;&quot;</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="s1">&#39;interval=&quot;4&quot;&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="s1">&#39;interval=&quot;7&quot;&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="s1">&#39;interval=&quot;9&quot;&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;A string &#39;4&#39; means *last hour*. We use *last hour* for ``day`` here since the</span>
+<span class="sd">difference of *last day* and *last week* in the result list is just marginally.</span>
+<span class="sd">Bing does not have news range ``year`` / we use ``month`` instead.&quot;&quot;&quot;</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://www.bing.com/news/infinitescrollajax&#39;</span>
+<span class="sd">&quot;&quot;&quot;Bing (News) search URL&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing_news.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble a Bing-News request.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_region</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">engine_language</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">set_bing_cookies</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">engine_language</span><span class="p">,</span> <span class="n">engine_region</span><span class="p">)</span>
+
+ <span class="c1"># build URL query</span>
+ <span class="c1">#</span>
+ <span class="c1"># example: https://www.bing.com/news/infinitescrollajax?q=london&amp;first=1</span>
+
+ <span class="n">page</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pageno&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span>
+ <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;InfiniteScroll&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="c1"># to simplify the page count lets use the default of 10 images per page</span>
+ <span class="s1">&#39;first&#39;</span><span class="p">:</span> <span class="n">page</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="s1">&#39;SFX&#39;</span><span class="p">:</span> <span class="n">page</span><span class="p">,</span>
+ <span class="s1">&#39;form&#39;</span><span class="p">:</span> <span class="s1">&#39;PTFTNR&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;setlang&#39;</span><span class="p">:</span> <span class="n">engine_region</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span>
+ <span class="s1">&#39;cc&#39;</span><span class="p">:</span> <span class="n">engine_region</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;qft&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">time_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">],</span> <span class="s1">&#39;interval=&quot;9&quot;&#39;</span><span class="p">)</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">query_params</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing_news.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get response from Bing-Video&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">results</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">newsitem</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[contains(@class, &quot;newsitem&quot;)]&#39;</span><span class="p">):</span>
+
+ <span class="n">link</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">newsitem</span><span class="p">,</span> <span class="s1">&#39;.//a[@class=&quot;title&quot;]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">link</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">link</span><span class="o">.</span><span class="n">attrib</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;href&#39;</span><span class="p">)</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">link</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">newsitem</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;snippet&quot;]&#39;</span><span class="p">))</span>
+
+ <span class="n">metadata</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">source</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">newsitem</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;source&quot;)]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">source</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="p">(</span>
+ <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s1">&#39;.//span[@aria-label]/@aria-label&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
+ <span class="c1"># eval_xpath_getindex(source, &#39;.//a&#39;, 0, None),</span>
+ <span class="c1"># eval_xpath_getindex(source, &#39;./div/span&#39;, 3, None),</span>
+ <span class="n">link</span><span class="o">.</span><span class="n">attrib</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;data-author&#39;</span><span class="p">),</span>
+ <span class="p">):</span>
+ <span class="k">if</span> <span class="n">item</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">t</span> <span class="ow">and</span> <span class="n">t</span><span class="o">.</span><span class="n">strip</span><span class="p">():</span>
+ <span class="n">metadata</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
+ <span class="n">metadata</span> <span class="o">=</span> <span class="s1">&#39; | &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">metadata</span><span class="p">)</span>
+
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">imagelink</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">newsitem</span><span class="p">,</span> <span class="s1">&#39;.//a[@class=&quot;imagelink&quot;]//img&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">imagelink</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="s1">&#39;https://www.bing.com/&#39;</span> <span class="o">+</span> <span class="n">imagelink</span><span class="o">.</span><span class="n">attrib</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;src&#39;</span><span class="p">)</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">thumbnail</span><span class="p">,</span>
+ <span class="s1">&#39;metadata&#39;</span><span class="p">:</span> <span class="n">metadata</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing_news.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages and regions from Bing-News.&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+
+ <span class="kn">from</span> <span class="nn">searx.engines.bing</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="k">as</span> <span class="n">_f</span>
+
+ <span class="n">_f</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">)</span>
+
+ <span class="c1"># fix market codes not known by bing news:</span>
+
+ <span class="c1"># In bing the market code &#39;zh-cn&#39; exists, but there is no &#39;news&#39; category in</span>
+ <span class="c1"># bing for this market. Alternatively we use the the market code from Honk</span>
+ <span class="c1"># Kong. Even if this is not correct, it is better than having no hits at</span>
+ <span class="c1"># all, or sending false queries to bing that could raise the suspicion of a</span>
+ <span class="c1"># bot.</span>
+
+ <span class="c1"># HINT: &#39;en-hk&#39; is the region code it does not indicate the language en!!</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="s1">&#39;zh-CN&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;en-hk&#39;</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/bing_videos.html b/_modules/searx/engines/bing_videos.html
new file mode 100644
index 000000000..30de0935f
--- /dev/null
+++ b/_modules/searx/engines/bing_videos.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.bing_videos &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.bing_videos</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.bing_videos</h1><div class="highlight"><pre>
+<span></span><span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="c1"># pylint: disable=invalid-name</span>
+<span class="sd">&quot;&quot;&quot;Bing-Videos: description see :py:obj:`searx.engines.bing`.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.engines.bing</span> <span class="kn">import</span> <span class="n">set_bing_cookies</span>
+<span class="kn">from</span> <span class="nn">searx.engines.bing</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="c1"># pylint: disable=unused-import</span>
+<span class="kn">from</span> <span class="nn">searx.engines.bing_images</span> <span class="kn">import</span> <span class="n">time_map</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.bing.com/videos&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q4914152&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.microsoft.com/en-us/bing/apis/bing-video-search-api&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;videos&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://www.bing.com/videos/asyncv2&#39;</span>
+<span class="sd">&quot;&quot;&quot;Bing (Videos) async search URL.&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing_videos.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble a Bing-Video request.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_region</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">engine_language</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">set_bing_cookies</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">engine_language</span><span class="p">,</span> <span class="n">engine_region</span><span class="p">)</span>
+
+ <span class="c1"># build URL query</span>
+ <span class="c1">#</span>
+ <span class="c1"># example: https://www.bing.com/videos/asyncv2?q=foo&amp;async=content&amp;first=1&amp;count=35</span>
+
+ <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;async&#39;</span><span class="p">:</span> <span class="s1">&#39;content&#39;</span><span class="p">,</span>
+ <span class="c1"># to simplify the page count lets use the default of 35 images per page</span>
+ <span class="s1">&#39;first&#39;</span><span class="p">:</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pageno&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">35</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="s1">&#39;count&#39;</span><span class="p">:</span> <span class="mi">35</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="c1"># time range</span>
+ <span class="c1">#</span>
+ <span class="c1"># example: one week (10080 minutes) &#39;&amp;qft= filterui:videoage-lt10080&#39; &#39;&amp;form=VRFLTR&#39;</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;form&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;VRFLTR&#39;</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;qft&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39; filterui:videoage-lt</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">time_map</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">query_params</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/bing.html#searx.engines.bing_videos.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get response from Bing-Video&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//div[@class=&quot;dg_u&quot;]//div[contains(@id, &quot;mc_vtvc_video&quot;)]&#39;</span><span class="p">):</span>
+ <span class="n">metadata</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//div[@class=&quot;vrhdata&quot;]/@vrhm&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="n">info</span> <span class="o">=</span> <span class="s1">&#39; - &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//div[@class=&quot;mc_vtvc_meta_block&quot;]//span/text()&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1"> - </span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">metadata</span><span class="p">[</span><span class="s1">&#39;du&#39;</span><span class="p">],</span> <span class="n">info</span><span class="p">)</span>
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//div[contains(@class, &quot;mc_vtvc_th&quot;)]//img/@src&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">metadata</span><span class="p">[</span><span class="s1">&#39;murl&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;thumbnail&#39;</span><span class="p">:</span> <span class="n">thumbnail</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">metadata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;vt&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;videos.html&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/brave.html b/_modules/searx/engines/brave.html
new file mode 100644
index 000000000..fd01c92a0
--- /dev/null
+++ b/_modules/searx/engines/brave.html
@@ -0,0 +1,595 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.brave &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.brave</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.brave</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;Brave supports the categories listed in :py:obj:`brave_category` (General,</span>
+<span class="sd">news, videos, images). The support of :py:obj:`paging` and :py:obj:`time range</span>
+<span class="sd">&lt;time_range_support&gt;` is limited (see remarks).</span>
+
+<span class="sd">Configured ``brave`` engines:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: brave</span>
+<span class="sd"> engine: brave</span>
+<span class="sd"> ...</span>
+<span class="sd"> brave_category: search</span>
+<span class="sd"> time_range_support: true</span>
+<span class="sd"> paging: true</span>
+
+<span class="sd"> - name: brave.images</span>
+<span class="sd"> engine: brave</span>
+<span class="sd"> ...</span>
+<span class="sd"> brave_category: images</span>
+
+<span class="sd"> - name: brave.videos</span>
+<span class="sd"> engine: brave</span>
+<span class="sd"> ...</span>
+<span class="sd"> brave_category: videos</span>
+
+<span class="sd"> - name: brave.news</span>
+<span class="sd"> engine: brave</span>
+<span class="sd"> ...</span>
+<span class="sd"> brave_category: news</span>
+
+<span class="sd"> - name: brave.goggles</span>
+<span class="sd"> brave_category: goggles</span>
+<span class="sd"> time_range_support: true</span>
+<span class="sd"> paging: true</span>
+<span class="sd"> ...</span>
+<span class="sd"> brave_category: goggles</span>
+
+
+<span class="sd">.. _brave regions:</span>
+
+<span class="sd">Brave regions</span>
+<span class="sd">=============</span>
+
+<span class="sd">Brave uses two-digit tags for the regions like ``ca`` while SearXNG deals with</span>
+<span class="sd">locales. To get a mapping, all *officiat de-facto* languages of the Brave</span>
+<span class="sd">region are mapped to regions in SearXNG (see :py:obj:`babel</span>
+<span class="sd">&lt;babel.languages.get_official_languages&gt;`):</span>
+
+<span class="sd">.. code:: python</span>
+
+<span class="sd"> &quot;regions&quot;: {</span>
+<span class="sd"> ..</span>
+<span class="sd"> &quot;en-CA&quot;: &quot;ca&quot;,</span>
+<span class="sd"> &quot;fr-CA&quot;: &quot;ca&quot;,</span>
+<span class="sd"> ..</span>
+<span class="sd"> }</span>
+
+
+<span class="sd">.. note::</span>
+
+<span class="sd"> The language (aka region) support of Brave&#39;s index is limited to very basic</span>
+<span class="sd"> languages. The search results for languages like Chinese or Arabic are of</span>
+<span class="sd"> low quality.</span>
+
+
+<span class="sd">.. _brave googles:</span>
+
+<span class="sd">Brave Goggles</span>
+<span class="sd">=============</span>
+
+<span class="sd">.. _list of Goggles: https://search.brave.com/goggles/discover</span>
+<span class="sd">.. _Goggles Whitepaper: https://brave.com/static-assets/files/goggles.pdf</span>
+<span class="sd">.. _Goggles Quickstart: https://github.com/brave/goggles-quickstart</span>
+
+<span class="sd">Goggles allow you to choose, alter, or extend the ranking of Brave Search</span>
+<span class="sd">results (`Goggles Whitepaper`_). Goggles are openly developed by the community</span>
+<span class="sd">of Brave Search users.</span>
+
+<span class="sd">Select from the `list of Goggles`_ people have published, or create your own</span>
+<span class="sd">(`Goggles Quickstart`_).</span>
+
+
+<span class="sd">.. _brave languages:</span>
+
+<span class="sd">Brave languages</span>
+<span class="sd">===============</span>
+
+<span class="sd">Brave&#39;s language support is limited to the UI (menus, area local notations,</span>
+<span class="sd">etc). Brave&#39;s index only seems to support a locale, but it does not seem to</span>
+<span class="sd">support any languages in its index. The choice of available languages is very</span>
+<span class="sd">small (and its not clear to me where the difference in UI is when switching</span>
+<span class="sd">from en-us to en-ca or en-gb).</span>
+
+<span class="sd">In the :py:obj:`EngineTraits object &lt;searx.enginelib.traits.EngineTraits&gt;` the</span>
+<span class="sd">UI languages are stored in a custom field named ``ui_lang``:</span>
+
+<span class="sd">.. code:: python</span>
+
+<span class="sd"> &quot;custom&quot;: {</span>
+<span class="sd"> &quot;ui_lang&quot;: {</span>
+<span class="sd"> &quot;ca&quot;: &quot;ca&quot;,</span>
+<span class="sd"> &quot;de-DE&quot;: &quot;de-de&quot;,</span>
+<span class="sd"> &quot;en-CA&quot;: &quot;en-ca&quot;,</span>
+<span class="sd"> &quot;en-GB&quot;: &quot;en-gb&quot;,</span>
+<span class="sd"> &quot;en-US&quot;: &quot;en-us&quot;,</span>
+<span class="sd"> &quot;es&quot;: &quot;es&quot;,</span>
+<span class="sd"> &quot;fr-CA&quot;: &quot;fr-ca&quot;,</span>
+<span class="sd"> &quot;fr-FR&quot;: &quot;fr-fr&quot;,</span>
+<span class="sd"> &quot;ja-JP&quot;: &quot;ja-jp&quot;,</span>
+<span class="sd"> &quot;pt-BR&quot;: &quot;pt-br&quot;,</span>
+<span class="sd"> &quot;sq-AL&quot;: &quot;sq-al&quot;</span>
+<span class="sd"> }</span>
+<span class="sd"> },</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">urlencode</span><span class="p">,</span>
+ <span class="n">urlparse</span><span class="p">,</span>
+ <span class="n">parse_qs</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="kn">from</span> <span class="nn">dateutil</span> <span class="kn">import</span> <span class="n">parser</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">locales</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">extract_text</span><span class="p">,</span>
+ <span class="n">eval_xpath</span><span class="p">,</span>
+ <span class="n">eval_xpath_list</span><span class="p">,</span>
+ <span class="n">eval_xpath_getindex</span><span class="p">,</span>
+ <span class="n">js_variable_to_python</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://search.brave.com/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q22906900&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;https://search.brave.com/&quot;</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[]</span>
+<span class="n">brave_category</span> <span class="o">=</span> <span class="s1">&#39;search&#39;</span>
+<span class="n">Goggles</span> <span class="o">=</span> <span class="n">Any</span>
+<span class="sd">&quot;&quot;&quot;Brave supports common web-search, videos, images, news, and goggles search.</span>
+
+<span class="sd">- ``search``: Common WEB search</span>
+<span class="sd">- ``videos``: search for videos</span>
+<span class="sd">- ``images``: search for images</span>
+<span class="sd">- ``news``: search for news</span>
+<span class="sd">- ``goggles``: Common WEB search with custom rules</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">brave_spellcheck</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="sd">&quot;&quot;&quot;Brave supports some kind of spell checking. When activated, Brave tries to</span>
+<span class="sd">fix typos, e.g. it searches for ``food`` when the user queries for ``fooh``. In</span>
+<span class="sd">the UI of Brave the user gets warned about this, since we can not warn the user</span>
+<span class="sd">in SearXNG, the spellchecking is disabled by default.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="sd">&quot;&quot;&quot;Brave only supports paging in :py:obj:`brave_category` ``search`` (UI</span>
+<span class="sd">category All) and in the goggles category.&quot;&quot;&quot;</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">10</span>
+<span class="sd">&quot;&quot;&quot;Tested 9 pages maximum (``&amp;offset=8``), to be save max is set to 10. Trying</span>
+<span class="sd">to do more won&#39;t return any result and you will most likely be flagged as a bot.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch_map</span> <span class="o">=</span> <span class="p">{</span><span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;strict&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;moderate&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">:</span> <span class="s1">&#39;off&#39;</span><span class="p">}</span> <span class="c1"># cookie: safesearch=off</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="sd">&quot;&quot;&quot;Brave only supports time-range in :py:obj:`brave_category` ``search`` (UI</span>
+<span class="sd">category All) and in the goggles category.&quot;&quot;&quot;</span>
+
+<span class="n">time_range_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="s1">&#39;pd&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="s1">&#39;pw&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="s1">&#39;pm&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="s1">&#39;py&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+
+ <span class="c1"># Don&#39;t accept br encoding / see https://github.com/searxng/searxng/pull/1787</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;Accept-Encoding&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;gzip, deflate&#39;</span>
+
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="k">if</span> <span class="n">brave_spellcheck</span><span class="p">:</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;spellcheck&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span>
+
+ <span class="k">if</span> <span class="n">brave_category</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;search&#39;</span><span class="p">,</span> <span class="s1">&#39;goggles&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pageno&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pageno&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">time_range_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]):</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;tf&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">time_range_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">])</span>
+
+ <span class="k">if</span> <span class="n">brave_category</span> <span class="o">==</span> <span class="s1">&#39;goggles&#39;</span><span class="p">:</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;goggles_id&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Goggles</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}{</span><span class="n">brave_category</span><span class="si">}</span><span class="s2">?</span><span class="si">{</span><span class="n">urlencode</span><span class="p">(</span><span class="n">args</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
+
+ <span class="c1"># set properties in the cookies</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">safesearch_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">],</span> <span class="s1">&#39;off&#39;</span><span class="p">)</span>
+ <span class="c1"># the useLocation is IP based, we use cookie &#39;country&#39; for the region</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;useLocation&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;0&#39;</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;summarizer&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;0&#39;</span>
+
+ <span class="n">engine_region</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;all&#39;</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;country&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_region</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="c1"># type: ignore</span>
+
+ <span class="n">ui_lang</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">get_engine_locale</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;ui_lang&quot;</span><span class="p">],</span> <span class="s1">&#39;en-us&#39;</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;ui_lang&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ui_lang</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;cookies </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">])</span>
+
+
+<span class="k">def</span> <span class="nf">_extract_published_date</span><span class="p">(</span><span class="n">published_date_raw</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">published_date_raw</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="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">published_date_raw</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">parser</span><span class="o">.</span><span class="n">ParserError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+
+ <span class="k">if</span> <span class="n">brave_category</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;search&#39;</span><span class="p">,</span> <span class="s1">&#39;goggles&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">_parse_search</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="n">datastr</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="s2">&quot;const data = &quot;</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
+ <span class="n">datastr</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;const data = &quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">break</span>
+
+ <span class="n">json_data</span> <span class="o">=</span> <span class="n">js_variable_to_python</span><span class="p">(</span><span class="n">datastr</span><span class="p">)</span>
+ <span class="n">json_resp</span> <span class="o">=</span> <span class="n">json_data</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;body&#39;</span><span class="p">][</span><span class="s1">&#39;response&#39;</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="n">brave_category</span> <span class="o">==</span> <span class="s1">&#39;news&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">_parse_news</span><span class="p">(</span><span class="n">json_resp</span><span class="p">[</span><span class="s1">&#39;news&#39;</span><span class="p">])</span>
+
+ <span class="k">if</span> <span class="n">brave_category</span> <span class="o">==</span> <span class="s1">&#39;images&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">_parse_images</span><span class="p">(</span><span class="n">json_resp</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">brave_category</span> <span class="o">==</span> <span class="s1">&#39;videos&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">_parse_videos</span><span class="p">(</span><span class="n">json_resp</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;Unsupported brave category: </span><span class="si">{</span><span class="n">brave_category</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">_parse_search</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+
+ <span class="n">result_list</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="n">answer_tag</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@class=&quot;answer&quot;]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">answer_tag</span><span class="p">:</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@id=&quot;featured_snippet&quot;]/a[@class=&quot;result-header&quot;]/@href&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+ <span class="n">result_list</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;answer&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">answer_tag</span><span class="p">),</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">})</span>
+
+ <span class="c1"># xpath_results = &#39;//div[contains(@class, &quot;snippet fdb&quot;) and @data-type=&quot;web&quot;]&#39;</span>
+ <span class="n">xpath_results</span> <span class="o">=</span> <span class="s1">&#39;//div[contains(@class, &quot;snippet &quot;)]&#39;</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">xpath_results</span><span class="p">):</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//a[contains(@class, &quot;h&quot;)]/@href&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+ <span class="n">title_tag</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span>
+ <span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//a[contains(@class, &quot;h&quot;)]//div[contains(@class, &quot;title&quot;)]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">url</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">title_tag</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">netloc</span><span class="p">:</span> <span class="c1"># partial url likely means it&#39;s an ad</span>
+ <span class="k">continue</span>
+
+ <span class="n">content_tag</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;snippet-description&quot;)]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">pub_date_raw</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;substring-before(.//div[contains(@class, &quot;snippet-description&quot;)], &quot;-&quot;)&#39;</span><span class="p">)</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//img[contains(@class, &quot;thumb&quot;)]/@src&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+
+ <span class="n">item</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">title_tag</span><span class="p">),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">content_tag</span><span class="p">),</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">_extract_published_date</span><span class="p">(</span><span class="n">pub_date_raw</span><span class="p">),</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">img_src</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">video_tag</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span>
+ <span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;video-snippet&quot;) and @data-macro=&quot;video&quot;]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">video_tag</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+
+ <span class="c1"># In my tests a video tag in the WEB search was most often not a</span>
+ <span class="c1"># video, except the ones from youtube ..</span>
+
+ <span class="n">iframe_src</span> <span class="o">=</span> <span class="n">_get_iframe_src</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">iframe_src</span><span class="p">:</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;iframe_src&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">iframe_src</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;template&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;videos.html&#39;</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">video_tag</span><span class="p">,</span> <span class="s1">&#39;.//img/@src&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">pub_date_raw</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span>
+ <span class="n">eval_xpath</span><span class="p">(</span><span class="n">video_tag</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;snippet-attributes&quot;)]/div/text()&#39;</span><span class="p">)</span>
+ <span class="p">)</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;publishedDate&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_extract_published_date</span><span class="p">(</span><span class="n">pub_date_raw</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;img_src&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">video_tag</span><span class="p">,</span> <span class="s1">&#39;.//img/@src&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+
+ <span class="n">result_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">result_list</span>
+
+
+<span class="k">def</span> <span class="nf">_get_iframe_src</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
+ <span class="n">parsed_url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">parsed_url</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/watch&#39;</span> <span class="ow">and</span> <span class="n">parsed_url</span><span class="o">.</span><span class="n">query</span><span class="p">:</span>
+ <span class="n">video_id</span> <span class="o">=</span> <span class="n">parse_qs</span><span class="p">(</span><span class="n">parsed_url</span><span class="o">.</span><span class="n">query</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">,</span> <span class="p">[])</span> <span class="c1"># type: ignore</span>
+ <span class="k">if</span> <span class="n">video_id</span><span class="p">:</span>
+ <span class="k">return</span> <span class="s1">&#39;https://www.youtube-nocookie.com/embed/&#39;</span> <span class="o">+</span> <span class="n">video_id</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># type: ignore</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">_parse_news</span><span class="p">(</span><span class="n">json_resp</span><span class="p">):</span>
+ <span class="n">result_list</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">json_resp</span><span class="p">[</span><span class="s2">&quot;results&quot;</span><span class="p">]:</span>
+ <span class="n">item</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">_extract_published_date</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;age&#39;</span><span class="p">]),</span>
+ <span class="p">}</span>
+ <span class="k">if</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;img_src&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">][</span><span class="s1">&#39;src&#39;</span><span class="p">]</span>
+ <span class="n">result_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">result_list</span>
+
+
+<span class="k">def</span> <span class="nf">_parse_images</span><span class="p">(</span><span class="n">json_resp</span><span class="p">):</span>
+ <span class="n">result_list</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">json_resp</span><span class="p">[</span><span class="s2">&quot;results&quot;</span><span class="p">]:</span>
+ <span class="n">item</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;images.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;resolution&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;properties&#39;</span><span class="p">][</span><span class="s1">&#39;format&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;source&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;source&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;properties&#39;</span><span class="p">][</span><span class="s1">&#39;url&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;thumbnail_src&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">][</span><span class="s1">&#39;src&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="n">result_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">result_list</span>
+
+
+<span class="k">def</span> <span class="nf">_parse_videos</span><span class="p">(</span><span class="n">json_resp</span><span class="p">):</span>
+ <span class="n">result_list</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">json_resp</span><span class="p">[</span><span class="s2">&quot;results&quot;</span><span class="p">]:</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span>
+ <span class="n">item</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;videos.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;length&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;video&#39;</span><span class="p">][</span><span class="s1">&#39;duration&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;duration&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;video&#39;</span><span class="p">][</span><span class="s1">&#39;duration&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">_extract_published_date</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;age&#39;</span><span class="p">]),</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">][</span><span class="s1">&#39;src&#39;</span><span class="p">]</span>
+
+ <span class="n">iframe_src</span> <span class="o">=</span> <span class="n">_get_iframe_src</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">iframe_src</span><span class="p">:</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;iframe_src&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">iframe_src</span>
+
+ <span class="n">result_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">result_list</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/brave.html#searx.engines.brave.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch :ref:`languages &lt;brave languages&gt;` and :ref:`regions &lt;brave</span>
+<span class="sd"> regions&gt;` from Brave.&quot;&quot;&quot;</span>
+
+ <span class="c1"># pylint: disable=import-outside-toplevel, too-many-branches</span>
+
+ <span class="kn">import</span> <span class="nn">babel.languages</span>
+ <span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">region_tag</span><span class="p">,</span> <span class="n">language_tag</span>
+ <span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;ui_lang&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;Accept-Encoding&#39;</span><span class="p">:</span> <span class="s1">&#39;gzip, deflate&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="n">lang_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;no&#39;</span><span class="p">:</span> <span class="s1">&#39;nb&#39;</span><span class="p">}</span> <span class="c1"># norway</span>
+
+ <span class="c1"># languages (UI)</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://search.brave.com/settings&#39;</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from Brave is not OK.&quot;</span><span class="p">)</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//div[@id=&quot;language-select&quot;]//option&#39;</span><span class="p">):</span>
+
+ <span class="n">ui_lang</span> <span class="o">=</span> <span class="n">option</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">in</span> <span class="n">ui_lang</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">region_tag</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">parse</span><span class="p">(</span><span class="n">ui_lang</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">else</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">ui_lang</span><span class="p">))</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="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: can&#39;t determine babel locale of Brave&#39;s (UI) language </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">ui_lang</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;ui_lang&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">ui_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">ui_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;ui_lang&quot;</span><span class="p">][</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">ui_lang</span>
+
+ <span class="c1"># search regions of brave</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://cdn.search.brave.com/serp/v2/_app/immutable/chunks/parameters.734c106a.js&#39;</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from Brave is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">country_js</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">[</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&quot;options:{all&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="s1">&#39;options:&#39;</span><span class="p">)</span> <span class="p">:]</span>
+ <span class="n">country_js</span> <span class="o">=</span> <span class="n">country_js</span><span class="p">[:</span> <span class="n">country_js</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&quot;},k={default&quot;</span><span class="p">)]</span>
+ <span class="n">country_tags</span> <span class="o">=</span> <span class="n">js_variable_to_python</span><span class="p">(</span><span class="n">country_js</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">country_tags</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="s1">&#39;all&#39;</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="s1">&#39;all&#39;</span>
+ <span class="k">continue</span>
+ <span class="n">country_tag</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span>
+
+ <span class="c1"># add official languages of the country ..</span>
+ <span class="k">for</span> <span class="n">lang_tag</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="n">country_tag</span><span class="p">,</span> <span class="n">de_facto</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="n">lang_tag</span> <span class="o">=</span> <span class="n">lang_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">lang_tag</span><span class="p">,</span> <span class="n">lang_tag</span><span class="p">)</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">region_tag</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">parse</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">_</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">lang_tag</span><span class="p">,</span> <span class="n">country_tag</span><span class="o">.</span><span class="n">upper</span><span class="p">())))</span>
+ <span class="c1"># print(&quot;%-20s: %s &lt;-- %s&quot; % (v[&#39;label&#39;], country_tag, sxng_tag))</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">country_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">country_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">country_tag</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/command.html b/_modules/searx/engines/command.html
new file mode 100644
index 000000000..c1f73e933
--- /dev/null
+++ b/_modules/searx/engines/command.html
@@ -0,0 +1,359 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.command &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.command</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.command</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;With *command engines* administrators can run engines to integrate arbitrary</span>
+<span class="sd">shell commands.</span>
+
+<span class="sd">.. attention::</span>
+
+<span class="sd"> When creating and enabling a ``command`` engine on a public instance, you</span>
+<span class="sd"> must be careful to avoid leaking private data.</span>
+
+<span class="sd">The easiest solution is to limit the access by setting ``tokens`` as described</span>
+<span class="sd">in section :ref:`private engines`. The engine base is flexible. Only your</span>
+<span class="sd">imagination can limit the power of this engine (and maybe security concerns).</span>
+
+<span class="sd">Configuration</span>
+<span class="sd">=============</span>
+
+<span class="sd">The following options are available:</span>
+
+<span class="sd">``command``:</span>
+<span class="sd"> A comma separated list of the elements of the command. A special token</span>
+<span class="sd"> ``{{QUERY}}`` tells where to put the search terms of the user. Example:</span>
+
+<span class="sd"> .. code:: yaml</span>
+
+<span class="sd"> [&#39;ls&#39;, &#39;-l&#39;, &#39;-h&#39;, &#39;{{QUERY}}&#39;]</span>
+
+<span class="sd">``delimiter``:</span>
+<span class="sd"> A mapping containing a delimiter ``char`` and the *titles* of each element in</span>
+<span class="sd"> ``keys``.</span>
+
+<span class="sd">``parse_regex``:</span>
+<span class="sd"> A dict containing the regular expressions for each result key.</span>
+
+<span class="sd">``query_type``:</span>
+
+<span class="sd"> The expected type of user search terms. Possible values: ``path`` and</span>
+<span class="sd"> ``enum``.</span>
+
+<span class="sd"> ``path``:</span>
+<span class="sd"> Checks if the user provided path is inside the working directory. If not,</span>
+<span class="sd"> the query is not executed.</span>
+
+<span class="sd"> ``enum``:</span>
+<span class="sd"> Is a list of allowed search terms. If the user submits something which is</span>
+<span class="sd"> not included in the list, the query returns an error.</span>
+
+<span class="sd">``query_enum``:</span>
+<span class="sd"> A list containing allowed search terms if ``query_type`` is set to ``enum``.</span>
+
+<span class="sd">``working_dir``:</span>
+<span class="sd"> The directory where the command has to be executed. Default: ``./``.</span>
+
+<span class="sd">``result_separator``:</span>
+<span class="sd"> The character that separates results. Default: ``\\n``.</span>
+
+<span class="sd">Example</span>
+<span class="sd">=======</span>
+
+<span class="sd">The example engine below can be used to find files with a specific name in the</span>
+<span class="sd">configured working directory:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: find</span>
+<span class="sd"> engine: command</span>
+<span class="sd"> command: [&#39;find&#39;, &#39;.&#39;, &#39;-name&#39;, &#39;{{QUERY}}&#39;]</span>
+<span class="sd"> query_type: path</span>
+<span class="sd"> shortcut: fnd</span>
+<span class="sd"> delimiter:</span>
+<span class="sd"> chars: &#39; &#39;</span>
+<span class="sd"> keys: [&#39;line&#39;]</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">expanduser</span><span class="p">,</span> <span class="n">isabs</span><span class="p">,</span> <span class="n">realpath</span><span class="p">,</span> <span class="n">commonprefix</span>
+<span class="kn">from</span> <span class="nn">shlex</span> <span class="kn">import</span> <span class="n">split</span> <span class="k">as</span> <span class="n">shlex_split</span>
+<span class="kn">from</span> <span class="nn">subprocess</span> <span class="kn">import</span> <span class="n">Popen</span><span class="p">,</span> <span class="n">PIPE</span>
+<span class="kn">from</span> <span class="nn">threading</span> <span class="kn">import</span> <span class="n">Thread</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">logger</span>
+
+
+<span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;offline&#39;</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">command</span> <span class="o">=</span> <span class="p">[]</span>
+<span class="n">delimiter</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="n">parse_regex</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="n">query_type</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="n">query_enum</span> <span class="o">=</span> <span class="p">[]</span>
+<span class="n">environment_variables</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="n">working_dir</span> <span class="o">=</span> <span class="n">realpath</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span>
+<span class="n">result_separator</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
+<span class="n">result_template</span> <span class="o">=</span> <span class="s1">&#39;key-value.html&#39;</span>
+<span class="n">timeout</span> <span class="o">=</span> <span class="mf">4.0</span>
+
+<span class="n">_command_logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;command&#39;</span><span class="p">)</span>
+<span class="n">_compiled_parse_regex</span> <span class="o">=</span> <span class="p">{}</span>
+
+
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="p">):</span>
+ <span class="n">check_parsing_options</span><span class="p">(</span><span class="n">engine_settings</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="s1">&#39;command&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;engine command : missing configuration key: command&#39;</span><span class="p">)</span>
+
+ <span class="k">global</span> <span class="n">command</span><span class="p">,</span> <span class="n">working_dir</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">parse_regex</span><span class="p">,</span> <span class="n">environment_variables</span> <span class="c1"># pylint: disable=global-statement</span>
+
+ <span class="n">command</span> <span class="o">=</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;command&#39;</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="s1">&#39;working_dir&#39;</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="n">working_dir</span> <span class="o">=</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;working_dir&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">isabs</span><span class="p">(</span><span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;working_dir&#39;</span><span class="p">]):</span>
+ <span class="n">working_dir</span> <span class="o">=</span> <span class="n">realpath</span><span class="p">(</span><span class="n">working_dir</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="s1">&#39;parse_regex&#39;</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="n">parse_regex</span> <span class="o">=</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;parse_regex&#39;</span><span class="p">]</span>
+ <span class="k">for</span> <span class="n">result_key</span><span class="p">,</span> <span class="n">regex</span> <span class="ow">in</span> <span class="n">parse_regex</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">_compiled_parse_regex</span><span class="p">[</span><span class="n">result_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">regex</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
+ <span class="k">if</span> <span class="s1">&#39;delimiter&#39;</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="n">delimiter</span> <span class="o">=</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;delimiter&#39;</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="s1">&#39;environment_variables&#39;</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="n">environment_variables</span> <span class="o">=</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;environment_variables&#39;</span><span class="p">]</span>
+
+
+<span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="n">cmd</span> <span class="o">=</span> <span class="n">_get_command_to_run</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">cmd</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">reader_thread</span> <span class="o">=</span> <span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">_get_results_from_process</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]))</span>
+ <span class="n">reader_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
+ <span class="n">reader_thread</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">_get_command_to_run</span><span class="p">(</span><span class="n">query</span><span class="p">):</span>
+ <span class="n">params</span> <span class="o">=</span> <span class="n">shlex_split</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="n">__check_query_params</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
+
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">command</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s1">&#39;{{QUERY}}&#39;</span><span class="p">:</span>
+ <span class="n">cmd</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">cmd</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">cmd</span>
+
+
+<span class="k">def</span> <span class="nf">_get_results_from_process</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">pageno</span><span class="p">):</span>
+ <span class="n">leftover</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="o">=</span> <span class="n">__get_results_limits</span><span class="p">(</span><span class="n">pageno</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">Popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">environment_variables</span><span class="p">)</span> <span class="k">as</span> <span class="n">process</span><span class="p">:</span>
+ <span class="n">line</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
+ <span class="k">while</span> <span class="n">line</span><span class="p">:</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">leftover</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+ <span class="n">raw_results</span> <span class="o">=</span> <span class="n">buf</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">result_separator</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">raw_results</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
+ <span class="n">leftover</span> <span class="o">=</span> <span class="n">raw_results</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">raw_results</span> <span class="o">=</span> <span class="n">raw_results</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+
+ <span class="k">for</span> <span class="n">raw_result</span> <span class="ow">in</span> <span class="n">raw_results</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">__parse_single_result</span><span class="p">(</span><span class="n">raw_result</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">_command_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;skipped result:&#39;</span><span class="p">,</span> <span class="n">raw_result</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="k">if</span> <span class="n">start</span> <span class="o">&lt;=</span> <span class="n">count</span> <span class="ow">and</span> <span class="n">count</span> <span class="o">&lt;=</span> <span class="n">end</span><span class="p">:</span> <span class="c1"># pylint: disable=chained-comparison</span>
+ <span class="n">result</span><span class="p">[</span><span class="s1">&#39;template&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">result_template</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+
+ <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">end</span> <span class="o">&lt;</span> <span class="n">count</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">results</span>
+
+ <span class="n">line</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
+
+ <span class="n">return_code</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">return_code</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;non-zero return code when running command&#39;</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">return_code</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">__get_results_limits</span><span class="p">(</span><span class="n">pageno</span><span class="p">):</span>
+ <span class="n">start</span> <span class="o">=</span> <span class="p">(</span><span class="n">pageno</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span>
+ <span class="n">end</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="mi">9</span>
+ <span class="k">return</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span>
+
+
+<span class="k">def</span> <span class="nf">__check_query_params</span><span class="p">(</span><span class="n">params</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">query_type</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="n">query_type</span> <span class="o">==</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span>
+ <span class="n">query_path</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">query_path</span> <span class="o">=</span> <span class="n">expanduser</span><span class="p">(</span><span class="n">query_path</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">commonprefix</span><span class="p">([</span><span class="n">realpath</span><span class="p">(</span><span class="n">query_path</span><span class="p">),</span> <span class="n">working_dir</span><span class="p">])</span> <span class="o">!=</span> <span class="n">working_dir</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;requested path is outside of configured working directory&#39;</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">query_type</span> <span class="o">==</span> <span class="s1">&#39;enum&#39;</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">query_enum</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">params</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">param</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">query_enum</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;submitted query params is not allowed&#39;</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="s1">&#39;allowed params:&#39;</span><span class="p">,</span> <span class="n">query_enum</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="check_parsing_options">
+<a class="viewcode-back" href="../../../dev/engines/offline/command-line-engines.html#searx.engines.command.check_parsing_options">[docs]</a>
+<span class="k">def</span> <span class="nf">check_parsing_options</span><span class="p">(</span><span class="n">engine_settings</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if delimiter based parsing or regex parsing is configured correctly&quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="s1">&#39;delimiter&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine_settings</span> <span class="ow">and</span> <span class="s1">&#39;parse_regex&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;failed to init settings for parsing lines: missing delimiter or parse_regex&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="s1">&#39;delimiter&#39;</span> <span class="ow">in</span> <span class="n">engine_settings</span> <span class="ow">and</span> <span class="s1">&#39;parse_regex&#39;</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;failed to init settings for parsing lines: too many settings&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="s1">&#39;delimiter&#39;</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="k">if</span> <span class="s1">&#39;chars&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;delimiter&#39;</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;keys&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;delimiter&#39;</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">__parse_single_result</span><span class="p">(</span><span class="n">raw_result</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses command line output based on configuration&quot;&quot;&quot;</span>
+
+ <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">if</span> <span class="n">delimiter</span><span class="p">:</span>
+ <span class="n">elements</span> <span class="o">=</span> <span class="n">raw_result</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">delimiter</span><span class="p">[</span><span class="s1">&#39;chars&#39;</span><span class="p">],</span> <span class="n">maxsplit</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">delimiter</span><span class="p">[</span><span class="s1">&#39;keys&#39;</span><span class="p">])</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">elements</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">delimiter</span><span class="p">[</span><span class="s1">&#39;keys&#39;</span><span class="p">]):</span>
+ <span class="k">return</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">elements</span><span class="p">)):</span> <span class="c1"># pylint: disable=consider-using-enumerate</span>
+ <span class="n">result</span><span class="p">[</span><span class="n">delimiter</span><span class="p">[</span><span class="s1">&#39;keys&#39;</span><span class="p">][</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">elements</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="n">parse_regex</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">result_key</span><span class="p">,</span> <span class="n">regex</span> <span class="ow">in</span> <span class="n">_compiled_parse_regex</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">found</span> <span class="o">=</span> <span class="n">regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">raw_result</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">found</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">{}</span>
+ <span class="n">result</span><span class="p">[</span><span class="n">result_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">raw_result</span><span class="p">[</span><span class="n">found</span><span class="o">.</span><span class="n">start</span><span class="p">()</span> <span class="p">:</span> <span class="n">found</span><span class="o">.</span><span class="n">end</span><span class="p">()]</span>
+
+ <span class="k">return</span> <span class="n">result</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/dailymotion.html b/_modules/searx/engines/dailymotion.html
new file mode 100644
index 000000000..e0a924b45
--- /dev/null
+++ b/_modules/searx/engines/dailymotion.html
@@ -0,0 +1,366 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.dailymotion &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.dailymotion</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.dailymotion</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;</span>
+<span class="sd">Dailymotion (Videos)</span>
+<span class="sd">~~~~~~~~~~~~~~~~~~~~</span>
+
+<span class="sd">.. _REST GET: https://developers.dailymotion.com/tools/</span>
+<span class="sd">.. _Global API Parameters: https://developers.dailymotion.com/api/#global-parameters</span>
+<span class="sd">.. _Video filters API: https://developers.dailymotion.com/api/#video-filters</span>
+<span class="sd">.. _Fields selection: https://developers.dailymotion.com/api/#fields-selection</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">import</span> <span class="nn">time</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span><span class="p">,</span> <span class="n">raise_for_httperror</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">html_to_text</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineAPIException</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">region_tag</span><span class="p">,</span> <span class="n">language_tag</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.dailymotion.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q769222&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.dailymotion.com/developer&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;videos&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">number_of_results</span> <span class="o">=</span> <span class="mi">10</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_delta_dict</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;day&quot;</span><span class="p">:</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
+ <span class="s2">&quot;week&quot;</span><span class="p">:</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">7</span><span class="p">),</span>
+ <span class="s2">&quot;month&quot;</span><span class="p">:</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">31</span><span class="p">),</span>
+ <span class="s2">&quot;year&quot;</span><span class="p">:</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">365</span><span class="p">),</span>
+<span class="p">}</span>
+
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch_params</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="mi">2</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;is_created_for_kids&#39;</span><span class="p">:</span> <span class="s1">&#39;true&#39;</span><span class="p">},</span>
+ <span class="mi">1</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;is_created_for_kids&#39;</span><span class="p">:</span> <span class="s1">&#39;true&#39;</span><span class="p">},</span>
+ <span class="mi">0</span><span class="p">:</span> <span class="p">{},</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;True if this video is &quot;Created for Kids&quot; / intends to target an audience</span>
+<span class="sd">under the age of 16 (``is_created_for_kids`` in `Video filters API`_ )</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">family_filter_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;true&#39;</span><span class="p">,</span>
+ <span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;true&#39;</span><span class="p">,</span>
+ <span class="mi">0</span><span class="p">:</span> <span class="s1">&#39;false&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;By default, the family filter is turned on. Setting this parameter to</span>
+<span class="sd">``false`` will stop filtering-out explicit content from searches and global</span>
+<span class="sd">contexts (``family_filter`` in `Global API Parameters`_ ).</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">result_fields</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="s1">&#39;allow_embed&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;description&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;created_time&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;duration&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;thumbnail_360_url&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;id&#39;</span><span class="p">,</span>
+<span class="p">]</span>
+<span class="sd">&quot;&quot;&quot;`Fields selection`_, by default, a few fields are returned. To request more</span>
+<span class="sd">specific fields, the ``fields`` parameter is used with the list of fields</span>
+<span class="sd">SearXNG needs in the response to build a video result list.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">search_url</span> <span class="o">=</span> <span class="s1">&#39;https://api.dailymotion.com/videos?&#39;</span>
+<span class="sd">&quot;&quot;&quot;URL to retrieve a list of videos.</span>
+
+<span class="sd">- `REST GET`_</span>
+<span class="sd">- `Global API Parameters`_</span>
+<span class="sd">- `Video filters API`_</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">iframe_src</span> <span class="o">=</span> <span class="s2">&quot;https://www.dailymotion.com/embed/video/</span><span class="si">{video_id}</span><span class="s2">&quot;</span>
+<span class="sd">&quot;&quot;&quot;URL template to embed video in SearXNG&#39;s result list.&quot;&quot;&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">query</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="n">eng_region</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en_US&#39;</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span>
+
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;search&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;family_filter&#39;</span><span class="p">:</span> <span class="n">family_filter_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">],</span> <span class="s1">&#39;false&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;thumbnail_ratio&#39;</span><span class="p">:</span> <span class="s1">&#39;original&#39;</span><span class="p">,</span> <span class="c1"># original|widescreen|square</span>
+ <span class="c1"># https://developers.dailymotion.com/api/#video-filters</span>
+ <span class="s1">&#39;languages&#39;</span><span class="p">:</span> <span class="n">eng_lang</span><span class="p">,</span>
+ <span class="s1">&#39;page&#39;</span><span class="p">:</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;password_protected&#39;</span><span class="p">:</span> <span class="s1">&#39;false&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;private&#39;</span><span class="p">:</span> <span class="s1">&#39;false&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;sort&#39;</span><span class="p">:</span> <span class="s1">&#39;relevance&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;limit&#39;</span><span class="p">:</span> <span class="n">number_of_results</span><span class="p">,</span>
+ <span class="s1">&#39;fields&#39;</span><span class="p">:</span> <span class="s1">&#39;,&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result_fields</span><span class="p">),</span>
+ <span class="p">}</span>
+
+ <span class="n">args</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">safesearch_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">],</span> <span class="p">{}))</span>
+
+ <span class="c1"># Don&#39;t add localization and country arguments if the user does select a</span>
+ <span class="c1"># language (:de, :en, ..)</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="c1"># https://developers.dailymotion.com/api/#global-parameters</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;localization&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_region</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;country&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_region</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="c1"># Insufficient rights for the `ams_country&#39; parameter of route `GET /videos&#39;</span>
+ <span class="c1"># &#39;ams_country&#39;: eng_region.split(&#39;_&#39;)[1],</span>
+
+ <span class="n">time_delta</span> <span class="o">=</span> <span class="n">time_delta_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;time_range&quot;</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">time_delta</span><span class="p">:</span>
+ <span class="n">created_after</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">-</span> <span class="n">time_delta</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;created_after&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timestamp</span><span class="p">(</span><span class="n">created_after</span><span class="p">)</span>
+
+ <span class="n">query_str</span> <span class="o">=</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_url</span> <span class="o">+</span> <span class="n">query_str</span>
+
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="c1"># get response from search-request</span>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">search_res</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="c1"># check for an API error</span>
+ <span class="k">if</span> <span class="s1">&#39;error&#39;</span> <span class="ow">in</span> <span class="n">search_res</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SearxEngineAPIException</span><span class="p">(</span><span class="n">search_res</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;message&#39;</span><span class="p">))</span>
+
+ <span class="n">raise_for_httperror</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="c1"># parse results</span>
+ <span class="k">for</span> <span class="n">res</span> <span class="ow">in</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;list&#39;</span><span class="p">,</span> <span class="p">[]):</span>
+
+ <span class="n">title</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span>
+
+ <span class="n">content</span> <span class="o">=</span> <span class="n">html_to_text</span><span class="p">(</span><span class="n">res</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">])</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">300</span><span class="p">:</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">content</span><span class="p">[:</span><span class="mi">300</span><span class="p">]</span> <span class="o">+</span> <span class="s1">&#39;...&#39;</span>
+
+ <span class="n">publishedDate</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">res</span><span class="p">[</span><span class="s1">&#39;created_time&#39;</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="n">length</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;duration&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">length</span><span class="o">.</span><span class="n">tm_hour</span><span class="p">:</span>
+ <span class="n">length</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%H:%M:%S&quot;</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">length</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%M:%S&quot;</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
+
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="s1">&#39;thumbnail_360_url&#39;</span><span class="p">]</span>
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="n">thumbnail</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;http://&quot;</span><span class="p">,</span> <span class="s2">&quot;https://&quot;</span><span class="p">)</span>
+
+ <span class="n">item</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;videos.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">publishedDate</span><span class="p">,</span>
+ <span class="s1">&#39;length&#39;</span><span class="p">:</span> <span class="n">length</span><span class="p">,</span>
+ <span class="s1">&#39;thumbnail&#39;</span><span class="p">:</span> <span class="n">thumbnail</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="c1"># HINT: no mater what the value is, without API token videos can&#39;t shown</span>
+ <span class="c1"># embedded</span>
+ <span class="k">if</span> <span class="n">res</span><span class="p">[</span><span class="s1">&#39;allow_embed&#39;</span><span class="p">]:</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;iframe_src&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">iframe_src</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">video_id</span><span class="o">=</span><span class="n">res</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">])</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+
+ <span class="c1"># return results</span>
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/dailymotion.html#searx.engines.dailymotion.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch locales &amp; languages from dailymotion.</span>
+
+<span class="sd"> Locales fetched from `api/locales &lt;https://api.dailymotion.com/locales&gt;`_.</span>
+<span class="sd"> There are duplications in the locale codes returned from Dailymotion which</span>
+<span class="sd"> can be ignored::</span>
+
+<span class="sd"> en_EN --&gt; en_GB, en_US</span>
+<span class="sd"> ar_AA --&gt; ar_EG, ar_AE, ar_SA</span>
+
+<span class="sd"> The language list `api/languages &lt;https://api.dailymotion.com/languages&gt;`_</span>
+<span class="sd"> contains over 7000 *languages* codes (see PR1071_). We use only those</span>
+<span class="sd"> language codes that are used in the locales.</span>
+
+<span class="sd"> .. _PR1071: https://github.com/searxng/searxng/pull/1071</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://api.dailymotion.com/locales&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from dailymotion/locales is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="s1">&#39;list&#39;</span><span class="p">]:</span> <span class="c1"># type: ignore</span>
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;locale&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">eng_tag</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;en_EN&#39;</span><span class="p">,</span> <span class="s1">&#39;ar_AA&#39;</span><span class="p">):</span>
+ <span class="k">continue</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">region_tag</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">parse</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">))</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="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: item unknown --&gt; </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+
+ <span class="n">locale_lang_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://api.dailymotion.com/languages&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from dailymotion/languages is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="s1">&#39;list&#39;</span><span class="p">]:</span> <span class="c1"># type: ignore</span>
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;code&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">eng_tag</span> <span class="ow">in</span> <span class="n">locale_lang_list</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">))</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/demo_offline.html b/_modules/searx/engines/demo_offline.html
new file mode 100644
index 000000000..6c5fafd08
--- /dev/null
+++ b/_modules/searx/engines/demo_offline.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.demo_offline &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.demo_offline</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.demo_offline</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;Within this module we implement a *demo offline engine*. Do not look to</span>
+<span class="sd">close to the implementation, its just a simple example. To get in use of this</span>
+<span class="sd">*demo* engine add the following entry to your engines list in ``settings.yml``:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: my offline engine</span>
+<span class="sd"> engine: demo_offline</span>
+<span class="sd"> shortcut: demo</span>
+<span class="sd"> disabled: false</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">json</span>
+
+<span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;offline&#39;</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">]</span>
+<span class="n">disabled</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">timeout</span> <span class="o">=</span> <span class="mf">2.0</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># if there is a need for globals, use a leading underline</span>
+<span class="n">_my_offline_engine</span> <span class="o">=</span> <span class="kc">None</span>
+
+
+<div class="viewcode-block" id="init">
+<a class="viewcode-back" href="../../../dev/engines/demo/demo_offline.html#searx.engines.demo_offline.init">[docs]</a>
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initialization of the (offline) engine. The origin of this demo engine is a</span>
+<span class="sd"> simple json string which is loaded in this example while the engine is</span>
+<span class="sd"> initialized.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">global</span> <span class="n">_my_offline_engine</span> <span class="c1"># pylint: disable=global-statement</span>
+
+ <span class="n">_my_offline_engine</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="s1">&#39;[ {&quot;value&quot;: &quot;</span><span class="si">%s</span><span class="s1">&quot;}&#39;</span>
+ <span class="s1">&#39;, {&quot;value&quot;:&quot;first item&quot;}&#39;</span>
+ <span class="s1">&#39;, {&quot;value&quot;:&quot;second item&quot;}&#39;</span>
+ <span class="s1">&#39;, {&quot;value&quot;:&quot;third item&quot;}&#39;</span>
+ <span class="s1">&#39;]&#39;</span> <span class="o">%</span> <span class="n">engine_settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span>
+ <span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="search">
+<a class="viewcode-back" href="../../../dev/engines/demo/demo_offline.html#searx.engines.demo_offline.search">[docs]</a>
+<span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">request_params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Query (offline) engine and return results. Assemble the list of results from</span>
+<span class="sd"> your local engine. In this demo engine we ignore the &#39;query&#39; term, usual</span>
+<span class="sd"> you would pass the &#39;query&#39; term to your local engine to filter out the</span>
+<span class="sd"> results.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ret_val</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">result_list</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">_my_offline_engine</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result_list</span><span class="p">:</span>
+ <span class="n">entry</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;language&#39;</span><span class="p">:</span> <span class="n">request_params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">row</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">),</span>
+ <span class="c1"># choose a result template or comment out to use the *default*</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;key-value.html&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="n">ret_val</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">ret_val</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/demo_online.html b/_modules/searx/engines/demo_online.html
new file mode 100644
index 000000000..f136b44c6
--- /dev/null
+++ b/_modules/searx/engines/demo_online.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.demo_online &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.demo_online</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.demo_online</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;Within this module we implement a *demo online engine*. Do not look to</span>
+<span class="sd">close to the implementation, its just a simple example which queries `The Art</span>
+<span class="sd">Institute of Chicago &lt;https://www.artic.edu&gt;`_</span>
+
+<span class="sd">To get in use of this *demo* engine add the following entry to your engines</span>
+<span class="sd">list in ``settings.yml``:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: my online engine</span>
+<span class="sd"> engine: demo_online</span>
+<span class="sd"> shortcut: demo</span>
+<span class="sd"> disabled: false</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">json</span> <span class="kn">import</span> <span class="n">loads</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+
+<span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;online&#39;</span>
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">]</span>
+<span class="n">disabled</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">timeout</span> <span class="o">=</span> <span class="mf">2.0</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;images&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">page_size</span> <span class="o">=</span> <span class="mi">20</span>
+
+<span class="n">search_api</span> <span class="o">=</span> <span class="s1">&#39;https://api.artic.edu/api/v1/artworks/search?&#39;</span>
+<span class="n">image_api</span> <span class="o">=</span> <span class="s1">&#39;https://www.artic.edu/iiif/2/&#39;</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.artic.edu&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q239303&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;http://api.artic.edu/docs/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+
+<span class="c1"># if there is a need for globals, use a leading underline</span>
+<span class="n">_my_online_engine</span> <span class="o">=</span> <span class="kc">None</span>
+
+
+<div class="viewcode-block" id="init">
+<a class="viewcode-back" href="../../../dev/engines/demo/demo_online.html#searx.engines.demo_online.init">[docs]</a>
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initialization of the (online) engine. If no initialization is needed, drop</span>
+<span class="sd"> this init function.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">global</span> <span class="n">_my_online_engine</span> <span class="c1"># pylint: disable=global-statement</span>
+ <span class="n">_my_online_engine</span> <span class="o">=</span> <span class="n">engine_settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/demo/demo_online.html#searx.engines.demo_online.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Build up the ``params`` for the online request. In this example we build a</span>
+<span class="sd"> URL to fetch images from `artic.edu &lt;https://artic.edu&gt;`__</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;page&#39;</span><span class="p">:</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;fields&#39;</span><span class="p">:</span> <span class="s1">&#39;id,title,artist_display,medium_display,image_id,date_display,dimensions,artist_titles&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;limit&#39;</span><span class="p">:</span> <span class="n">page_size</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_api</span> <span class="o">+</span> <span class="n">args</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/demo/demo_online.html#searx.engines.demo_online.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse out the result items from the response. In this example we parse the</span>
+<span class="sd"> response from `api.artic.edu &lt;https://artic.edu&gt;`__ and filter out all</span>
+<span class="sd"> images.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">json_data</span> <span class="o">=</span> <span class="n">loads</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">json_data</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]:</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;image_id&#39;</span><span class="p">]:</span>
+ <span class="k">continue</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="s1">&#39;https://artic.edu/artworks/</span><span class="si">%(id)s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot; (</span><span class="si">%(date_display)s</span><span class="s2">) // </span><span class="si">%(artist_display)s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="s2">&quot;</span><span class="si">%(medium_display)s</span><span class="s2"> // </span><span class="si">%(dimensions)s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span>
+ <span class="s1">&#39;author&#39;</span><span class="p">:</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;artist_titles&#39;</span><span class="p">]),</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">image_api</span> <span class="o">+</span> <span class="s1">&#39;/</span><span class="si">%(image_id)s</span><span class="s1">/full/843,/0/default.jpg&#39;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;images.html&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/duckduckgo.html b/_modules/searx/engines/duckduckgo.html
new file mode 100644
index 000000000..c7efb4195
--- /dev/null
+++ b/_modules/searx/engines/duckduckgo.html
@@ -0,0 +1,586 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.duckduckgo &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.duckduckgo</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.duckduckgo</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;</span>
+<span class="sd">DuckDuckGo Lite</span>
+<span class="sd">~~~~~~~~~~~~~~~</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+<span class="kn">import</span> <span class="nn">lxml.html</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">locales</span><span class="p">,</span>
+ <span class="n">redislib</span><span class="p">,</span>
+ <span class="n">external_bang</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">eval_xpath</span><span class="p">,</span>
+ <span class="n">eval_xpath_getindex</span><span class="p">,</span>
+ <span class="n">extract_text</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">redisdb</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://lite.duckduckgo.com/lite/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q12805&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="sd">&quot;&quot;&quot;DuckDuckGo-Lite tries to guess user&#39;s prefered language from the HTTP</span>
+<span class="sd">``Accept-Language``. Optional the user can select a region filter (but not a</span>
+<span class="sd">language).</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># user can&#39;t select but the results are filtered</span>
+
+<span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;https://lite.duckduckgo.com/lite/&#39;</span>
+<span class="c1"># url_ping = &#39;https://duckduckgo.com/t/sl_l&#39;</span>
+
+<span class="n">time_range_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="s1">&#39;m&#39;</span><span class="p">,</span> <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="s1">&#39;y&#39;</span><span class="p">}</span>
+<span class="n">form_data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;v&#39;</span><span class="p">:</span> <span class="s1">&#39;l&#39;</span><span class="p">,</span> <span class="s1">&#39;api&#39;</span><span class="p">:</span> <span class="s1">&#39;d.js&#39;</span><span class="p">,</span> <span class="s1">&#39;o&#39;</span><span class="p">:</span> <span class="s1">&#39;json&#39;</span><span class="p">}</span>
+
+
+<div class="viewcode-block" id="cache_vqd">
+<a class="viewcode-back" href="../../../dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.cache_vqd">[docs]</a>
+<span class="k">def</span> <span class="nf">cache_vqd</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Caches a ``vqd`` value from a query.&quot;&quot;&quot;</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">redisdb</span><span class="o">.</span><span class="n">client</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">c</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;cache vqd value: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="s1">&#39;SearXNG_ddg_web_vqd&#39;</span> <span class="o">+</span> <span class="n">redislib</span><span class="o">.</span><span class="n">secret_hash</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">ex</span><span class="o">=</span><span class="mi">600</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="get_vqd">
+<a class="viewcode-back" href="../../../dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.get_vqd">[docs]</a>
+<span class="k">def</span> <span class="nf">get_vqd</span><span class="p">(</span><span class="n">query</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the ``vqd`` that fits to the *query*. If there is no ``vqd`` cached</span>
+<span class="sd"> (:py:obj:`cache_vqd`) the query is sent to DDG to get a vqd value from the</span>
+<span class="sd"> response.</span>
+
+<span class="sd"> .. hint::</span>
+
+<span class="sd"> If an empty string is returned there are no results for the ``query`` and</span>
+<span class="sd"> therefore no ``vqd`` value.</span>
+
+<span class="sd"> DDG&#39;s bot detection is sensitive to the ``vqd`` value. For some search terms</span>
+<span class="sd"> (such as extremely long search terms that are often sent by bots), no ``vqd``</span>
+<span class="sd"> value can be determined.</span>
+
+<span class="sd"> If SearXNG cannot determine a ``vqd`` value, then no request should go out</span>
+<span class="sd"> to DDG:</span>
+
+<span class="sd"> A request with a wrong ``vqd`` value leads to DDG temporarily putting</span>
+<span class="sd"> SearXNG&#39;s IP on a block list.</span>
+
+<span class="sd"> Requests from IPs in this block list run into timeouts.</span>
+
+<span class="sd"> Not sure, but it seems the block list is a sliding window: to get my IP rid</span>
+<span class="sd"> from the bot list I had to cool down my IP for 1h (send no requests from</span>
+<span class="sd"> that IP to DDG).</span>
+
+<span class="sd"> TL;DR; the ``vqd`` value is needed to pass DDG&#39;s bot protection and is used</span>
+<span class="sd"> by all request to DDG:</span>
+
+<span class="sd"> - DuckDuckGo Lite: ``https://lite.duckduckgo.com/lite`` (POST form data)</span>
+<span class="sd"> - DuckDuckGo Web: ``https://links.duckduckgo.com/d.js?q=...&amp;vqd=...``</span>
+<span class="sd"> - DuckDuckGo Images: ``https://duckduckgo.com/i.js??q=...&amp;vqd=...``</span>
+<span class="sd"> - DuckDuckGo Videos: ``https://duckduckgo.com/v.js??q=...&amp;vqd=...``</span>
+<span class="sd"> - DuckDuckGo News: ``https://duckduckgo.com/news.js??q=...&amp;vqd=...``</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">redisdb</span><span class="o">.</span><span class="n">client</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">c</span><span class="p">:</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="s1">&#39;SearXNG_ddg_web_vqd&#39;</span> <span class="o">+</span> <span class="n">redislib</span><span class="o">.</span><span class="n">secret_hash</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span> <span class="ow">or</span> <span class="n">value</span> <span class="o">==</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;re-use cached vqd value: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">value</span>
+
+ <span class="n">query_url</span> <span class="o">=</span> <span class="s1">&#39;https://duckduckgo.com/?&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">})</span>
+ <span class="n">res</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">query_url</span><span class="p">)</span>
+ <span class="n">doc</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">script</span> <span class="ow">in</span> <span class="n">doc</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s2">&quot;//script[@type=&#39;text/javascript&#39;]&quot;</span><span class="p">):</span>
+ <span class="n">script</span> <span class="o">=</span> <span class="n">script</span><span class="o">.</span><span class="n">text</span>
+ <span class="k">if</span> <span class="s1">&#39;vqd=&quot;&#39;</span> <span class="ow">in</span> <span class="n">script</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">script</span><span class="p">[</span><span class="n">script</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">&#39;vqd=&quot;&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">5</span> <span class="p">:]</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="p">[:</span> <span class="n">value</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">)]</span>
+ <span class="k">break</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;new vqd value: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">cache_vqd</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">value</span></div>
+
+
+
+<div class="viewcode-block" id="get_ddg_lang">
+<a class="viewcode-back" href="../../../dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.get_ddg_lang">[docs]</a>
+<span class="k">def</span> <span class="nf">get_ddg_lang</span><span class="p">(</span><span class="n">eng_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;en_US&#39;</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get DuckDuckGo&#39;s language identifier from SearXNG&#39;s locale.</span>
+
+<span class="sd"> DuckDuckGo defines its languages by region codes (see</span>
+<span class="sd"> :py:obj:`fetch_traits`).</span>
+
+<span class="sd"> To get region and language of a DDG service use:</span>
+
+<span class="sd"> .. code: python</span>
+
+<span class="sd"> eng_region = traits.get_region(params[&#39;searxng_locale&#39;], traits.all_locale)</span>
+<span class="sd"> eng_lang = get_ddg_lang(traits, params[&#39;searxng_locale&#39;])</span>
+
+<span class="sd"> It might confuse, but the ``l`` value of the cookie is what SearXNG calls</span>
+<span class="sd"> the *region*:</span>
+
+<span class="sd"> .. code:: python</span>
+
+<span class="sd"> # !ddi paris :es-AR --&gt; {&#39;ad&#39;: &#39;es_AR&#39;, &#39;ah&#39;: &#39;ar-es&#39;, &#39;l&#39;: &#39;ar-es&#39;}</span>
+<span class="sd"> params[&#39;cookies&#39;][&#39;ad&#39;] = eng_lang</span>
+<span class="sd"> params[&#39;cookies&#39;][&#39;ah&#39;] = eng_region</span>
+<span class="sd"> params[&#39;cookies&#39;][&#39;l&#39;] = eng_region</span>
+
+<span class="sd"> .. hint::</span>
+
+<span class="sd"> `DDG-lite &lt;https://lite.duckduckgo.com/lite&gt;`__ does not offer a language</span>
+<span class="sd"> selection to the user, only a region can be selected by the user</span>
+<span class="sd"> (``eng_region`` from the example above). DDG-lite stores the selected</span>
+<span class="sd"> region in a cookie::</span>
+
+<span class="sd"> params[&#39;cookies&#39;][&#39;kl&#39;] = eng_region # &#39;ar-es&#39;</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;lang_region&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="c1"># type: ignore</span>
+ <span class="n">sxng_locale</span><span class="p">,</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
+ <span class="p">)</span></div>
+
+
+
+<span class="n">ddg_reg_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;tw-tzh&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_TW&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;hk-tzh&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_HK&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ct-ca&#39;</span><span class="p">:</span> <span class="s1">&#39;skip&#39;</span><span class="p">,</span> <span class="c1"># ct-ca and es-ca both map to ca_ES</span>
+ <span class="s1">&#39;es-ca&#39;</span><span class="p">:</span> <span class="s1">&#39;ca_ES&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;id-en&#39;</span><span class="p">:</span> <span class="s1">&#39;id_ID&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;no-no&#39;</span><span class="p">:</span> <span class="s1">&#39;nb_NO&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;jp-jp&#39;</span><span class="p">:</span> <span class="s1">&#39;ja_JP&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;kr-kr&#39;</span><span class="p">:</span> <span class="s1">&#39;ko_KR&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;xa-ar&#39;</span><span class="p">:</span> <span class="s1">&#39;ar_SA&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;sl-sl&#39;</span><span class="p">:</span> <span class="s1">&#39;sl_SI&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;th-en&#39;</span><span class="p">:</span> <span class="s1">&#39;th_TH&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;vn-en&#39;</span><span class="p">:</span> <span class="s1">&#39;vi_VN&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">ddg_lang_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="c1"># use ar --&gt; ar_EG (Egypt&#39;s arabic)</span>
+ <span class="s2">&quot;ar_DZ&quot;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;ar_JO&quot;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;ar_SA&quot;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># use bn --&gt; bn_BD</span>
+ <span class="s1">&#39;bn_IN&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># use de --&gt; de_DE</span>
+ <span class="s1">&#39;de_CH&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># use en --&gt; en_US,</span>
+ <span class="s1">&#39;en_AU&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;en_CA&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;en_GB&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># Esperanto</span>
+ <span class="s1">&#39;eo_XX&#39;</span><span class="p">:</span> <span class="s1">&#39;eo&#39;</span><span class="p">,</span>
+ <span class="c1"># use es --&gt; es_ES,</span>
+ <span class="s1">&#39;es_AR&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_CL&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_CO&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_CR&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_EC&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_MX&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_PE&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_UY&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_VE&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># use fr --&gt; rf_FR</span>
+ <span class="s1">&#39;fr_CA&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fr_CH&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fr_BE&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># use nl --&gt; nl_NL</span>
+ <span class="s1">&#39;nl_BE&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># use pt --&gt; pt_PT</span>
+ <span class="s1">&#39;pt_BR&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">,</span>
+ <span class="c1"># skip these languages</span>
+ <span class="s1">&#39;od_IN&#39;</span><span class="p">:</span> <span class="s1">&#39;skip&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;io_XX&#39;</span><span class="p">:</span> <span class="s1">&#39;skip&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;tokipona_XX&#39;</span><span class="p">:</span> <span class="s1">&#39;skip&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">quote_ddg_bangs</span><span class="p">(</span><span class="n">query</span><span class="p">):</span>
+ <span class="c1"># quote ddg bangs</span>
+ <span class="n">query_parts</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># for val in re.split(r&#39;(\s+)&#39;, query):</span>
+ <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;(\s+)&#39;</span><span class="p">,</span> <span class="n">query</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">val</span><span class="o">.</span><span class="n">strip</span><span class="p">():</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="n">val</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;!&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">external_bang</span><span class="o">.</span><span class="n">get_node</span><span class="p">(</span><span class="n">external_bang</span><span class="o">.</span><span class="n">EXTERNAL_BANGS</span><span class="p">,</span> <span class="n">val</span><span class="p">[</span><span class="mi">1</span><span class="p">:]):</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&#39;</span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s2">&#39;&quot;</span>
+ <span class="n">query_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
+ <span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">query_parts</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+
+ <span class="n">query</span> <span class="o">=</span> <span class="n">quote_ddg_bangs</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+
+ <span class="c1"># request needs a vqd argument</span>
+ <span class="n">vqd</span> <span class="o">=</span> <span class="n">get_vqd</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+
+ <span class="n">eng_region</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span>
+ <span class="c1"># eng_lang = get_ddg_lang(traits, params[&#39;searxng_locale&#39;])</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">url</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;method&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;POST&#39;</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;q&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">query</span>
+
+ <span class="c1"># The API is not documented, so we do some reverse engineering and emulate</span>
+ <span class="c1"># what https://lite.duckduckgo.com/lite/ does when you press &quot;next Page&quot;</span>
+ <span class="c1"># link again and again ..</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;Content-Type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;application/x-www-form-urlencoded&#39;</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;vqd&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">vqd</span>
+
+ <span class="c1"># initial page does not have an offset</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="c1"># second page does have an offset of 20</span>
+ <span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">20</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;s&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">offset</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;dc&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="mi">1</span>
+
+ <span class="k">elif</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="c1"># third and following pages do have an offset of 20 + n*50</span>
+ <span class="n">offset</span> <span class="o">=</span> <span class="mi">20</span> <span class="o">+</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="mi">50</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;s&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">offset</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;dc&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="mi">1</span>
+
+ <span class="c1"># initial page does not have additional data in the input form</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;o&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">form_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;o&#39;</span><span class="p">,</span> <span class="s1">&#39;json&#39;</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;api&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">form_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;api&#39;</span><span class="p">,</span> <span class="s1">&#39;d.js&#39;</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;nextParams&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">form_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;nextParams&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;v&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">form_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">,</span> <span class="s1">&#39;l&#39;</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;Referer&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;https://lite.duckduckgo.com/&#39;</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;kl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_region</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;kl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_region</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;df&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_dict</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;df&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">time_range_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;df&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">time_range_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;param data: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">])</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;param cookies: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</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">303</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">doc</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="n">result_table</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">doc</span><span class="p">,</span> <span class="s1">&#39;//html/body/form/div[@class=&quot;filters&quot;]/table&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result_table</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="c1"># some locales (at least China) does not have a &quot;next page&quot; button and</span>
+ <span class="c1"># the layout of the HTML tables is different.</span>
+ <span class="n">result_table</span> <span class="o">=</span> <span class="n">result_table</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">elif</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="n">result_table</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">:</span>
+ <span class="c1"># no more results</span>
+ <span class="k">return</span> <span class="p">[]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">result_table</span> <span class="o">=</span> <span class="n">result_table</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
+ <span class="c1"># update form data from response</span>
+ <span class="n">form</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">doc</span><span class="p">,</span> <span class="s1">&#39;//html/body/form/div[@class=&quot;filters&quot;]/table//input/..&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">form</span><span class="p">):</span>
+
+ <span class="n">form</span> <span class="o">=</span> <span class="n">form</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">form_data</span><span class="p">[</span><span class="s1">&#39;v&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="s1">&#39;//input[@name=&quot;v&quot;]/@value&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">form_data</span><span class="p">[</span><span class="s1">&#39;api&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="s1">&#39;//input[@name=&quot;api&quot;]/@value&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">form_data</span><span class="p">[</span><span class="s1">&#39;o&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="s1">&#39;//input[@name=&quot;o&quot;]/@value&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;form_data: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">form_data</span><span class="p">)</span>
+
+ <span class="n">tr_rows</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">result_table</span><span class="p">,</span> <span class="s1">&#39;.//tr&#39;</span><span class="p">)</span>
+ <span class="c1"># In the last &lt;tr&gt; is the form of the &#39;previous/next page&#39; links</span>
+ <span class="n">tr_rows</span> <span class="o">=</span> <span class="n">tr_rows</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+
+ <span class="n">len_tr_rows</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">tr_rows</span><span class="p">)</span>
+ <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">while</span> <span class="n">len_tr_rows</span> <span class="o">&gt;=</span> <span class="n">offset</span> <span class="o">+</span> <span class="mi">4</span><span class="p">:</span>
+
+ <span class="c1"># assemble table rows we need to scrap</span>
+ <span class="n">tr_title</span> <span class="o">=</span> <span class="n">tr_rows</span><span class="p">[</span><span class="n">offset</span><span class="p">]</span>
+ <span class="n">tr_content</span> <span class="o">=</span> <span class="n">tr_rows</span><span class="p">[</span><span class="n">offset</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
+ <span class="n">offset</span> <span class="o">+=</span> <span class="mi">4</span>
+
+ <span class="c1"># ignore sponsored Adds &lt;tr class=&quot;result-sponsored&quot;&gt;</span>
+ <span class="k">if</span> <span class="n">tr_content</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;class&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;result-sponsored&#39;</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">a_tag</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">tr_title</span><span class="p">,</span> <span class="s1">&#39;.//td//a[@class=&quot;result-link&quot;]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">a_tag</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">td_content</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">tr_content</span><span class="p">,</span> <span class="s1">&#39;.//td[@class=&quot;result-snippet&quot;]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">td_content</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">a_tag</span><span class="o">.</span><span class="n">text_content</span><span class="p">(),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">td_content</span><span class="p">),</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">a_tag</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;href&#39;</span><span class="p">),</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages &amp; regions from DuckDuckGo.</span>
+
+<span class="sd"> SearXNG&#39;s ``all`` locale maps DuckDuckGo&#39;s &quot;Alle regions&quot; (``wt-wt``).</span>
+<span class="sd"> DuckDuckGo&#39;s language &quot;Browsers prefered language&quot; (``wt_WT``) makes no</span>
+<span class="sd"> sense in a SearXNG request since SearXNG&#39;s ``all`` will not add a</span>
+<span class="sd"> ``Accept-Language`` HTTP header. The value in ``engine_traits.all_locale``</span>
+<span class="sd"> is ``wt-wt`` (the region).</span>
+
+<span class="sd"> Beside regions DuckDuckGo also defines its languages by region codes. By</span>
+<span class="sd"> example these are the english languages in DuckDuckGo:</span>
+
+<span class="sd"> - en_US</span>
+<span class="sd"> - en_AU</span>
+<span class="sd"> - en_CA</span>
+<span class="sd"> - en_GB</span>
+
+<span class="sd"> The function :py:obj:`get_ddg_lang` evaluates DuckDuckGo&#39;s language from</span>
+<span class="sd"> SearXNG&#39;s locale.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-branches, too-many-statements</span>
+ <span class="c1"># fetch regions</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="s1">&#39;wt-wt&#39;</span>
+
+ <span class="c1"># updated from u661.js to u.7669f071a13a7daa57cb / should be updated automatically?</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://duckduckgo.com/dist/util/u.7669f071a13a7daa57cb.js&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from DuckDuckGo is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">pos</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;regions:{&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">8</span> <span class="c1"># type: ignore</span>
+ <span class="n">js_code</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">[</span><span class="n">pos</span><span class="p">:]</span> <span class="c1"># type: ignore</span>
+ <span class="n">pos</span> <span class="o">=</span> <span class="n">js_code</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;}&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">regions</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">js_code</span><span class="p">[:</span><span class="n">pos</span><span class="p">])</span>
+
+ <span class="k">for</span> <span class="n">eng_tag</span><span class="p">,</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">regions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+
+ <span class="k">if</span> <span class="n">eng_tag</span> <span class="o">==</span> <span class="s1">&#39;wt-wt&#39;</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="s1">&#39;wt-wt&#39;</span>
+ <span class="k">continue</span>
+
+ <span class="n">region</span> <span class="o">=</span> <span class="n">ddg_reg_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">region</span> <span class="o">==</span> <span class="s1">&#39;skip&#39;</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">region</span><span class="p">:</span>
+ <span class="n">eng_territory</span><span class="p">,</span> <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">eng_tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
+ <span class="n">region</span> <span class="o">=</span> <span class="n">eng_lang</span> <span class="o">+</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="n">eng_territory</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">region_tag</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">parse</span><span class="p">(</span><span class="n">region</span><span class="p">))</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="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">) -&gt; </span><span class="si">%s</span><span class="s2"> is unknown by babel&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">,</span> <span class="n">region</span><span class="p">))</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+
+ <span class="c1"># fetch languages</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;lang_region&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">pos</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;languages:{&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">10</span> <span class="c1"># type: ignore</span>
+ <span class="n">js_code</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">[</span><span class="n">pos</span><span class="p">:]</span> <span class="c1"># type: ignore</span>
+ <span class="n">pos</span> <span class="o">=</span> <span class="n">js_code</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;}&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">js_code</span> <span class="o">=</span> <span class="s1">&#39;{&quot;&#39;</span> <span class="o">+</span> <span class="n">js_code</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="n">pos</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">,</span> <span class="s1">&#39;&quot;:&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">,</span> <span class="s1">&#39;,&quot;&#39;</span><span class="p">)</span>
+ <span class="n">languages</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">js_code</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">eng_lang</span><span class="p">,</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">languages</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+
+ <span class="k">if</span> <span class="n">eng_lang</span> <span class="o">==</span> <span class="s1">&#39;wt_WT&#39;</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">babel_tag</span> <span class="o">=</span> <span class="n">ddg_lang_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_lang</span><span class="p">,</span> <span class="n">eng_lang</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">babel_tag</span> <span class="o">==</span> <span class="s1">&#39;skip&#39;</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="k">try</span><span class="p">:</span>
+
+ <span class="k">if</span> <span class="n">babel_tag</span> <span class="o">==</span> <span class="s1">&#39;lang_region&#39;</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">region_tag</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">parse</span><span class="p">(</span><span class="n">eng_lang</span><span class="p">))</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;lang_region&#39;</span><span class="p">][</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_lang</span>
+ <span class="k">continue</span>
+
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">babel_tag</span><span class="p">))</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="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: language </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">) is unknown by babel&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">eng_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_lang</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/duckduckgo_definitions.html b/_modules/searx/engines/duckduckgo_definitions.html
new file mode 100644
index 000000000..fb318c0fb
--- /dev/null
+++ b/_modules/searx/engines/duckduckgo_definitions.html
@@ -0,0 +1,375 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.duckduckgo_definitions &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.duckduckgo_definitions</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.duckduckgo_definitions</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;</span>
+<span class="sd">DuckDuckGo Instant Answer API</span>
+<span class="sd">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span>
+
+<span class="sd">The `DDG-API &lt;https://duckduckgo.com/api&gt;`__ is no longer documented but from</span>
+<span class="sd">reverse engineering we can see that some services (e.g. instant answers) still</span>
+<span class="sd">in use from the DDG search engine.</span>
+
+<span class="sd">As far we can say the *instant answers* API does not support languages, or at</span>
+<span class="sd">least we could not find out how language support should work. It seems that</span>
+<span class="sd">most of the features are based on English terms.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span><span class="p">,</span> <span class="n">urlparse</span><span class="p">,</span> <span class="n">urljoin</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">WIKIDATA_UNITS</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">html_to_text</span><span class="p">,</span> <span class="n">get_string_replaces_function</span>
+<span class="kn">from</span> <span class="nn">searx.external_urls</span> <span class="kn">import</span> <span class="n">get_external_url</span><span class="p">,</span> <span class="n">get_earth_coordinates_url</span><span class="p">,</span> <span class="n">area_to_osm_zoom</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://duckduckgo.com/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q12805&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://duckduckgo.com/api&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">URL</span> <span class="o">=</span> <span class="s1">&#39;https://api.duckduckgo.com/&#39;</span> <span class="o">+</span> <span class="s1">&#39;?</span><span class="si">{query}</span><span class="s1">&amp;format=json&amp;pretty=0&amp;no_redirect=1&amp;d=1&#39;</span>
+
+<span class="n">WIKIDATA_PREFIX</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;http://www.wikidata.org/entity/&#39;</span><span class="p">,</span> <span class="s1">&#39;https://www.wikidata.org/entity/&#39;</span><span class="p">]</span>
+
+<span class="n">replace_http_by_https</span> <span class="o">=</span> <span class="n">get_string_replaces_function</span><span class="p">({</span><span class="s1">&#39;http:&#39;</span><span class="p">:</span> <span class="s1">&#39;https:&#39;</span><span class="p">})</span>
+
+
+<div class="viewcode-block" id="is_broken_text">
+<a class="viewcode-back" href="../../../dev/engines/online/duckduckgo.html#searx.engines.duckduckgo_definitions.is_broken_text">[docs]</a>
+<span class="k">def</span> <span class="nf">is_broken_text</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;duckduckgo may return something like ``&lt;a href=&quot;xxxx&quot;&gt;http://somewhere Related website&lt;a/&gt;``</span>
+
+<span class="sd"> The href URL is broken, the &quot;Related website&quot; may contains some HTML.</span>
+
+<span class="sd"> The best solution seems to ignore these results.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">text</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="s1">&#39; &#39;</span> <span class="ow">in</span> <span class="n">text</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">result_to_text</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">htmlResult</span><span class="p">):</span>
+ <span class="c1"># TODO : remove result ending with &quot;Meaning&quot; or &quot;Category&quot; # pylint: disable=fixme</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">htmlResult</span><span class="p">)</span>
+ <span class="n">a</span> <span class="o">=</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//a&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">text</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">is_broken_text</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">result</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">URL</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">}))</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="c1"># pylint: disable=too-many-locals, too-many-branches, too-many-statements</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">search_res</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="c1"># search_res.get(&#39;Entity&#39;) possible values (not exhaustive) :</span>
+ <span class="c1"># * continent / country / department / location / waterfall</span>
+ <span class="c1"># * actor / musician / artist</span>
+ <span class="c1"># * book / performing art / film / television / media franchise / concert tour / playwright</span>
+ <span class="c1"># * prepared food</span>
+ <span class="c1"># * website / software / os / programming language / file format / software engineer</span>
+ <span class="c1"># * company</span>
+
+ <span class="n">content</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="n">heading</span> <span class="o">=</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Heading&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">attributes</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">urls</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">infobox_id</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">relatedTopics</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># add answer if there is one</span>
+ <span class="n">answer</span> <span class="o">=</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Answer&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">answer</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;AnswerType=&quot;</span><span class="si">%s</span><span class="s1">&quot; Answer=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AnswerType&#39;</span><span class="p">),</span> <span class="n">answer</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AnswerType&#39;</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;calc&#39;</span><span class="p">,</span> <span class="s1">&#39;ip&#39;</span><span class="p">]:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;answer&#39;</span><span class="p">:</span> <span class="n">html_to_text</span><span class="p">(</span><span class="n">answer</span><span class="p">),</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AbstractURL&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)})</span>
+
+ <span class="c1"># add infobox</span>
+ <span class="k">if</span> <span class="s1">&#39;Definition&#39;</span> <span class="ow">in</span> <span class="n">search_res</span><span class="p">:</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">content</span> <span class="o">+</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Definition&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="s1">&#39;Abstract&#39;</span> <span class="ow">in</span> <span class="n">search_res</span><span class="p">:</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">content</span> <span class="o">+</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Abstract&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+
+ <span class="c1"># image</span>
+ <span class="n">image</span> <span class="o">=</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Image&#39;</span><span class="p">)</span>
+ <span class="n">image</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">image</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span> <span class="k">else</span> <span class="n">image</span>
+ <span class="k">if</span> <span class="n">image</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">image</span><span class="p">)</span><span class="o">.</span><span class="n">netloc</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="n">image</span> <span class="o">=</span> <span class="n">urljoin</span><span class="p">(</span><span class="s1">&#39;https://duckduckgo.com&#39;</span><span class="p">,</span> <span class="n">image</span><span class="p">)</span>
+
+ <span class="c1"># urls</span>
+ <span class="c1"># Official website, Wikipedia page</span>
+ <span class="k">for</span> <span class="n">ddg_result</span> <span class="ow">in</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Results&#39;</span><span class="p">,</span> <span class="p">[]):</span>
+ <span class="n">firstURL</span> <span class="o">=</span> <span class="n">ddg_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;FirstURL&#39;</span><span class="p">)</span>
+ <span class="n">text</span> <span class="o">=</span> <span class="n">ddg_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Text&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">firstURL</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">text</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">text</span><span class="p">,</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">firstURL</span><span class="p">})</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">heading</span><span class="p">,</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">firstURL</span><span class="p">})</span>
+
+ <span class="c1"># related topics</span>
+ <span class="k">for</span> <span class="n">ddg_result</span> <span class="ow">in</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;RelatedTopics&#39;</span><span class="p">,</span> <span class="p">[]):</span>
+ <span class="k">if</span> <span class="s1">&#39;FirstURL&#39;</span> <span class="ow">in</span> <span class="n">ddg_result</span><span class="p">:</span>
+ <span class="n">firstURL</span> <span class="o">=</span> <span class="n">ddg_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;FirstURL&#39;</span><span class="p">)</span>
+ <span class="n">text</span> <span class="o">=</span> <span class="n">ddg_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Text&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">is_broken_text</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
+ <span class="n">suggestion</span> <span class="o">=</span> <span class="n">result_to_text</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">ddg_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Result&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">suggestion</span> <span class="o">!=</span> <span class="n">heading</span> <span class="ow">and</span> <span class="n">suggestion</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;suggestion&#39;</span><span class="p">:</span> <span class="n">suggestion</span><span class="p">})</span>
+ <span class="k">elif</span> <span class="s1">&#39;Topics&#39;</span> <span class="ow">in</span> <span class="n">ddg_result</span><span class="p">:</span>
+ <span class="n">suggestions</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">relatedTopics</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">ddg_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Name&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="s1">&#39;suggestions&#39;</span><span class="p">:</span> <span class="n">suggestions</span><span class="p">})</span>
+ <span class="k">for</span> <span class="n">topic_result</span> <span class="ow">in</span> <span class="n">ddg_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Topics&#39;</span><span class="p">,</span> <span class="p">[]):</span>
+ <span class="n">suggestion</span> <span class="o">=</span> <span class="n">result_to_text</span><span class="p">(</span><span class="n">topic_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Text&#39;</span><span class="p">),</span> <span class="n">topic_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Result&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">suggestion</span> <span class="o">!=</span> <span class="n">heading</span> <span class="ow">and</span> <span class="n">suggestion</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">suggestions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">suggestion</span><span class="p">)</span>
+
+ <span class="c1"># abstract</span>
+ <span class="n">abstractURL</span> <span class="o">=</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AbstractURL&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">abstractURL</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="c1"># add as result ? problem always in english</span>
+ <span class="n">infobox_id</span> <span class="o">=</span> <span class="n">abstractURL</span>
+ <span class="n">urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;AbstractSource&#39;</span><span class="p">),</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">abstractURL</span><span class="p">,</span> <span class="s1">&#39;official&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">abstractURL</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">heading</span><span class="p">})</span>
+
+ <span class="c1"># definition</span>
+ <span class="n">definitionURL</span> <span class="o">=</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;DefinitionURL&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">definitionURL</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="c1"># add as result ? as answer ? problem always in english</span>
+ <span class="n">infobox_id</span> <span class="o">=</span> <span class="n">definitionURL</span>
+ <span class="n">urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;DefinitionSource&#39;</span><span class="p">),</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">definitionURL</span><span class="p">})</span>
+
+ <span class="c1"># to merge with wikidata&#39;s infobox</span>
+ <span class="k">if</span> <span class="n">infobox_id</span><span class="p">:</span>
+ <span class="n">infobox_id</span> <span class="o">=</span> <span class="n">replace_http_by_https</span><span class="p">(</span><span class="n">infobox_id</span><span class="p">)</span>
+
+ <span class="c1"># attributes</span>
+ <span class="c1"># some will be converted to urls</span>
+ <span class="k">if</span> <span class="s1">&#39;Infobox&#39;</span> <span class="ow">in</span> <span class="n">search_res</span><span class="p">:</span>
+ <span class="n">infobox</span> <span class="o">=</span> <span class="n">search_res</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Infobox&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="s1">&#39;content&#39;</span> <span class="ow">in</span> <span class="n">infobox</span><span class="p">:</span>
+ <span class="n">osm_zoom</span> <span class="o">=</span> <span class="mi">17</span>
+ <span class="n">coordinates</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">for</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">infobox</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;content&#39;</span><span class="p">):</span>
+ <span class="n">data_type</span> <span class="o">=</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;data_type&#39;</span><span class="p">)</span>
+ <span class="n">data_label</span> <span class="o">=</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;label&#39;</span><span class="p">)</span>
+ <span class="n">data_value</span> <span class="o">=</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">)</span>
+
+ <span class="c1"># Workaround: ddg may return a double quote</span>
+ <span class="k">if</span> <span class="n">data_value</span> <span class="o">==</span> <span class="s1">&#39;&quot;&quot;&#39;</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="c1"># Is it an external URL ?</span>
+ <span class="c1"># * imdb_id / facebook_profile / youtube_channel / youtube_video / twitter_profile</span>
+ <span class="c1"># * instagram_profile / rotten_tomatoes / spotify_artist_id / itunes_artist_id / soundcloud_id</span>
+ <span class="c1"># * netflix_id</span>
+ <span class="n">external_url</span> <span class="o">=</span> <span class="n">get_external_url</span><span class="p">(</span><span class="n">data_type</span><span class="p">,</span> <span class="n">data_value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">external_url</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">data_label</span><span class="p">,</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">external_url</span><span class="p">})</span>
+ <span class="k">elif</span> <span class="n">data_type</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;wiki_maps_trigger&#39;</span><span class="p">,</span> <span class="s1">&#39;google_play_artist_id&#39;</span><span class="p">]:</span>
+ <span class="c1"># ignore instance: Wikidata value from &quot;Instance Of&quot; (Qxxxx)</span>
+ <span class="c1"># ignore wiki_maps_trigger: reference to a javascript</span>
+ <span class="c1"># ignore google_play_artist_id: service shutdown</span>
+ <span class="k">pass</span>
+ <span class="k">elif</span> <span class="n">data_type</span> <span class="o">==</span> <span class="s1">&#39;string&#39;</span> <span class="ow">and</span> <span class="n">data_label</span> <span class="o">==</span> <span class="s1">&#39;Website&#39;</span><span class="p">:</span>
+ <span class="c1"># There is already an URL for the website</span>
+ <span class="k">pass</span>
+ <span class="k">elif</span> <span class="n">data_type</span> <span class="o">==</span> <span class="s1">&#39;area&#39;</span><span class="p">:</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="n">data_label</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">area_to_str</span><span class="p">(</span><span class="n">data_value</span><span class="p">),</span> <span class="s1">&#39;entity&#39;</span><span class="p">:</span> <span class="s1">&#39;P2046&#39;</span><span class="p">})</span>
+ <span class="n">osm_zoom</span> <span class="o">=</span> <span class="n">area_to_osm_zoom</span><span class="p">(</span><span class="n">data_value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span><span class="p">))</span>
+ <span class="k">elif</span> <span class="n">data_type</span> <span class="o">==</span> <span class="s1">&#39;coordinates&#39;</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">data_value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;globe&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;http://www.wikidata.org/entity/Q2&#39;</span><span class="p">:</span>
+ <span class="c1"># coordinate on Earth</span>
+ <span class="c1"># get the zoom information from the area</span>
+ <span class="n">coordinates</span> <span class="o">=</span> <span class="n">info</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># coordinate NOT on Earth</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="n">data_label</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">data_value</span><span class="p">,</span> <span class="s1">&#39;entity&#39;</span><span class="p">:</span> <span class="s1">&#39;P625&#39;</span><span class="p">})</span>
+ <span class="k">elif</span> <span class="n">data_type</span> <span class="o">==</span> <span class="s1">&#39;string&#39;</span><span class="p">:</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="n">data_label</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">data_value</span><span class="p">})</span>
+
+ <span class="k">if</span> <span class="n">coordinates</span><span class="p">:</span>
+ <span class="n">data_label</span> <span class="o">=</span> <span class="n">coordinates</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;label&#39;</span><span class="p">)</span>
+ <span class="n">data_value</span> <span class="o">=</span> <span class="n">coordinates</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">)</span>
+ <span class="n">latitude</span> <span class="o">=</span> <span class="n">data_value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;latitude&#39;</span><span class="p">)</span>
+ <span class="n">longitude</span> <span class="o">=</span> <span class="n">data_value</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;longitude&#39;</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">get_earth_coordinates_url</span><span class="p">(</span><span class="n">latitude</span><span class="p">,</span> <span class="n">longitude</span><span class="p">,</span> <span class="n">osm_zoom</span><span class="p">)</span>
+ <span class="n">urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="s1">&#39;OpenStreetMap&#39;</span><span class="p">,</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;entity&#39;</span><span class="p">:</span> <span class="s1">&#39;P625&#39;</span><span class="p">})</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">heading</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="c1"># TODO get infobox.meta.value where .label=&#39;article_title&#39; # pylint: disable=fixme</span>
+ <span class="k">if</span> <span class="n">image</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">attributes</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">urls</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">relatedTopics</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">urls</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;url&#39;</span><span class="p">],</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">heading</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">})</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;infobox&#39;</span><span class="p">:</span> <span class="n">heading</span><span class="p">,</span>
+ <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">infobox_id</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">image</span><span class="p">,</span>
+ <span class="s1">&#39;attributes&#39;</span><span class="p">:</span> <span class="n">attributes</span><span class="p">,</span>
+ <span class="s1">&#39;urls&#39;</span><span class="p">:</span> <span class="n">urls</span><span class="p">,</span>
+ <span class="s1">&#39;relatedTopics&#39;</span><span class="p">:</span> <span class="n">relatedTopics</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">unit_to_str</span><span class="p">(</span><span class="n">unit</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">prefix</span> <span class="ow">in</span> <span class="n">WIKIDATA_PREFIX</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">unit</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">prefix</span><span class="p">):</span>
+ <span class="n">wikidata_entity</span> <span class="o">=</span> <span class="n">unit</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span> <span class="p">:]</span>
+ <span class="n">real_unit</span> <span class="o">=</span> <span class="n">WIKIDATA_UNITS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">wikidata_entity</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">real_unit</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">unit</span>
+ <span class="k">return</span> <span class="n">real_unit</span><span class="p">[</span><span class="s1">&#39;symbol&#39;</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">unit</span>
+
+
+<div class="viewcode-block" id="area_to_str">
+<a class="viewcode-back" href="../../../dev/engines/online/duckduckgo.html#searx.engines.duckduckgo_definitions.area_to_str">[docs]</a>
+<span class="k">def</span> <span class="nf">area_to_str</span><span class="p">(</span><span class="n">area</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;parse ``{&#39;unit&#39;: &#39;https://www.wikidata.org/entity/Q712226&#39;, &#39;amount&#39;: &#39;+20.99&#39;}``&quot;&quot;&quot;</span>
+ <span class="n">unit</span> <span class="o">=</span> <span class="n">unit_to_str</span><span class="p">(</span><span class="n">area</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;unit&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">amount</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">area</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span><span class="p">))</span>
+ <span class="k">return</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="n">unit</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">return</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">area</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;amount&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="n">area</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;unit&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/google.html b/_modules/searx/engines/google.html
new file mode 100644
index 000000000..26db20e9f
--- /dev/null
+++ b/_modules/searx/engines/google.html
@@ -0,0 +1,620 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.google &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.google</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.google</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;This is the implementation of the Google WEB engine. Some of this</span>
+<span class="sd">implementations (manly the :py:obj:`get_google_info`) are shared by other</span>
+<span class="sd">engines:</span>
+
+<span class="sd">- :ref:`google images engine`</span>
+<span class="sd">- :ref:`google news engine`</span>
+<span class="sd">- :ref:`google videos engine`</span>
+<span class="sd">- :ref:`google scholar engine`</span>
+<span class="sd">- :ref:`google autocomplete`</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+<span class="kn">import</span> <span class="nn">babel.core</span>
+<span class="kn">import</span> <span class="nn">babel.languages</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">,</span> <span class="n">eval_xpath_getindex</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span><span class="p">,</span> <span class="n">region_tag</span><span class="p">,</span> <span class="n">get_official_locales</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineCaptchaException</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.google.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q9366&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://developers.google.com/custom-search/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">50</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">time_range_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="s1">&#39;m&#39;</span><span class="p">,</span> <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="s1">&#39;y&#39;</span><span class="p">}</span>
+
+<span class="c1"># Filter results. 0: None, 1: Moderate, 2: Strict</span>
+<span class="n">filter_mapping</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s1">&#39;off&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;medium&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;high&#39;</span><span class="p">}</span>
+
+<span class="c1"># specific xpath variables</span>
+<span class="c1"># ------------------------</span>
+
+<span class="n">results_xpath</span> <span class="o">=</span> <span class="s1">&#39;.//div[contains(@jscontroller, &quot;SC7lYd&quot;)]&#39;</span>
+<span class="n">title_xpath</span> <span class="o">=</span> <span class="s1">&#39;.//a/h3[1]&#39;</span>
+<span class="n">href_xpath</span> <span class="o">=</span> <span class="s1">&#39;.//a[h3]/@href&#39;</span>
+<span class="n">content_xpath</span> <span class="o">=</span> <span class="s1">&#39;.//div[@data-sncf]&#39;</span>
+
+<span class="c1"># Suggestions are links placed in a *card-section*, we extract only the text</span>
+<span class="c1"># from the links not the links itself.</span>
+<span class="n">suggestion_xpath</span> <span class="o">=</span> <span class="s1">&#39;//div[contains(@class, &quot;EIaa9b&quot;)]//a&#39;</span>
+
+<span class="c1"># UI_ASYNC = &#39;use_ac:true,_fmt:html&#39; # returns a HTTP 500 when user search for</span>
+<span class="c1"># # celebrities like &#39;!google natasha allegri&#39;</span>
+<span class="c1"># # or &#39;!google chris evans&#39;</span>
+<span class="n">UI_ASYNC</span> <span class="o">=</span> <span class="s1">&#39;use_ac:true,_fmt:prog&#39;</span>
+<span class="sd">&quot;&quot;&quot;Format of the response from UI&#39;s async request.&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="get_google_info">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google.get_google_info">[docs]</a>
+<span class="k">def</span> <span class="nf">get_google_info</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">eng_traits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Composing various (language) properties for the google engines (:ref:`google</span>
+<span class="sd"> API`).</span>
+
+<span class="sd"> This function is called by the various google engines (:ref:`google web</span>
+<span class="sd"> engine`, :ref:`google images engine`, :ref:`google news engine` and</span>
+<span class="sd"> :ref:`google videos engine`).</span>
+
+<span class="sd"> :param dict param: Request parameters of the engine. At least</span>
+<span class="sd"> a ``searxng_locale`` key should be in the dictionary.</span>
+
+<span class="sd"> :param eng_traits: Engine&#39;s traits fetched from google preferences</span>
+<span class="sd"> (:py:obj:`searx.enginelib.traits.EngineTraits`)</span>
+
+<span class="sd"> :rtype: dict</span>
+<span class="sd"> :returns:</span>
+<span class="sd"> Py-Dictionary with the key/value pairs:</span>
+
+<span class="sd"> language:</span>
+<span class="sd"> The language code that is used by google (e.g. ``lang_en`` or</span>
+<span class="sd"> ``lang_zh-TW``)</span>
+
+<span class="sd"> country:</span>
+<span class="sd"> The country code that is used by google (e.g. ``US`` or ``TW``)</span>
+
+<span class="sd"> locale:</span>
+<span class="sd"> A instance of :py:obj:`babel.core.Locale` build from the</span>
+<span class="sd"> ``searxng_locale`` value.</span>
+
+<span class="sd"> subdomain:</span>
+<span class="sd"> Google subdomain :py:obj:`google_domains` that fits to the country</span>
+<span class="sd"> code.</span>
+
+<span class="sd"> params:</span>
+<span class="sd"> Py-Dictionary with additional request arguments (can be passed to</span>
+<span class="sd"> :py:func:`urllib.parse.urlencode`).</span>
+
+<span class="sd"> - ``hl`` parameter: specifies the interface language of user interface.</span>
+<span class="sd"> - ``lr`` parameter: restricts search results to documents written in</span>
+<span class="sd"> a particular language.</span>
+<span class="sd"> - ``cr`` parameter: restricts search results to documents</span>
+<span class="sd"> originating in a particular country.</span>
+<span class="sd"> - ``ie`` parameter: sets the character encoding scheme that should</span>
+<span class="sd"> be used to interpret the query string (&#39;utf8&#39;).</span>
+<span class="sd"> - ``oe`` parameter: sets the character encoding scheme that should</span>
+<span class="sd"> be used to decode the XML result (&#39;utf8&#39;).</span>
+
+<span class="sd"> headers:</span>
+<span class="sd"> Py-Dictionary with additional HTTP headers (can be passed to</span>
+<span class="sd"> request&#39;s headers)</span>
+
+<span class="sd"> - ``Accept: &#39;*/*``</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">ret_val</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;language&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s1">&#39;country&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s1">&#39;subdomain&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s1">&#39;params&#39;</span><span class="p">:</span> <span class="p">{},</span>
+ <span class="s1">&#39;headers&#39;</span><span class="p">:</span> <span class="p">{},</span>
+ <span class="s1">&#39;cookies&#39;</span><span class="p">:</span> <span class="p">{},</span>
+ <span class="s1">&#39;locale&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">sxng_locale</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">,</span> <span class="s1">&#39;all&#39;</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="n">sxng_locale</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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="s1">&#39;lang_en&#39;</span><span class="p">)</span>
+ <span class="n">lang_code</span> <span class="o">=</span> <span class="n">eng_lang</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># lang_zh-TW --&gt; zh-TW / lang_en --&gt; en</span>
+ <span class="n">country</span> <span class="o">=</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span>
+
+ <span class="c1"># Test zh_hans &amp; zh_hant --&gt; in the topmost links in the result list of list</span>
+ <span class="c1"># TW and HK you should a find wiktionary.org zh_hant link. In the result</span>
+ <span class="c1"># list of zh-CN should not be no hant link instead you should find</span>
+ <span class="c1"># zh.m.wikipedia.org/zh somewhere in the top.</span>
+
+ <span class="c1"># &#39;!go 日 :zh-TW&#39; --&gt; https://zh.m.wiktionary.org/zh-hant/%E6%97%A5</span>
+ <span class="c1"># &#39;!go 日 :zh-CN&#39; --&gt; https://zh.m.wikipedia.org/zh/%E6%97%A5</span>
+
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_lang</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;country&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">country</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;locale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">locale</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;supported_domains&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">country</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="s1">&#39;www.google.com&#39;</span><span class="p">)</span>
+
+ <span class="c1"># hl parameter:</span>
+ <span class="c1"># The hl parameter specifies the interface language (host language) of</span>
+ <span class="c1"># your user interface. To improve the performance and the quality of your</span>
+ <span class="c1"># search results, you are strongly encouraged to set this parameter</span>
+ <span class="c1"># explicitly.</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results#hlsp</span>
+ <span class="c1"># The Interface Language:</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results_appendices#interfaceLanguages</span>
+
+ <span class="c1"># https://github.com/searxng/searxng/issues/2515#issuecomment-1607150817</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;hl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">lang_code</span><span class="si">}</span><span class="s1">-</span><span class="si">{</span><span class="n">country</span><span class="si">}</span><span class="s1">&#39;</span>
+
+ <span class="c1"># lr parameter:</span>
+ <span class="c1"># The lr (language restrict) parameter restricts search results to</span>
+ <span class="c1"># documents written in a particular language.</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results#lrsp</span>
+ <span class="c1"># Language Collection Values:</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results_appendices#languageCollections</span>
+ <span class="c1">#</span>
+ <span class="c1"># To select &#39;all&#39; languages an empty &#39;lr&#39; value is used.</span>
+ <span class="c1">#</span>
+ <span class="c1"># Different to other google services, Google Scholar supports to select more</span>
+ <span class="c1"># than one language. The languages are separated by a pipe &#39;|&#39; (logical OR).</span>
+ <span class="c1"># By example: &amp;lr=lang_zh-TW%7Clang_de selects articles written in</span>
+ <span class="c1"># traditional chinese OR german language.</span>
+
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;lr&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_lang</span>
+ <span class="k">if</span> <span class="n">sxng_locale</span> <span class="o">==</span> <span class="s1">&#39;all&#39;</span><span class="p">:</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;lr&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+
+ <span class="c1"># cr parameter:</span>
+ <span class="c1"># The cr parameter restricts search results to documents originating in a</span>
+ <span class="c1"># particular country.</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results#crsp</span>
+
+ <span class="c1"># specify a region (country) only if a region is given in the selected</span>
+ <span class="c1"># locale --&gt; https://github.com/searxng/searxng/issues/2672</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;cr&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sxng_locale</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;cr&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;country&#39;</span> <span class="o">+</span> <span class="n">country</span>
+
+ <span class="c1"># gl parameter: (mandatory by Google News)</span>
+ <span class="c1"># The gl parameter value is a two-letter country code. For WebSearch</span>
+ <span class="c1"># results, the gl parameter boosts search results whose country of origin</span>
+ <span class="c1"># matches the parameter value. See the Country Codes section for a list of</span>
+ <span class="c1"># valid values.</span>
+ <span class="c1"># Specifying a gl parameter value in WebSearch requests should improve the</span>
+ <span class="c1"># relevance of results. This is particularly true for international</span>
+ <span class="c1"># customers and, even more specifically, for customers in English-speaking</span>
+ <span class="c1"># countries other than the United States.</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results#glsp</span>
+
+ <span class="c1"># https://github.com/searxng/searxng/issues/2515#issuecomment-1606294635</span>
+ <span class="c1"># ret_val[&#39;params&#39;][&#39;gl&#39;] = country</span>
+
+ <span class="c1"># ie parameter:</span>
+ <span class="c1"># The ie parameter sets the character encoding scheme that should be used</span>
+ <span class="c1"># to interpret the query string. The default ie value is latin1.</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results#iesp</span>
+
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;ie&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;utf8&#39;</span>
+
+ <span class="c1"># oe parameter:</span>
+ <span class="c1"># The oe parameter sets the character encoding scheme that should be used</span>
+ <span class="c1"># to decode the XML result. The default oe value is latin1.</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results#oesp</span>
+
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;oe&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;utf8&#39;</span>
+
+ <span class="c1"># num parameter:</span>
+ <span class="c1"># The num parameter identifies the number of search results to return.</span>
+ <span class="c1"># The default num value is 10, and the maximum value is 20. If you request</span>
+ <span class="c1"># more than 20 results, only 20 results will be returned.</span>
+ <span class="c1"># https://developers.google.com/custom-search/docs/xml_results#numsp</span>
+
+ <span class="c1"># HINT: seems to have no effect (tested in google WEB &amp; Images)</span>
+ <span class="c1"># ret_val[&#39;params&#39;][&#39;num&#39;] = 20</span>
+
+ <span class="c1"># HTTP headers</span>
+
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;Accept&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;*/*&#39;</span>
+
+ <span class="c1"># Cookies</span>
+
+ <span class="c1"># - https://github.com/searxng/searxng/pull/1679#issuecomment-1235432746</span>
+ <span class="c1"># - https://github.com/searxng/searxng/issues/1555</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;CONSENT&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;YES+&quot;</span>
+
+ <span class="k">return</span> <span class="n">ret_val</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">detect_google_sorry</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">host</span> <span class="o">==</span> <span class="s1">&#39;sorry.google.com&#39;</span> <span class="ow">or</span> <span class="n">resp</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;/sorry&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SearxEngineCaptchaException</span><span class="p">()</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Google search request&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=line-too-long</span>
+ <span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span>
+ <span class="n">google_info</span> <span class="o">=</span> <span class="n">get_google_info</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">traits</span><span class="p">)</span>
+
+ <span class="c1"># https://www.google.de/search?q=corona&amp;hl=de&amp;lr=lang_de&amp;start=0&amp;tbs=qdr%3Ad&amp;safe=medium</span>
+ <span class="n">query_url</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="s1">&#39;https://&#39;</span>
+ <span class="o">+</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span>
+ <span class="o">+</span> <span class="s1">&#39;/search&#39;</span>
+ <span class="o">+</span> <span class="s2">&quot;?&quot;</span>
+ <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="o">**</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;filter&#39;</span><span class="p">:</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;start&#39;</span><span class="p">:</span> <span class="n">offset</span><span class="p">,</span>
+ <span class="c1"># &#39;vet&#39;: &#39;12ahUKEwik3ZbIzfn7AhXMX_EDHbUDBh0QxK8CegQIARAC..i&#39;,</span>
+ <span class="c1"># &#39;ved&#39;: &#39;2ahUKEwik3ZbIzfn7AhXMX_EDHbUDBh0Q_skCegQIARAG&#39;,</span>
+ <span class="c1"># &#39;cs&#39; : 1,</span>
+ <span class="c1"># &#39;sa&#39;: &#39;N&#39;,</span>
+ <span class="c1"># &#39;yv&#39;: 3,</span>
+ <span class="c1"># &#39;prmd&#39;: &#39;vin&#39;,</span>
+ <span class="c1"># &#39;ei&#39;: &#39;GASaY6TxOcy_xc8PtYeY6AE&#39;,</span>
+ <span class="c1"># &#39;sa&#39;: &#39;N&#39;,</span>
+ <span class="c1"># &#39;sstk&#39;: &#39;AcOHfVkD7sWCSAheZi-0tx_09XDO55gTWY0JNq3_V26cNN-c8lfD45aZYPI8s_Bqp8s57AHz5pxchDtAGCA_cikAWSjy9kw3kgg&#39;</span>
+ <span class="c1"># formally known as use_mobile_ui</span>
+ <span class="s1">&#39;asearch&#39;</span><span class="p">:</span> <span class="s1">&#39;arc&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;async&#39;</span><span class="p">:</span> <span class="n">UI_ASYNC</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_dict</span><span class="p">:</span>
+ <span class="n">query_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;tbs&#39;</span><span class="p">:</span> <span class="s1">&#39;qdr:&#39;</span> <span class="o">+</span> <span class="n">time_range_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]})</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]:</span>
+ <span class="n">query_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;safe&#39;</span><span class="p">:</span> <span class="n">filter_mapping</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]]})</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">query_url</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<span class="c1"># =26;[3,&quot;dimg_ZNMiZPCqE4apxc8P3a2tuAQ_137&quot;]a87;data:image/jpeg;base64,/9j/4AAQSkZJRgABA</span>
+<span class="c1"># ...6T+9Nl4cnD+gr9OK8I56/tX3l86nWYw//2Q==26;</span>
+<span class="n">RE_DATA_IMAGE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;&quot;(dimg_[^&quot;]*)&quot;[^;]*;(data:image[^;]*;[^;]*);&#39;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">_parse_data_images</span><span class="p">(</span><span class="n">dom</span><span class="p">):</span>
+ <span class="n">data_image_map</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">img_id</span><span class="p">,</span> <span class="n">data_image</span> <span class="ow">in</span> <span class="n">RE_DATA_IMAGE</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">dom</span><span class="o">.</span><span class="n">text_content</span><span class="p">()):</span>
+ <span class="n">end_pos</span> <span class="o">=</span> <span class="n">data_image</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">end_pos</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">data_image</span> <span class="o">=</span> <span class="n">data_image</span><span class="p">[:</span> <span class="n">end_pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
+ <span class="n">data_image_map</span><span class="p">[</span><span class="n">img_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">data_image</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;data:image objects --&gt; </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">data_image_map</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
+ <span class="k">return</span> <span class="n">data_image_map</span>
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get response from google&#39;s search request&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-branches, too-many-statements</span>
+ <span class="n">detect_google_sorry</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># convert the text to dom</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">data_image_map</span> <span class="o">=</span> <span class="n">_parse_data_images</span><span class="p">(</span><span class="n">dom</span><span class="p">)</span>
+
+ <span class="c1"># results --&gt; answer</span>
+ <span class="n">answer_list</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[contains(@class, &quot;LGOjhe&quot;)]&#39;</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">answer_list</span><span class="p">:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;answer&#39;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s2">&quot;normalize-space()&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;../..//a/@href&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="p">[</span><span class="kc">None</span><span class="p">])[</span><span class="mi">0</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="c1"># parse results</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">results_xpath</span><span class="p">):</span> <span class="c1"># pylint: disable=too-many-nested-blocks</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">title_tag</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">title_xpath</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">title_tag</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># this not one of the common google results *section*</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;ignoring item from the result_xpath list: missing title&#39;</span><span class="p">)</span>
+ <span class="k">continue</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">title_tag</span><span class="p">)</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">href_xpath</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">url</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;ignoring item from the result_xpath list: missing url of title &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">title</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">content_nodes</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">content_xpath</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">content_nodes</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">content</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;ignoring item from the result_xpath list: missing content of title &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">title</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">content_nodes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//img/@src&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">img_src</span><span class="p">:</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">img_src</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">img_src</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;data:image&#39;</span><span class="p">):</span>
+ <span class="n">img_id</span> <span class="o">=</span> <span class="n">content_nodes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;.//img/@id&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">img_id</span><span class="p">:</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">data_image_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">img_id</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span> <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">img_src</span><span class="p">})</span>
+
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="c1"># parse suggestion</span>
+ <span class="k">for</span> <span class="n">suggestion</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">suggestion_xpath</span><span class="p">):</span>
+ <span class="c1"># append suggestion</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;suggestion&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">suggestion</span><span class="p">)})</span>
+
+ <span class="c1"># return results</span>
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<span class="c1"># get supported languages from their site</span>
+
+
+<span class="n">skip_countries</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="c1"># official language of google-country not in google-languages</span>
+ <span class="s1">&#39;AL&#39;</span><span class="p">,</span> <span class="c1"># Albanien (sq)</span>
+ <span class="s1">&#39;AZ&#39;</span><span class="p">,</span> <span class="c1"># Aserbaidschan (az)</span>
+ <span class="s1">&#39;BD&#39;</span><span class="p">,</span> <span class="c1"># Bangladesch (bn)</span>
+ <span class="s1">&#39;BN&#39;</span><span class="p">,</span> <span class="c1"># Brunei Darussalam (ms)</span>
+ <span class="s1">&#39;BT&#39;</span><span class="p">,</span> <span class="c1"># Bhutan (dz)</span>
+ <span class="s1">&#39;ET&#39;</span><span class="p">,</span> <span class="c1"># Äthiopien (am)</span>
+ <span class="s1">&#39;GE&#39;</span><span class="p">,</span> <span class="c1"># Georgien (ka, os)</span>
+ <span class="s1">&#39;GL&#39;</span><span class="p">,</span> <span class="c1"># Grönland (kl)</span>
+ <span class="s1">&#39;KH&#39;</span><span class="p">,</span> <span class="c1"># Kambodscha (km)</span>
+ <span class="s1">&#39;LA&#39;</span><span class="p">,</span> <span class="c1"># Laos (lo)</span>
+ <span class="s1">&#39;LK&#39;</span><span class="p">,</span> <span class="c1"># Sri Lanka (si, ta)</span>
+ <span class="s1">&#39;ME&#39;</span><span class="p">,</span> <span class="c1"># Montenegro (sr)</span>
+ <span class="s1">&#39;MK&#39;</span><span class="p">,</span> <span class="c1"># Nordmazedonien (mk, sq)</span>
+ <span class="s1">&#39;MM&#39;</span><span class="p">,</span> <span class="c1"># Myanmar (my)</span>
+ <span class="s1">&#39;MN&#39;</span><span class="p">,</span> <span class="c1"># Mongolei (mn)</span>
+ <span class="s1">&#39;MV&#39;</span><span class="p">,</span> <span class="c1"># Malediven (dv) // dv_MV is unknown by babel</span>
+ <span class="s1">&#39;MY&#39;</span><span class="p">,</span> <span class="c1"># Malaysia (ms)</span>
+ <span class="s1">&#39;NP&#39;</span><span class="p">,</span> <span class="c1"># Nepal (ne)</span>
+ <span class="s1">&#39;TJ&#39;</span><span class="p">,</span> <span class="c1"># Tadschikistan (tg)</span>
+ <span class="s1">&#39;TM&#39;</span><span class="p">,</span> <span class="c1"># Turkmenistan (tk)</span>
+ <span class="s1">&#39;UZ&#39;</span><span class="p">,</span> <span class="c1"># Usbekistan (uz)</span>
+<span class="p">]</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">,</span> <span class="n">add_domains</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages from Google.&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel, too-many-branches</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;supported_domains&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://www.google.com/preferences&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Response from Google&#39;s preferences is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
+
+ <span class="c1"># supported language codes</span>
+
+ <span class="n">lang_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;no&#39;</span><span class="p">:</span> <span class="s1">&#39;nb&#39;</span><span class="p">}</span>
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//select[@name=&#39;hl&#39;]/option&quot;</span><span class="p">):</span>
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</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="n">lang_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_lang</span><span class="p">,</span> <span class="n">eng_lang</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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: </span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2"> is unknown by babel&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;data-name&quot;</span><span class="p">),</span> <span class="n">eng_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">sxng_lang</span> <span class="o">=</span> <span class="n">language_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_lang</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_lang</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_lang</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;lang_&#39;</span> <span class="o">+</span> <span class="n">eng_lang</span>
+
+ <span class="c1"># alias languages</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="s1">&#39;zh&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;lang_zh-CN&#39;</span>
+
+ <span class="c1"># supported region codes</span>
+
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//select[@name=&#39;gl&#39;]/option&quot;</span><span class="p">):</span>
+ <span class="n">eng_country</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">eng_country</span> <span class="ow">in</span> <span class="n">skip_countries</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="n">eng_country</span> <span class="o">==</span> <span class="s1">&#39;ZZ&#39;</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="s1">&#39;ZZ&#39;</span>
+ <span class="k">continue</span>
+
+ <span class="n">sxng_locales</span> <span class="o">=</span> <span class="n">get_official_locales</span><span class="p">(</span><span class="n">eng_country</span><span class="p">,</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">keys</span><span class="p">(),</span> <span class="n">regional</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">sxng_locales</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: can&#39;t map from google country </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">) to a babel region.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;data-name&#39;</span><span class="p">),</span> <span class="n">eng_country</span><span class="p">))</span>
+ <span class="k">continue</span>
+
+ <span class="k">for</span> <span class="n">sxng_locale</span> <span class="ow">in</span> <span class="n">sxng_locales</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">region_tag</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">)]</span> <span class="o">=</span> <span class="n">eng_country</span>
+
+ <span class="c1"># alias regions</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="s1">&#39;zh-CN&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;HK&#39;</span>
+
+ <span class="c1"># supported domains</span>
+
+ <span class="k">if</span> <span class="n">add_domains</span><span class="p">:</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://www.google.com/supported_domains&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Response from https://www.google.com/supported_domains is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">domain</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">():</span> <span class="c1"># type: ignore</span>
+ <span class="n">domain</span> <span class="o">=</span> <span class="n">domain</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">domain</span> <span class="ow">or</span> <span class="n">domain</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="s1">&#39;.google.com&#39;</span><span class="p">,</span>
+ <span class="p">]:</span>
+ <span class="k">continue</span>
+ <span class="n">region</span> <span class="o">=</span> <span class="n">domain</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;supported_domains&#39;</span><span class="p">][</span><span class="n">region</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;www&#39;</span> <span class="o">+</span> <span class="n">domain</span> <span class="c1"># type: ignore</span>
+ <span class="k">if</span> <span class="n">region</span> <span class="o">==</span> <span class="s1">&#39;HK&#39;</span><span class="p">:</span>
+ <span class="c1"># There is no google.cn, we use .com.hk for zh-CN</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;supported_domains&#39;</span><span class="p">][</span><span class="s1">&#39;CN&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;www&#39;</span> <span class="o">+</span> <span class="n">domain</span> <span class="c1"># type: ignore</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/google_images.html b/_modules/searx/engines/google_images.html
new file mode 100644
index 000000000..f57e898fe
--- /dev/null
+++ b/_modules/searx/engines/google_images.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.google_images &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.google_images</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.google_images</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;This is the implementation of the Google Images engine using the internal</span>
+<span class="sd">Google API used by the Google Go Android app.</span>
+
+<span class="sd">This internal API offer results in</span>
+
+<span class="sd">- JSON (``_fmt:json``)</span>
+<span class="sd">- Protobuf_ (``_fmt:pb``)</span>
+<span class="sd">- Protobuf_ compressed? (``_fmt:pc``)</span>
+<span class="sd">- HTML (``_fmt:html``)</span>
+<span class="sd">- Protobuf_ encoded in JSON (``_fmt:jspb``).</span>
+
+<span class="sd">.. _Protobuf: https://en.wikipedia.org/wiki/Protocol_Buffers</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">json</span> <span class="kn">import</span> <span class="n">loads</span>
+
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="c1"># pylint: disable=unused-import</span>
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">get_google_info</span><span class="p">,</span>
+ <span class="n">time_range_dict</span><span class="p">,</span>
+ <span class="n">detect_google_sorry</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+ <span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+ <span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://images.google.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q521550&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://developers.google.com/custom-search&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;images&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">50</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">filter_mapping</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s1">&#39;images&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;active&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;active&#39;</span><span class="p">}</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_images.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Google-Image search request&quot;&quot;&quot;</span>
+
+ <span class="n">google_info</span> <span class="o">=</span> <span class="n">get_google_info</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">traits</span><span class="p">)</span>
+
+ <span class="n">query_url</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="s1">&#39;https://&#39;</span>
+ <span class="o">+</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span>
+ <span class="o">+</span> <span class="s1">&#39;/search&#39;</span>
+ <span class="o">+</span> <span class="s2">&quot;?&quot;</span>
+ <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;tbm&#39;</span><span class="p">:</span> <span class="s2">&quot;isch&quot;</span><span class="p">,</span>
+ <span class="o">**</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;asearch&#39;</span><span class="p">:</span> <span class="s1">&#39;isch&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;async&#39;</span><span class="p">:</span> <span class="s1">&#39;_fmt:json,p:1,ijn:&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]),</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_dict</span><span class="p">:</span>
+ <span class="n">query_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;tbs&#39;</span><span class="p">:</span> <span class="s1">&#39;qdr:&#39;</span> <span class="o">+</span> <span class="n">time_range_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]})</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]:</span>
+ <span class="n">query_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;safe&#39;</span><span class="p">:</span> <span class="n">filter_mapping</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]]})</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">query_url</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_images.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get response from google&#39;s search request&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">detect_google_sorry</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="n">json_start</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;{&quot;ischj&quot;:&#39;</span><span class="p">)</span>
+ <span class="n">json_data</span> <span class="o">=</span> <span class="n">loads</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">[</span><span class="n">json_start</span><span class="p">:])</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">json_data</span><span class="p">[</span><span class="s2">&quot;ischj&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;metadata&quot;</span><span class="p">,</span> <span class="p">[]):</span>
+
+ <span class="n">result_item</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">][</span><span class="s2">&quot;referrer_url&quot;</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">][</span><span class="s2">&quot;page_title&quot;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;text_in_grid&quot;</span><span class="p">][</span><span class="s2">&quot;snippet&quot;</span><span class="p">],</span>
+ <span class="s1">&#39;source&#39;</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">][</span><span class="s2">&quot;site_title&quot;</span><span class="p">],</span>
+ <span class="s1">&#39;resolution&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">item</span><span class="p">[</span><span class="s2">&quot;original_image&quot;</span><span class="p">][</span><span class="s2">&quot;width&quot;</span><span class="p">]</span><span class="si">}</span><span class="s1"> x </span><span class="si">{</span><span class="n">item</span><span class="p">[</span><span class="s2">&quot;original_image&quot;</span><span class="p">][</span><span class="s2">&quot;height&quot;</span><span class="p">]</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;original_image&quot;</span><span class="p">][</span><span class="s2">&quot;url&quot;</span><span class="p">],</span>
+ <span class="s1">&#39;thumbnail_src&#39;</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;thumbnail&quot;</span><span class="p">][</span><span class="s2">&quot;url&quot;</span><span class="p">],</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;images.html&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">author</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;iptc&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;creator&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">author</span><span class="p">:</span>
+ <span class="n">result_item</span><span class="p">[</span><span class="s1">&#39;author&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">author</span><span class="p">)</span>
+
+ <span class="n">copyright_notice</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;iptc&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;copyright_notice&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">copyright_notice</span><span class="p">:</span>
+ <span class="n">result_item</span><span class="p">[</span><span class="s1">&#39;source&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39; | &#39;</span> <span class="o">+</span> <span class="n">copyright_notice</span>
+
+ <span class="n">freshness_date</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;result&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;freshness_date&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">freshness_date</span><span class="p">:</span>
+ <span class="n">result_item</span><span class="p">[</span><span class="s1">&#39;source&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39; | &#39;</span> <span class="o">+</span> <span class="n">freshness_date</span>
+
+ <span class="n">file_size</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;gsa&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;file_size&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">file_size</span><span class="p">:</span>
+ <span class="n">result_item</span><span class="p">[</span><span class="s1">&#39;source&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39; (</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="n">file_size</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result_item</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/google_news.html b/_modules/searx/engines/google_news.html
new file mode 100644
index 000000000..9a2f1c51b
--- /dev/null
+++ b/_modules/searx/engines/google_news.html
@@ -0,0 +1,422 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.google_news &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.google_news</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.google_news</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;This is the implementation of the Google News engine.</span>
+
+<span class="sd">Google News has a different region handling compared to Google WEB.</span>
+
+<span class="sd">- the ``ceid`` argument has to be set (:py:obj:`ceid_list`)</span>
+<span class="sd">- the hl_ argument has to be set correctly (and different to Google WEB)</span>
+<span class="sd">- the gl_ argument is mandatory</span>
+
+<span class="sd">If one of this argument is not set correctly, the request is redirected to</span>
+<span class="sd">CONSENT dialog::</span>
+
+<span class="sd"> https://consent.google.com/m?continue=</span>
+
+<span class="sd">The google news API ignores some parameters from the common :ref:`google API`:</span>
+
+<span class="sd">- num_ : the number of search results is ignored / there is no paging all</span>
+<span class="sd"> results for a query term are in the first response.</span>
+<span class="sd">- save_ : is ignored / Google-News results are always *SafeSearch*</span>
+
+<span class="sd">.. _hl: https://developers.google.com/custom-search/docs/xml_results#hlsp</span>
+<span class="sd">.. _gl: https://developers.google.com/custom-search/docs/xml_results#glsp</span>
+<span class="sd">.. _num: https://developers.google.com/custom-search/docs/xml_results#numsp</span>
+<span class="sd">.. _save: https://developers.google.com/custom-search/docs/xml_results#safesp</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">import</span> <span class="nn">base64</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">locales</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">eval_xpath</span><span class="p">,</span>
+ <span class="n">eval_xpath_list</span><span class="p">,</span>
+ <span class="n">eval_xpath_getindex</span><span class="p">,</span>
+ <span class="n">extract_text</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="k">as</span> <span class="n">_fetch_traits</span> <span class="c1"># pylint: disable=unused-import</span>
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">get_google_info</span><span class="p">,</span>
+ <span class="n">detect_google_sorry</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://news.google.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q12020&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://developers.google.com/custom-search&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;news&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">False</span>
+
+<span class="c1"># Google-News results are always *SafeSearch*. Option &#39;safesearch&#39; is set to</span>
+<span class="c1"># False here, otherwise checker will report safesearch-errors::</span>
+<span class="c1">#</span>
+<span class="c1"># safesearch : results are identical for safesearch=0 and safesearch=2</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="c1"># send_accept_language_header = True</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_news.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Google-News search request&quot;&quot;&quot;</span>
+
+ <span class="n">sxng_locale</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">,</span> <span class="s1">&#39;en-US&#39;</span><span class="p">)</span>
+ <span class="n">ceid</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">get_engine_locale</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;ceid&#39;</span><span class="p">],</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;US:en&#39;</span><span class="p">)</span>
+ <span class="n">google_info</span> <span class="o">=</span> <span class="n">get_google_info</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">traits</span><span class="p">)</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;news.google.com&#39;</span> <span class="c1"># google news has only one domain</span>
+
+ <span class="n">ceid_region</span><span class="p">,</span> <span class="n">ceid_lang</span> <span class="o">=</span> <span class="n">ceid</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
+ <span class="n">ceid_lang</span><span class="p">,</span> <span class="n">ceid_suffix</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">ceid_lang</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="p">[</span>
+ <span class="kc">None</span><span class="p">,</span>
+ <span class="p">]</span>
+ <span class="p">)[:</span><span class="mi">2</span><span class="p">]</span>
+
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;hl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ceid_lang</span>
+
+ <span class="k">if</span> <span class="n">ceid_suffix</span> <span class="ow">and</span> <span class="n">ceid_suffix</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;Hans&#39;</span><span class="p">,</span> <span class="s1">&#39;Hant&#39;</span><span class="p">]:</span>
+
+ <span class="k">if</span> <span class="n">ceid_region</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">ceid_lang</span><span class="p">:</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;hl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ceid_lang</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">ceid_region</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;hl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ceid_lang</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">ceid_suffix</span>
+
+ <span class="k">elif</span> <span class="n">ceid_region</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="n">ceid_lang</span><span class="p">:</span>
+
+ <span class="k">if</span> <span class="n">ceid_region</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;AT&#39;</span><span class="p">,</span> <span class="s1">&#39;BE&#39;</span><span class="p">,</span> <span class="s1">&#39;CH&#39;</span><span class="p">,</span> <span class="s1">&#39;IL&#39;</span><span class="p">,</span> <span class="s1">&#39;SA&#39;</span><span class="p">,</span> <span class="s1">&#39;IN&#39;</span><span class="p">,</span> <span class="s1">&#39;BD&#39;</span><span class="p">,</span> <span class="s1">&#39;PT&#39;</span><span class="p">]:</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;hl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ceid_lang</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;hl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ceid_lang</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">ceid_region</span>
+
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;lr&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;lang_&#39;</span> <span class="o">+</span> <span class="n">ceid_lang</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">][</span><span class="s1">&#39;gl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ceid_region</span>
+
+ <span class="n">query_url</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="s1">&#39;https://&#39;</span>
+ <span class="o">+</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span>
+ <span class="o">+</span> <span class="s2">&quot;/search?&quot;</span>
+ <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="o">**</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="c1"># ceid includes a &#39;:&#39; character which must not be urlencoded</span>
+ <span class="o">+</span> <span class="p">(</span><span class="s1">&#39;&amp;ceid=</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">ceid</span><span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">query_url</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_news.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get response from google&#39;s search request&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">detect_google_sorry</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="c1"># convert the text to dom</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@class=&quot;xrnccd&quot;]&#39;</span><span class="p">):</span>
+
+ <span class="c1"># The first &lt;a&gt; tag in the &lt;article&gt; contains the link to the article</span>
+ <span class="c1"># The href attribute of the &lt;a&gt; tag is a google internal link, we have</span>
+ <span class="c1"># to decode</span>
+
+ <span class="n">href</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;./article/a/@href&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="n">href</span> <span class="o">=</span> <span class="n">href</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;?&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">href</span> <span class="o">=</span> <span class="n">href</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">href</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">urlsafe_b64decode</span><span class="p">(</span><span class="n">href</span> <span class="o">+</span> <span class="s1">&#39;====&#39;</span><span class="p">)</span>
+ <span class="n">href</span> <span class="o">=</span> <span class="n">href</span><span class="p">[</span><span class="n">href</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;http&#39;</span><span class="p">)</span> <span class="p">:]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xd2</span><span class="s1">&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">href</span> <span class="o">=</span> <span class="n">href</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
+
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;./article/h3[1]&#39;</span><span class="p">))</span>
+
+ <span class="c1"># The pub_date is mostly a string like &#39;yesterday&#39;, not a real</span>
+ <span class="c1"># timezone date or time. Therefore we can&#39;t use publishedDate.</span>
+ <span class="n">pub_date</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;./article//time&#39;</span><span class="p">))</span>
+ <span class="n">pub_origin</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;./article//a[@data-n-tid]&#39;</span><span class="p">))</span>
+
+ <span class="n">content</span> <span class="o">=</span> <span class="s1">&#39; / &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="n">pub_origin</span><span class="p">,</span> <span class="n">pub_date</span><span class="p">]</span> <span class="k">if</span> <span class="n">x</span><span class="p">])</span>
+
+ <span class="c1"># The image URL is located in a preceding sibling &lt;img&gt; tag, e.g.:</span>
+ <span class="c1"># &quot;https://lh3.googleusercontent.com/DjhQh7DMszk.....z=-p-h100-w100&quot;</span>
+ <span class="c1"># These URL are long but not personalized (double checked via tor).</span>
+
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;preceding-sibling::a/figure/img/@src&#39;</span><span class="p">))</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">href</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">img_src</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="c1"># return results</span>
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<span class="n">ceid_list</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="s1">&#39;AE:ar&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;AR:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;AT:de&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;AU:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;BD:bn&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;BE:fr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;BE:nl&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;BG:bg&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;BR:pt-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;BW:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CA:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CA:fr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CH:de&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CH:fr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CL:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CN:zh-Hans&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CO:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CU:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;CZ:cs&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;DE:de&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;EG:ar&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ES:es&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ET:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;FR:fr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;GB:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;GH:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;GR:el&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;HK:zh-Hant&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;HU:hu&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ID:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ID:id&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IE:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IL:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IL:he&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IN:bn&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IN:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IN:hi&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IN:ml&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IN:mr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IN:ta&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IN:te&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;IT:it&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;JP:ja&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;KE:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;KR:ko&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;LB:ar&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;LT:lt&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;LV:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;LV:lv&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;MA:fr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;MX:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;MY:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;NA:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;NG:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;NL:nl&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;NO:no&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;NZ:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;PE:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;PH:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;PK:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;PL:pl&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;PT:pt-150&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;RO:ro&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;RS:sr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;RU:ru&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;SA:ar&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;SE:sv&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;SG:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;SI:sl&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;SK:sk&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;SN:fr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;TH:th&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;TR:tr&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;TW:zh-Hant&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;TZ:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;UA:ru&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;UA:uk&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;UG:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;US:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;US:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;VE:es-419&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;VN:vi&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ZA:en&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ZW:en&#39;</span><span class="p">,</span>
+<span class="p">]</span>
+<span class="sd">&quot;&quot;&quot;List of region/language combinations supported by Google News. Values of the</span>
+<span class="sd">``ceid`` argument of the Google News REST API.&quot;&quot;&quot;</span>
+
+
+<span class="n">_skip_values</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="s1">&#39;ET:en&#39;</span><span class="p">,</span> <span class="c1"># english (ethiopia)</span>
+ <span class="s1">&#39;ID:en&#39;</span><span class="p">,</span> <span class="c1"># english (indonesia)</span>
+ <span class="s1">&#39;LV:en&#39;</span><span class="p">,</span> <span class="c1"># english (latvia)</span>
+<span class="p">]</span>
+
+<span class="n">_ceid_locale_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;NO:no&#39;</span><span class="p">:</span> <span class="s1">&#39;nb-NO&#39;</span><span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+ <span class="n">_fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">,</span> <span class="n">add_domains</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;ceid&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">for</span> <span class="n">ceid</span> <span class="ow">in</span> <span class="n">ceid_list</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">ceid</span> <span class="ow">in</span> <span class="n">_skip_values</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">region</span><span class="p">,</span> <span class="n">lang</span> <span class="o">=</span> <span class="n">ceid</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
+ <span class="n">x</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;Hant&#39;</span><span class="p">,</span> <span class="s1">&#39;Hans&#39;</span><span class="p">]:</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+
+ <span class="n">sxng_locale</span> <span class="o">=</span> <span class="n">_ceid_locale_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ceid</span><span class="p">,</span> <span class="n">lang</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">region</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="n">sxng_locale</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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: </span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2"> is unknown by babel&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ceid</span><span class="p">,</span> <span class="n">sxng_locale</span><span class="p">))</span>
+ <span class="k">continue</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;ceid&#39;</span><span class="p">][</span><span class="n">locales</span><span class="o">.</span><span class="n">region_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)]</span> <span class="o">=</span> <span class="n">ceid</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/google_scholar.html b/_modules/searx/engines/google_scholar.html
new file mode 100644
index 000000000..5eac76576
--- /dev/null
+++ b/_modules/searx/engines/google_scholar.html
@@ -0,0 +1,344 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.google_scholar &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.google_scholar</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.google_scholar</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;This is the implementation of the Google Scholar engine.</span>
+
+<span class="sd">Compared to other Google services the Scholar engine has a simple GET REST-API</span>
+<span class="sd">and there does not exists `async` API. Even though the API slightly vintage we</span>
+<span class="sd">can make use of the :ref:`google API` to assemble the arguments of the GET</span>
+<span class="sd">request.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">eval_xpath</span><span class="p">,</span>
+ <span class="n">eval_xpath_getindex</span><span class="p">,</span>
+ <span class="n">eval_xpath_list</span><span class="p">,</span>
+ <span class="n">extract_text</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineCaptchaException</span>
+
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="c1"># pylint: disable=unused-import</span>
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">get_google_info</span><span class="p">,</span>
+ <span class="n">time_range_dict</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://scholar.google.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q494817&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://developers.google.com/custom-search&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;science&#39;</span><span class="p">,</span> <span class="s1">&#39;scientific publications&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">50</span>
+<span class="n">language_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+
+
+<div class="viewcode-block" id="time_range_args">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_scholar.time_range_args">[docs]</a>
+<span class="k">def</span> <span class="nf">time_range_args</span><span class="p">(</span><span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a dictionary with a time range arguments based on</span>
+<span class="sd"> ``params[&#39;time_range&#39;]``.</span>
+
+<span class="sd"> Google Scholar supports a detailed search by year. Searching by *last</span>
+<span class="sd"> month* or *last week* (as offered by SearXNG) is uncommon for scientific</span>
+<span class="sd"> publications and is not supported by Google Scholar.</span>
+
+<span class="sd"> To limit the result list when the users selects a range, all the SearXNG</span>
+<span class="sd"> ranges (*day*, *week*, *month*, *year*) are mapped to *year*. If no range</span>
+<span class="sd"> is set an empty dictionary of arguments is returned. Example; when</span>
+<span class="sd"> user selects a time range (current year minus one in 2022):</span>
+
+<span class="sd"> .. code:: python</span>
+
+<span class="sd"> { &#39;as_ylo&#39; : 2021 }</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ret_val</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_dict</span><span class="p">:</span>
+ <span class="n">ret_val</span><span class="p">[</span><span class="s1">&#39;as_ylo&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">year</span> <span class="o">-</span> <span class="mi">1</span>
+ <span class="k">return</span> <span class="n">ret_val</span></div>
+
+
+
+<div class="viewcode-block" id="detect_google_captcha">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_scholar.detect_google_captcha">[docs]</a>
+<span class="k">def</span> <span class="nf">detect_google_captcha</span><span class="p">(</span><span class="n">dom</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;In case of CAPTCHA Google Scholar open its own *not a Robot* dialog and is</span>
+<span class="sd"> not redirected to ``sorry.google.com``.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//form[@id=&#39;gs_captcha_f&#39;]&quot;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SearxEngineCaptchaException</span><span class="p">()</span></div>
+
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_scholar.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Google-Scholar search request&quot;&quot;&quot;</span>
+
+ <span class="n">google_info</span> <span class="o">=</span> <span class="n">get_google_info</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">traits</span><span class="p">)</span>
+ <span class="c1"># subdomain is: scholar.google.xy</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;www.&quot;</span><span class="p">,</span> <span class="s2">&quot;scholar.&quot;</span><span class="p">)</span>
+
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="o">**</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;start&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span>
+ <span class="s1">&#39;as_sdt&#39;</span><span class="p">:</span> <span class="s1">&#39;2007&#39;</span><span class="p">,</span> <span class="c1"># include patents / to disable set &#39;0,5&#39;</span>
+ <span class="s1">&#39;as_vis&#39;</span><span class="p">:</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="c1"># include citations / to disable set &#39;1&#39;</span>
+ <span class="p">}</span>
+ <span class="n">args</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">time_range_args</span><span class="p">(</span><span class="n">params</span><span class="p">))</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span> <span class="o">+</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s1">&#39;/scholar?&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="parse_gs_a">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_scholar.parse_gs_a">[docs]</a>
+<span class="k">def</span> <span class="nf">parse_gs_a</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse the text written in green.</span>
+
+<span class="sd"> Possible formats:</span>
+<span class="sd"> * &quot;{authors} - {journal}, {year} - {publisher}&quot;</span>
+<span class="sd"> * &quot;{authors} - {year} - {publisher}&quot;</span>
+<span class="sd"> * &quot;{authors} - {publisher}&quot;</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">text</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">text</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
+
+ <span class="n">s_text</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; - &#39;</span><span class="p">)</span>
+ <span class="n">authors</span> <span class="o">=</span> <span class="n">s_text</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">)</span>
+ <span class="n">publisher</span> <span class="o">=</span> <span class="n">s_text</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">s_text</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">authors</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">publisher</span><span class="p">,</span> <span class="kc">None</span>
+
+ <span class="c1"># the format is &quot;{authors} - {journal}, {year} - {publisher}&quot; or &quot;{authors} - {year} - {publisher}&quot;</span>
+ <span class="c1"># get journal and year</span>
+ <span class="n">journal_year</span> <span class="o">=</span> <span class="n">s_text</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">)</span>
+ <span class="c1"># journal is optional and may contains some coma</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">journal_year</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">journal</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">journal_year</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">journal</span> <span class="o">==</span> <span class="s1">&#39;…&#39;</span><span class="p">:</span>
+ <span class="n">journal</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">journal</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="c1"># year</span>
+ <span class="n">year</span> <span class="o">=</span> <span class="n">journal_year</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">publishedDate</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">year</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="s1">&#39;%Y&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="n">publishedDate</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">return</span> <span class="n">authors</span><span class="p">,</span> <span class="n">journal</span><span class="p">,</span> <span class="n">publisher</span><span class="p">,</span> <span class="n">publishedDate</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_scholar.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span> <span class="c1"># pylint: disable=too-many-locals</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse response from Google Scholar&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># convert the text to dom</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">detect_google_captcha</span><span class="p">(</span><span class="n">dom</span><span class="p">)</span>
+
+ <span class="c1"># parse results</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@data-rp]&#39;</span><span class="p">):</span>
+
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//h3[1]//a&#39;</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">title</span><span class="p">:</span>
+ <span class="c1"># this is a [ZITATION] block</span>
+ <span class="k">continue</span>
+
+ <span class="n">pub_type</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//span[@class=&quot;gs_ctg2&quot;]&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">pub_type</span><span class="p">:</span>
+ <span class="n">pub_type</span> <span class="o">=</span> <span class="n">pub_type</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//h3[1]//a/@href&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;gs_rs&quot;]&#39;</span><span class="p">))</span>
+ <span class="n">authors</span><span class="p">,</span> <span class="n">journal</span><span class="p">,</span> <span class="n">publisher</span><span class="p">,</span> <span class="n">publishedDate</span> <span class="o">=</span> <span class="n">parse_gs_a</span><span class="p">(</span>
+ <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;gs_a&quot;]&#39;</span><span class="p">))</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">publisher</span> <span class="ow">in</span> <span class="n">url</span><span class="p">:</span>
+ <span class="n">publisher</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="c1"># cited by</span>
+ <span class="n">comments</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;gs_fl&quot;]/a[starts-with(@href,&quot;/scholar?cites=&quot;)]&#39;</span><span class="p">))</span>
+
+ <span class="c1"># link to the html or pdf document</span>
+ <span class="n">html_url</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">pdf_url</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">doc_url</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;gs_or_ggsm&quot;]/a/@href&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+ <span class="n">doc_type</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//span[@class=&quot;gs_ctg2&quot;]&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">doc_type</span> <span class="o">==</span> <span class="s2">&quot;[PDF]&quot;</span><span class="p">:</span>
+ <span class="n">pdf_url</span> <span class="o">=</span> <span class="n">doc_url</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">html_url</span> <span class="o">=</span> <span class="n">doc_url</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;paper.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="n">pub_type</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;authors&#39;</span><span class="p">:</span> <span class="n">authors</span><span class="p">,</span>
+ <span class="s1">&#39;publisher&#39;</span><span class="p">:</span> <span class="n">publisher</span><span class="p">,</span>
+ <span class="s1">&#39;journal&#39;</span><span class="p">:</span> <span class="n">journal</span><span class="p">,</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">publishedDate</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;comments&#39;</span><span class="p">:</span> <span class="n">comments</span><span class="p">,</span>
+ <span class="s1">&#39;html_url&#39;</span><span class="p">:</span> <span class="n">html_url</span><span class="p">,</span>
+ <span class="s1">&#39;pdf_url&#39;</span><span class="p">:</span> <span class="n">pdf_url</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="c1"># parse suggestion</span>
+ <span class="k">for</span> <span class="n">suggestion</span> <span class="ow">in</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[contains(@class, &quot;gs_qsuggest_wrap&quot;)]//li//a&#39;</span><span class="p">):</span>
+ <span class="c1"># append suggestion</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;suggestion&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">suggestion</span><span class="p">)})</span>
+
+ <span class="k">for</span> <span class="n">correction</span> <span class="ow">in</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@class=&quot;gs_r gs_pda&quot;]/a&#39;</span><span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;correction&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">correction</span><span class="p">)})</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/google_videos.html b/_modules/searx/engines/google_videos.html
new file mode 100644
index 000000000..02bd9dc58
--- /dev/null
+++ b/_modules/searx/engines/google_videos.html
@@ -0,0 +1,255 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.google_videos &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.google_videos</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.google_videos</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;This is the implementation of the Google Videos engine.</span>
+
+<span class="sd">.. admonition:: Content-Security-Policy (CSP)</span>
+
+<span class="sd"> This engine needs to allow images from the `data URLs`_ (prefixed with the</span>
+<span class="sd"> ``data:`` scheme)::</span>
+
+<span class="sd"> Header set Content-Security-Policy &quot;img-src &#39;self&#39; data: ;&quot;</span>
+
+<span class="sd">.. _data URLs:</span>
+<span class="sd"> https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">eval_xpath</span><span class="p">,</span>
+ <span class="n">eval_xpath_list</span><span class="p">,</span>
+ <span class="n">eval_xpath_getindex</span><span class="p">,</span>
+ <span class="n">extract_text</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="c1"># pylint: disable=unused-import</span>
+<span class="kn">from</span> <span class="nn">searx.engines.google</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">get_google_info</span><span class="p">,</span>
+ <span class="n">time_range_dict</span><span class="p">,</span>
+ <span class="n">filter_mapping</span><span class="p">,</span>
+ <span class="n">suggestion_xpath</span><span class="p">,</span>
+ <span class="n">detect_google_sorry</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.google.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q219885&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://developers.google.com/custom-search&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;videos&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">50</span>
+<span class="n">language_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_videos.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Google-Video search request&quot;&quot;&quot;</span>
+
+ <span class="n">google_info</span> <span class="o">=</span> <span class="n">get_google_info</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">traits</span><span class="p">)</span>
+
+ <span class="n">query_url</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="s1">&#39;https://&#39;</span>
+ <span class="o">+</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;subdomain&#39;</span><span class="p">]</span>
+ <span class="o">+</span> <span class="s1">&#39;/search&#39;</span>
+ <span class="o">+</span> <span class="s2">&quot;?&quot;</span>
+ <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;tbm&#39;</span><span class="p">:</span> <span class="s2">&quot;vid&quot;</span><span class="p">,</span>
+ <span class="s1">&#39;start&#39;</span><span class="p">:</span> <span class="mi">10</span> <span class="o">*</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">],</span>
+ <span class="o">**</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;asearch&#39;</span><span class="p">:</span> <span class="s1">&#39;arc&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;async&#39;</span><span class="p">:</span> <span class="s1">&#39;use_ac:true,_fmt:html&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_dict</span><span class="p">:</span>
+ <span class="n">query_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;tbs&#39;</span><span class="p">:</span> <span class="s1">&#39;qdr:&#39;</span> <span class="o">+</span> <span class="n">time_range_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]})</span>
+ <span class="k">if</span> <span class="s1">&#39;safesearch&#39;</span> <span class="ow">in</span> <span class="n">params</span><span class="p">:</span>
+ <span class="n">query_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;safe&#39;</span><span class="p">:</span> <span class="n">filter_mapping</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]]})</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">query_url</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">google_info</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/google.html#searx.engines.google_videos.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get response from google&#39;s search request&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">detect_google_sorry</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="c1"># convert the text to dom</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="c1"># parse results</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[contains(@class, &quot;g &quot;)]&#39;</span><span class="p">):</span>
+
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//img/@src&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">img_src</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//a/h3[1]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//a/h3[1]/../@href&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+
+ <span class="n">c_node</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;ITZIwc&quot;]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">c_node</span><span class="p">)</span>
+ <span class="n">pub_info</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;gqF9jc&quot;]&#39;</span><span class="p">))</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;author&#39;</span><span class="p">:</span> <span class="n">pub_info</span><span class="p">,</span>
+ <span class="s1">&#39;thumbnail&#39;</span><span class="p">:</span> <span class="n">img_src</span><span class="p">,</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;videos.html&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="c1"># parse suggestion</span>
+ <span class="k">for</span> <span class="n">suggestion</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">suggestion_xpath</span><span class="p">):</span>
+ <span class="c1"># append suggestion</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;suggestion&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">suggestion</span><span class="p">)})</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/mrs.html b/_modules/searx/engines/mrs.html
new file mode 100644
index 000000000..1a3af0eb6
--- /dev/null
+++ b/_modules/searx/engines/mrs.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.mrs &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.mrs</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.mrs</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;Matrix Rooms Search - a fully-featured, standalone, matrix rooms search service.</span>
+
+<span class="sd">Configuration</span>
+<span class="sd">=============</span>
+
+<span class="sd">The engine has the following mandatory settings:</span>
+
+<span class="sd">- :py:obj:`base_url`</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: MRS</span>
+<span class="sd"> engine: mrs</span>
+<span class="sd"> base_url: https://mrs-host</span>
+<span class="sd"> ...</span>
+
+<span class="sd">Implementation</span>
+<span class="sd">==============</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">quote_plus</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://matrixrooms.info&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://gitlab.com/etke.cc/mrs/api/-/blob/main/openapi.yml?ref_type=heads&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;social media&#39;</span><span class="p">]</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+<span class="n">matrix_url</span> <span class="o">=</span> <span class="s2">&quot;https://matrix.to&quot;</span>
+<span class="n">page_size</span> <span class="o">=</span> <span class="mi">20</span>
+
+
+<div class="viewcode-block" id="init">
+<a class="viewcode-back" href="../../../dev/engines/online/mrs.html#searx.engines.mrs.init">[docs]</a>
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="p">):</span> <span class="c1"># pylint: disable=unused-argument</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;The ``base_url`` must be set in the configuration, if ``base_url`` is not</span>
+<span class="sd"> set, a :py:obj:`ValueError` is raised during initialization.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">base_url</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;engine MRS, base_url is unset&#39;</span><span class="p">)</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/search/</span><span class="si">{</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">query</span><span class="p">)</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">page_size</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">page_size</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">json</span><span class="p">():</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">matrix_url</span> <span class="o">+</span> <span class="s1">&#39;/#/&#39;</span> <span class="o">+</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;alias&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;topic&#39;</span><span class="p">]</span>
+ <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot; // </span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;members&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> members&quot;</span>
+ <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot; // </span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;alias&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot; // </span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;server&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="s1">&#39;thumbnail&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;avatar_url&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/mullvad_leta.html b/_modules/searx/engines/mullvad_leta.html
new file mode 100644
index 000000000..449571e60
--- /dev/null
+++ b/_modules/searx/engines/mullvad_leta.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.mullvad_leta &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.mullvad_leta</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.mullvad_leta</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;This is the implementation of the Mullvad-Leta meta-search engine.</span>
+
+<span class="sd">This engine **REQUIRES** that searxng operate within a Mullvad VPN</span>
+
+<span class="sd">If using docker, consider using gluetun for easily connecting to the Mullvad</span>
+
+<span class="sd">- https://github.com/qdm12/gluetun</span>
+
+<span class="sd">Otherwise, follow instructions provided by Mullvad for enabling the VPN on Linux</span>
+
+<span class="sd">- https://mullvad.net/en/help/install-mullvad-app-linux</span>
+
+<span class="sd">.. hint::</span>
+
+<span class="sd"> The :py:obj:`EngineTraits` is empty by default. Maintainers have to run</span>
+<span class="sd"> ``make data.traits`` (in the Mullvad VPN / :py:obj:`fetch_traits`) and rebase</span>
+<span class="sd"> the modified JSON file ``searx/data/engine_traits.json`` on every single</span>
+<span class="sd"> update of SearXNG!</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">from</span> <span class="nn">httpx</span> <span class="kn">import</span> <span class="n">Response</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">region_tag</span><span class="p">,</span> <span class="n">get_official_locales</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineResponseException</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="n">use_cache</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># non-cache use only has 100 searches per day!</span>
+
+<span class="n">search_url</span> <span class="o">=</span> <span class="s2">&quot;https://leta.mullvad.net&quot;</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="n">search_url</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q47008412&#39;</span><span class="p">,</span> <span class="c1"># the Mullvad id - not leta, but related</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://leta.mullvad.net/faq&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">50</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_dict</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;day&quot;</span><span class="p">:</span> <span class="s2">&quot;d1&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;week&quot;</span><span class="p">:</span> <span class="s2">&quot;w1&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;month&quot;</span><span class="p">:</span> <span class="s2">&quot;m1&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;year&quot;</span><span class="p">:</span> <span class="s2">&quot;y1&quot;</span><span class="p">,</span>
+<span class="p">}</span>
+
+
+<div class="viewcode-block" id="is_vpn_connected">
+<a class="viewcode-back" href="../../../dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.is_vpn_connected">[docs]</a>
+<span class="k">def</span> <span class="nf">is_vpn_connected</span><span class="p">(</span><span class="n">dom</span><span class="p">:</span> <span class="n">html</span><span class="o">.</span><span class="n">HtmlElement</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns true if the VPN is connected, False otherwise&quot;&quot;&quot;</span>
+ <span class="n">connected_text</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//main/div/p[1]&#39;</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">connected_text</span> <span class="o">!=</span> <span class="s1">&#39;You are not connected to Mullvad VPN.&#39;</span></div>
+
+
+
+<div class="viewcode-block" id="assign_headers">
+<a class="viewcode-back" href="../../../dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.assign_headers">[docs]</a>
+<span class="k">def</span> <span class="nf">assign_headers</span><span class="p">(</span><span class="n">headers</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assigns the headers to make a request to Mullvad Leta&quot;&quot;&quot;</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Accept&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8&quot;</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Content-Type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;application/x-www-form-urlencoded&quot;</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Host&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;leta.mullvad.net&quot;</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Origin&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;https://leta.mullvad.net&quot;</span>
+ <span class="k">return</span> <span class="n">headers</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">params</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="n">country</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">,</span> <span class="s1">&#39;all&#39;</span><span class="p">),</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_url</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;method&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;POST&#39;</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;q&quot;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s2">&quot;gl&quot;</span><span class="p">:</span> <span class="n">country</span> <span class="k">if</span> <span class="n">country</span> <span class="ow">is</span> <span class="nb">str</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="c1"># pylint: disable=undefined-variable</span>
+ <span class="k">if</span> <span class="n">use_cache</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;oc&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;on&quot;</span>
+ <span class="c1"># pylint: enable=undefined-variable</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_dict</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;dateRestrict&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">time_range_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;dateRestrict&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="c1"># Page 1 is n/a, Page 2 is 11, page 3 is 21, ...</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;start&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="s2">&quot;1&quot;</span><span class="p">])</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">assign_headers</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">extract_result</span><span class="p">(</span><span class="n">dom_result</span><span class="p">:</span> <span class="n">html</span><span class="o">.</span><span class="n">HtmlElement</span><span class="p">):</span>
+ <span class="p">[</span><span class="n">a_elem</span><span class="p">,</span> <span class="n">h3_elem</span><span class="p">,</span> <span class="n">p_elem</span><span class="p">]</span> <span class="o">=</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom_result</span><span class="p">,</span> <span class="s1">&#39;div/div/*&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">a_elem</span><span class="o">.</span><span class="n">text</span><span class="p">),</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">h3_elem</span><span class="p">),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">p_elem</span><span class="p">),</span>
+ <span class="p">}</span>
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">:</span> <span class="n">Response</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if connected to Mullvad VPN, then extracts the search results from</span>
+<span class="sd"> the DOM resp: requests response object&quot;&quot;&quot;</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">is_vpn_connected</span><span class="p">(</span><span class="n">dom</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SearxEngineResponseException</span><span class="p">(</span><span class="s1">&#39;Not connected to Mullvad VPN&#39;</span><span class="p">)</span>
+ <span class="n">search_results</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="o">.</span><span class="n">body</span><span class="p">,</span> <span class="s1">&#39;//main/div[2]/div&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">extract_result</span><span class="p">(</span><span class="n">sr</span><span class="p">)</span> <span class="k">for</span> <span class="n">sr</span> <span class="ow">in</span> <span class="n">search_results</span><span class="p">]</span></div>
+
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages and regions from Mullvad-Leta</span>
+
+<span class="sd"> .. warning::</span>
+
+<span class="sd"> Fetching the engine traits also requires a Mullvad VPN connection. If</span>
+<span class="sd"> not connected, then an error message will print and no traits will be</span>
+<span class="sd"> updated.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+ <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+ <span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">post</span> <span class="k">as</span> <span class="n">http_post</span>
+
+ <span class="c1"># pylint: enable=import-outside-toplevel</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">http_post</span><span class="p">(</span><span class="n">search_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">assign_headers</span><span class="p">({}))</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">resp</span><span class="p">,</span> <span class="n">Response</span><span class="p">):</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: failed to get response from mullvad-leta. Are you connected to the VPN?&quot;</span><span class="p">)</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from mullvad-leta is not OK. Are you connected to the VPN?&quot;</span><span class="p">)</span>
+ <span class="k">return</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">is_vpn_connected</span><span class="p">(</span><span class="n">dom</span><span class="p">):</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;ERROR: Not connected to Mullvad VPN&#39;</span><span class="p">)</span>
+ <span class="k">return</span>
+ <span class="c1"># supported region codes</span>
+ <span class="n">options</span> <span class="o">=</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="o">.</span><span class="n">body</span><span class="p">,</span> <span class="s1">&#39;//main/div/form/div[2]/div/select[1]/option&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">options</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">options</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;ERROR: could not find any results. Are you connected to the VPN?&#39;</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
+ <span class="n">eng_country</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">)</span>
+
+ <span class="n">sxng_locales</span> <span class="o">=</span> <span class="n">get_official_locales</span><span class="p">(</span><span class="n">eng_country</span><span class="p">,</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">keys</span><span class="p">(),</span> <span class="n">regional</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">sxng_locales</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span>
+ <span class="s2">&quot;ERROR: can&#39;t map from Mullvad-Leta country </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">) to a babel region.&quot;</span>
+ <span class="o">%</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;data-name&#39;</span><span class="p">),</span> <span class="n">eng_country</span><span class="p">)</span>
+ <span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="k">for</span> <span class="n">sxng_locale</span> <span class="ow">in</span> <span class="n">sxng_locales</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">region_tag</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">)]</span> <span class="o">=</span> <span class="n">eng_country</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/odysee.html b/_modules/searx/engines/odysee.html
new file mode 100644
index 000000000..8bda8b788
--- /dev/null
+++ b/_modules/searx/engines/odysee.html
@@ -0,0 +1,259 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.odysee &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.odysee</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.odysee</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;Odysee_ is a decentralized video hosting platform.</span>
+
+<span class="sd">.. _Odysee: https://github.com/OdyseeTeam/odysee-frontend</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">time</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># Engine metadata</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s2">&quot;https://odysee.com/&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s2">&quot;Q102046570&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s2">&quot;JSON&quot;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># Engine configuration</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">results_per_page</span> <span class="o">=</span> <span class="mi">20</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;videos&#39;</span><span class="p">]</span>
+
+<span class="c1"># Search URL (Note: lighthouse.lbry.com/search works too, and may be faster at times)</span>
+<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;https://lighthouse.odysee.tv/search&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="n">time_range_dict</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;day&quot;</span><span class="p">:</span> <span class="s2">&quot;today&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;week&quot;</span><span class="p">:</span> <span class="s2">&quot;thisweek&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;month&quot;</span><span class="p">:</span> <span class="s2">&quot;thismonth&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;year&quot;</span><span class="p">:</span> <span class="s2">&quot;thisyear&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">start_index</span> <span class="o">=</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;pageno&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">results_per_page</span>
+ <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;s&quot;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="n">results_per_page</span><span class="p">,</span>
+ <span class="s2">&quot;from&quot;</span><span class="p">:</span> <span class="n">start_index</span><span class="p">,</span>
+ <span class="s2">&quot;include&quot;</span><span class="p">:</span> <span class="s2">&quot;channel,thumbnail_url,title,description,duration,release_time&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;mediaType&quot;</span><span class="p">:</span> <span class="s2">&quot;video&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">lang</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">lang</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_dict</span><span class="p">:</span>
+ <span class="n">query_params</span><span class="p">[</span><span class="s1">&#39;time_filter&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">time_range_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s2">?</span><span class="si">{</span><span class="n">urlencode</span><span class="p">(</span><span class="n">query_params</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="c1"># Format the video duration</span>
+<span class="k">def</span> <span class="nf">format_duration</span><span class="p">(</span><span class="n">duration</span><span class="p">):</span>
+ <span class="n">seconds</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">duration</span><span class="p">)</span>
+ <span class="n">length</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">length</span><span class="o">.</span><span class="n">tm_hour</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%H:%M:%S&quot;</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%M:%S&quot;</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="n">data</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="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
+ <span class="n">claim_id</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;claimId&quot;</span><span class="p">]</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;title&quot;</span><span class="p">]</span>
+ <span class="n">thumbnail_url</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;thumbnail_url&quot;</span><span class="p">]</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">]</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span>
+ <span class="n">channel</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;channel&quot;</span><span class="p">]</span>
+ <span class="n">release_time</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;release_time&quot;</span><span class="p">]</span>
+ <span class="n">duration</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s2">&quot;duration&quot;</span><span class="p">]</span>
+
+ <span class="n">release_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">release_time</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;T&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&quot;%Y-%m-</span><span class="si">%d</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="n">formatted_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcfromtimestamp</span><span class="p">(</span><span class="n">release_date</span><span class="o">.</span><span class="n">timestamp</span><span class="p">())</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;https://odysee.com/</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">claim_id</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="n">iframe_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;https://odysee.com/$/embed/</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">claim_id</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="n">odysee_thumbnail</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;https://thumbnails.odycdn.com/optimize/s:390:0/quality:85/plain/</span><span class="si">{</span><span class="n">thumbnail_url</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="n">formatted_duration</span> <span class="o">=</span> <span class="n">format_duration</span><span class="p">(</span><span class="n">duration</span><span class="p">)</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="n">description</span><span class="p">,</span>
+ <span class="s2">&quot;author&quot;</span><span class="p">:</span> <span class="n">channel</span><span class="p">,</span>
+ <span class="s2">&quot;publishedDate&quot;</span><span class="p">:</span> <span class="n">formatted_date</span><span class="p">,</span>
+ <span class="s2">&quot;length&quot;</span><span class="p">:</span> <span class="n">formatted_duration</span><span class="p">,</span>
+ <span class="s2">&quot;thumbnail&quot;</span><span class="p">:</span> <span class="n">odysee_thumbnail</span><span class="p">,</span>
+ <span class="s2">&quot;iframe_src&quot;</span><span class="p">:</span> <span class="n">iframe_url</span><span class="p">,</span>
+ <span class="s2">&quot;template&quot;</span><span class="p">:</span> <span class="s2">&quot;videos.html&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/odysee.html#searx.engines.odysee.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Fetch languages from Odysee&#39;s source code.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span>
+ <span class="s1">&#39;https://raw.githubusercontent.com/OdyseeTeam/odysee-frontend/master/ui/constants/supported_browser_languages.js&#39;</span><span class="p">,</span> <span class="c1"># pylint: disable=line-too-long</span>
+ <span class="n">timeout</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: can&#39;t determine languages from Odysee&quot;</span><span class="p">)</span>
+ <span class="k">return</span>
+
+ <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">4</span><span class="p">]:</span>
+ <span class="n">lang_tag</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;: &quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">lang_tag</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot;-&quot;</span><span class="p">))</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="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: </span><span class="si">%s</span><span class="s2"> is unknown by babel&quot;</span> <span class="o">%</span> <span class="n">lang_tag</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">lang_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">lang_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">lang_tag</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/peertube.html b/_modules/searx/engines/peertube.html
new file mode 100644
index 000000000..25a763b55
--- /dev/null
+++ b/_modules/searx/engines/peertube.html
@@ -0,0 +1,306 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.peertube &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.peertube</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.peertube</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;Peertube and :py:obj:`SepiaSearch &lt;searx.engines.sepiasearch&gt;` do share</span>
+<span class="sd">(more or less) the same REST API and the schema of the JSON result is identical.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+<span class="kn">from</span> <span class="nn">dateutil.parser</span> <span class="kn">import</span> <span class="n">parse</span>
+<span class="kn">from</span> <span class="nn">dateutil.relativedelta</span> <span class="kn">import</span> <span class="n">relativedelta</span>
+
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">html_to_text</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="c1"># pylint: disable=line-too-long</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://joinpeertube.org&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q50938515&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://docs.joinpeertube.org/api-rest-reference.html#tag/Search/operation/searchVideos&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;videos&quot;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;https://peer.tube&quot;</span>
+<span class="sd">&quot;&quot;&quot;Base URL of the Peertube instance. A list of instances is available at:</span>
+
+<span class="sd">- https://instances.joinpeertube.org/instances</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_table</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="n">relativedelta</span><span class="p">(),</span>
+ <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">weeks</span><span class="o">=-</span><span class="mi">1</span><span class="p">),</span>
+ <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">months</span><span class="o">=-</span><span class="mi">1</span><span class="p">),</span>
+ <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">years</span><span class="o">=-</span><span class="mi">1</span><span class="p">),</span>
+<span class="p">}</span>
+
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch_table</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s1">&#39;both&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;false&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;false&#39;</span><span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">minute_to_hm</span><span class="p">(</span><span class="n">minute</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">minute</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2">:</span><span class="si">%02d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">divmod</span><span class="p">(</span><span class="n">minute</span><span class="p">,</span> <span class="mi">60</span><span class="p">))</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/peertube.html#searx.engines.peertube.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble request for the Peertube API&quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">query</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="c1"># eng_region = traits.get_region(params[&#39;searxng_locale&#39;], &#39;en_US&#39;)</span>
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">base_url</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot;/api/v1/search/videos?&quot;</span>
+ <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;search&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;searchTarget&#39;</span><span class="p">:</span> <span class="s1">&#39;search-index&#39;</span><span class="p">,</span> <span class="c1"># Vidiversum</span>
+ <span class="s1">&#39;resultType&#39;</span><span class="p">:</span> <span class="s1">&#39;videos&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;start&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span>
+ <span class="s1">&#39;count&#39;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
+ <span class="c1"># -createdAt: sort by date ascending / createdAt: date descending</span>
+ <span class="s1">&#39;sort&#39;</span><span class="p">:</span> <span class="s1">&#39;-match&#39;</span><span class="p">,</span> <span class="c1"># sort by *match descending*</span>
+ <span class="s1">&#39;nsfw&#39;</span><span class="p">:</span> <span class="n">safesearch_table</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">eng_lang</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39;&amp;languageOneOf[]=&#39;</span> <span class="o">+</span> <span class="n">eng_lang</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39;&amp;boostLanguages[]=&#39;</span> <span class="o">+</span> <span class="n">eng_lang</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_table</span><span class="p">:</span>
+ <span class="n">time</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">date</span><span class="p">()</span> <span class="o">+</span> <span class="n">time_range_table</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39;&amp;startDate=&#39;</span> <span class="o">+</span> <span class="n">time</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">video_response</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="video_response">
+<a class="viewcode-back" href="../../../dev/engines/online/peertube.html#searx.engines.peertube.video_response">[docs]</a>
+<span class="k">def</span> <span class="nf">video_response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse video response from SepiaSearch and Peertube instances.&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">json_data</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="k">if</span> <span class="s1">&#39;data&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">json_data</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">json_data</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]:</span>
+ <span class="n">metadata</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="n">x</span>
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;channel&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;displayName&#39;</span><span class="p">),</span>
+ <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;channel&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;@&#39;</span> <span class="o">+</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;channel&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;host&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tags&#39;</span><span class="p">,</span> <span class="p">[])),</span>
+ <span class="p">]</span>
+ <span class="k">if</span> <span class="n">x</span>
+ <span class="p">]</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">html_to_text</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;author&#39;</span><span class="p">:</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;account&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;displayName&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;length&#39;</span><span class="p">:</span> <span class="n">minute_to_hm</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;duration&#39;</span><span class="p">)),</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;videos.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">parse</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;publishedAt&#39;</span><span class="p">]),</span>
+ <span class="s1">&#39;iframe_src&#39;</span><span class="p">:</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;embedUrl&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;thumbnail&#39;</span><span class="p">:</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;thumbnailUrl&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;previewUrl&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;metadata&#39;</span><span class="p">:</span> <span class="s1">&#39; | &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">metadata</span><span class="p">),</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/peertube.html#searx.engines.peertube.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages from peertube&#39;s search-index source code.</span>
+
+<span class="sd"> See videoLanguages_ in commit `8ed5c729 - Refactor and redesign client`_</span>
+
+<span class="sd"> .. _8ed5c729 - Refactor and redesign client:</span>
+<span class="sd"> https://framagit.org/framasoft/peertube/search-index/-/commit/8ed5c729</span>
+<span class="sd"> .. _videoLanguages:</span>
+<span class="sd"> https://framagit.org/framasoft/peertube/search-index/-/commit/8ed5c729#3d8747f9a60695c367c70bb64efba8f403721fad_0_291</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span>
+ <span class="s1">&#39;https://framagit.org/framasoft/peertube/search-index/-/raw/master/client/src/components/Filters.vue&#39;</span><span class="p">,</span>
+ <span class="c1"># the response from search-index repository is very slow</span>
+ <span class="n">timeout</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from peertube is not OK.&quot;</span><span class="p">)</span>
+ <span class="k">return</span>
+
+ <span class="n">js_lang</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;videoLanguages \(\)[^\n]+(.*?)\]&quot;</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">js_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: can&#39;t determine languages from peertube&quot;</span><span class="p">)</span>
+ <span class="k">return</span>
+
+ <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\{ id: &#39;([a-z]+)&#39;, label:&quot;</span><span class="p">,</span> <span class="n">js_lang</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)):</span>
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">eng_tag</span> <span class="o">==</span> <span class="s1">&#39;oc&#39;</span><span class="p">:</span>
+ <span class="c1"># Occitanis not known by babel, its closest relative is Catalan</span>
+ <span class="c1"># but &#39;ca&#39; is already in the list of engine_traits.languages --&gt;</span>
+ <span class="c1"># &#39;oc&#39; will be ignored.</span>
+ <span class="k">continue</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">))</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="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: </span><span class="si">%s</span><span class="s2"> is unknown by babel&quot;</span> <span class="o">%</span> <span class="n">eng_tag</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="s1">&#39;zh_Hans&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;zh&#39;</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="s1">&#39;zh_Hant&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;zh&#39;</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/qwant.html b/_modules/searx/engines/qwant.html
new file mode 100644
index 000000000..2a48c97e1
--- /dev/null
+++ b/_modules/searx/engines/qwant.html
@@ -0,0 +1,468 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.qwant &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.qwant</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.qwant</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;This engine uses the Qwant API (https://api.qwant.com/v3) to implement Qwant</span>
+<span class="sd">-Web, -News, -Images and -Videos. The API is undocumented but can be reverse</span>
+<span class="sd">engineered by reading the network log of https://www.qwant.com/ queries.</span>
+
+<span class="sd">For Qwant&#39;s *web-search* two alternatives are implemented:</span>
+
+<span class="sd">- ``web``: uses the :py:obj:`api_url` which returns a JSON structure</span>
+<span class="sd">- ``web-lite``: uses the :py:obj:`web_lite_url` which returns a HTML page</span>
+
+
+<span class="sd">Configuration</span>
+<span class="sd">=============</span>
+
+<span class="sd">The engine has the following additional settings:</span>
+
+<span class="sd">- :py:obj:`qwant_categ`</span>
+
+<span class="sd">This implementation is used by different qwant engines in the :ref:`settings.yml</span>
+<span class="sd">&lt;settings engine&gt;`:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: qwant</span>
+<span class="sd"> qwant_categ: web-lite # alternatively use &#39;web&#39;</span>
+<span class="sd"> ...</span>
+<span class="sd"> - name: qwant news</span>
+<span class="sd"> qwant_categ: news</span>
+<span class="sd"> ...</span>
+<span class="sd"> - name: qwant images</span>
+<span class="sd"> qwant_categ: images</span>
+<span class="sd"> ...</span>
+<span class="sd"> - name: qwant videos</span>
+<span class="sd"> qwant_categ: videos</span>
+<span class="sd"> ...</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">datetime</span><span class="p">,</span>
+ <span class="n">timedelta</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">json</span> <span class="kn">import</span> <span class="n">loads</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">flask_babel</span> <span class="kn">import</span> <span class="n">gettext</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+<span class="kn">import</span> <span class="nn">lxml</span>
+
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineAPIException</span><span class="p">,</span> <span class="n">SearxEngineTooManyRequestsException</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">raise_for_httperror</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">eval_xpath</span><span class="p">,</span>
+ <span class="n">eval_xpath_list</span><span class="p">,</span>
+ <span class="n">extract_text</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.qwant.com/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q14657870&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">5</span>
+<span class="sd">&quot;&quot;&quot;5 pages maximum (``&amp;p=5``): Trying to do more just results in an improper</span>
+<span class="sd">redirect&quot;&quot;&quot;</span>
+
+<span class="n">qwant_categ</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="sd">&quot;&quot;&quot;One of ``web-lite`` (or ``web``), ``news``, ``images`` or ``videos``&quot;&quot;&quot;</span>
+
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="c1"># safe_search_map = {0: &#39;&amp;safesearch=0&#39;, 1: &#39;&amp;safesearch=1&#39;, 2: &#39;&amp;safesearch=2&#39;}</span>
+
+<span class="c1"># fmt: off</span>
+<span class="n">qwant_news_locales</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="s1">&#39;ca_ad&#39;</span><span class="p">,</span> <span class="s1">&#39;ca_es&#39;</span><span class="p">,</span> <span class="s1">&#39;ca_fr&#39;</span><span class="p">,</span> <span class="s1">&#39;co_fr&#39;</span><span class="p">,</span> <span class="s1">&#39;de_at&#39;</span><span class="p">,</span> <span class="s1">&#39;de_ch&#39;</span><span class="p">,</span> <span class="s1">&#39;de_de&#39;</span><span class="p">,</span> <span class="s1">&#39;en_au&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;en_ca&#39;</span><span class="p">,</span> <span class="s1">&#39;en_gb&#39;</span><span class="p">,</span> <span class="s1">&#39;en_ie&#39;</span><span class="p">,</span> <span class="s1">&#39;en_my&#39;</span><span class="p">,</span> <span class="s1">&#39;en_nz&#39;</span><span class="p">,</span> <span class="s1">&#39;en_us&#39;</span><span class="p">,</span> <span class="s1">&#39;es_ad&#39;</span><span class="p">,</span> <span class="s1">&#39;es_ar&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;es_cl&#39;</span><span class="p">,</span> <span class="s1">&#39;es_co&#39;</span><span class="p">,</span> <span class="s1">&#39;es_es&#39;</span><span class="p">,</span> <span class="s1">&#39;es_mx&#39;</span><span class="p">,</span> <span class="s1">&#39;es_pe&#39;</span><span class="p">,</span> <span class="s1">&#39;eu_es&#39;</span><span class="p">,</span> <span class="s1">&#39;eu_fr&#39;</span><span class="p">,</span> <span class="s1">&#39;fc_ca&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fr_ad&#39;</span><span class="p">,</span> <span class="s1">&#39;fr_be&#39;</span><span class="p">,</span> <span class="s1">&#39;fr_ca&#39;</span><span class="p">,</span> <span class="s1">&#39;fr_ch&#39;</span><span class="p">,</span> <span class="s1">&#39;fr_fr&#39;</span><span class="p">,</span> <span class="s1">&#39;it_ch&#39;</span><span class="p">,</span> <span class="s1">&#39;it_it&#39;</span><span class="p">,</span> <span class="s1">&#39;nl_be&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;nl_nl&#39;</span><span class="p">,</span> <span class="s1">&#39;pt_ad&#39;</span><span class="p">,</span> <span class="s1">&#39;pt_pt&#39;</span><span class="p">,</span>
+<span class="p">]</span>
+<span class="c1"># fmt: on</span>
+
+<span class="c1"># search-url</span>
+
+<span class="n">api_url</span> <span class="o">=</span> <span class="s1">&#39;https://api.qwant.com/v3/search/&#39;</span>
+<span class="sd">&quot;&quot;&quot;URL of Qwant&#39;s API (JSON)&quot;&quot;&quot;</span>
+
+<span class="n">web_lite_url</span> <span class="o">=</span> <span class="s1">&#39;https://lite.qwant.com/&#39;</span>
+<span class="sd">&quot;&quot;&quot;URL of Qwant-Lite (HTML)&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/qwant.html#searx.engines.qwant.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Qwant search request&quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">query</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">q_locale</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;searxng_locale&quot;</span><span class="p">],</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;en_US&#39;</span><span class="p">)</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">api_url</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">qwant_categ</span><span class="si">}</span><span class="s1">?&#39;</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">}</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
+
+ <span class="k">if</span> <span class="n">qwant_categ</span> <span class="o">==</span> <span class="s1">&#39;web-lite&#39;</span><span class="p">:</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">web_lite_url</span> <span class="o">+</span> <span class="s1">&#39;?&#39;</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;locale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">q_locale</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;l&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">q_locale</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;s&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;p&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
+
+ <span class="k">elif</span> <span class="n">qwant_categ</span> <span class="o">==</span> <span class="s1">&#39;images&#39;</span><span class="p">:</span>
+
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;locale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">q_locale</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">50</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
+
+ <span class="k">else</span><span class="p">:</span> <span class="c1"># web, news, videos</span>
+
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;locale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">q_locale</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">10</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">args</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">]</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+
+ <span class="k">if</span> <span class="n">qwant_categ</span> <span class="o">==</span> <span class="s1">&#39;web-lite&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">parse_web_lite</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">parse_web_api</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="parse_web_lite">
+<a class="viewcode-back" href="../../../dev/engines/online/qwant.html#searx.engines.qwant.parse_web_lite">[docs]</a>
+<span class="k">def</span> <span class="nf">parse_web_lite</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse results from Qwant-Lite&quot;&quot;&quot;</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//section/article&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s2">&quot;./span[contains(@class, &#39;tooltip&#39;)]&quot;</span><span class="p">):</span>
+ <span class="c1"># ignore randomly interspersed advertising adds</span>
+ <span class="k">continue</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s2">&quot;./span[contains(@class, &#39;url partner&#39;)]&quot;</span><span class="p">)),</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;./h2/a&#39;</span><span class="p">)),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;./p&#39;</span><span class="p">)),</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<div class="viewcode-block" id="parse_web_api">
+<a class="viewcode-back" href="../../../dev/engines/online/qwant.html#searx.engines.qwant.parse_web_api">[docs]</a>
+<span class="k">def</span> <span class="nf">parse_web_api</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse results from Qwant&#39;s API&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-locals, too-many-branches, too-many-statements</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># load JSON result</span>
+ <span class="n">search_results</span> <span class="o">=</span> <span class="n">loads</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">search_results</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;data&#39;</span><span class="p">,</span> <span class="p">{})</span>
+
+ <span class="c1"># check for an API error</span>
+ <span class="k">if</span> <span class="n">search_results</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;status&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="s1">&#39;success&#39;</span><span class="p">:</span>
+ <span class="n">error_code</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;error_code&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">error_code</span> <span class="o">==</span> <span class="mi">24</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SearxEngineTooManyRequestsException</span><span class="p">()</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;message&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;unknown&#39;</span><span class="p">]))</span>
+ <span class="k">raise</span> <span class="n">SearxEngineAPIException</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">msg</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">error_code</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
+
+ <span class="c1"># raise for other errors</span>
+ <span class="n">raise_for_httperror</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">qwant_categ</span> <span class="o">==</span> <span class="s1">&#39;web&#39;</span><span class="p">:</span>
+ <span class="c1"># The WEB query contains a list named &#39;mainline&#39;. This list can contain</span>
+ <span class="c1"># different result types (e.g. mainline[0][&#39;type&#39;] returns type of the</span>
+ <span class="c1"># result items in mainline[0][&#39;items&#39;]</span>
+ <span class="n">mainline</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;result&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;items&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;mainline&#39;</span><span class="p">,</span> <span class="p">{})</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># Queries on News, Images and Videos do not have a list named &#39;mainline&#39;</span>
+ <span class="c1"># in the response. The result items are directly in the list</span>
+ <span class="c1"># result[&#39;items&#39;].</span>
+ <span class="n">mainline</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;result&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;items&#39;</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="n">mainline</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="p">{</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="n">qwant_categ</span><span class="p">,</span> <span class="s1">&#39;items&#39;</span><span class="p">:</span> <span class="n">mainline</span><span class="p">},</span>
+ <span class="p">]</span>
+
+ <span class="c1"># return empty array if there are no results</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">mainline</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">mainline</span><span class="p">:</span>
+ <span class="n">mainline_type</span> <span class="o">=</span> <span class="n">row</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mainline_type</span> <span class="o">!=</span> <span class="n">qwant_categ</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="k">if</span> <span class="n">mainline_type</span> <span class="o">==</span> <span class="s1">&#39;ads&#39;</span><span class="p">:</span>
+ <span class="c1"># ignore adds</span>
+ <span class="k">continue</span>
+
+ <span class="n">mainline_items</span> <span class="o">=</span> <span class="n">row</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;items&#39;</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">mainline_items</span><span class="p">:</span>
+
+ <span class="n">title</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;title&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="n">res_url</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;url&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">mainline_type</span> <span class="o">==</span> <span class="s1">&#39;web&#39;</span><span class="p">:</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;desc&#39;</span><span class="p">]</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">res_url</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">elif</span> <span class="n">mainline_type</span> <span class="o">==</span> <span class="s1">&#39;news&#39;</span><span class="p">:</span>
+
+ <span class="n">pub_date</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;date&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">pub_date</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">pub_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">pub_date</span><span class="p">)</span>
+ <span class="n">news_media</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;media&#39;</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="n">news_media</span><span class="p">:</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">news_media</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pict&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;url&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">res_url</span><span class="p">,</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">pub_date</span><span class="p">,</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">img_src</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">elif</span> <span class="n">mainline_type</span> <span class="o">==</span> <span class="s1">&#39;images&#39;</span><span class="p">:</span>
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">]</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;media&#39;</span><span class="p">]</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">res_url</span><span class="p">,</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;images.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;thumbnail_src&#39;</span><span class="p">:</span> <span class="n">thumbnail</span><span class="p">,</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">img_src</span><span class="p">,</span>
+ <span class="s1">&#39;resolution&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">item</span><span class="p">[</span><span class="s1">&#39;width&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> x </span><span class="si">{</span><span class="n">item</span><span class="p">[</span><span class="s1">&#39;height&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="s1">&#39;img_format&#39;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;thumb_type&#39;</span><span class="p">),</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">elif</span> <span class="n">mainline_type</span> <span class="o">==</span> <span class="s1">&#39;videos&#39;</span><span class="p">:</span>
+ <span class="c1"># some videos do not have a description: while qwant-video</span>
+ <span class="c1"># returns an empty string, such video from a qwant-web query</span>
+ <span class="c1"># miss the &#39;desc&#39; key.</span>
+ <span class="n">d</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;desc&#39;</span><span class="p">),</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;source&#39;</span><span class="p">),</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;channel&#39;</span><span class="p">)</span>
+ <span class="n">content_parts</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="n">d</span><span class="p">:</span>
+ <span class="n">content_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">s</span><span class="p">:</span>
+ <span class="n">content_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2"> &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Source&quot;</span><span class="p">),</span> <span class="n">s</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">c</span><span class="p">:</span>
+ <span class="n">content_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2"> &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Channel&quot;</span><span class="p">),</span> <span class="n">c</span><span class="p">))</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="s1">&#39; // &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">content_parts</span><span class="p">)</span>
+ <span class="n">length</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;duration&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">length</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">milliseconds</span><span class="o">=</span><span class="n">length</span><span class="p">)</span>
+ <span class="n">pub_date</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;date&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">pub_date</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">pub_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">pub_date</span><span class="p">)</span>
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">]</span>
+ <span class="c1"># from some locations (DE and others?) the s2 link do</span>
+ <span class="c1"># response a &#39;Please wait ..&#39; but does not deliver the thumbnail</span>
+ <span class="n">thumbnail</span> <span class="o">=</span> <span class="n">thumbnail</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;https://s2.qwant.com&#39;</span><span class="p">,</span> <span class="s1">&#39;https://s1.qwant.com&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">res_url</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">pub_date</span><span class="p">,</span>
+ <span class="s1">&#39;thumbnail&#39;</span><span class="p">:</span> <span class="n">thumbnail</span><span class="p">,</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;videos.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;length&#39;</span><span class="p">:</span> <span class="n">length</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+ <span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">network</span>
+ <span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">region_tag</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">about</span><span class="p">[</span><span class="s1">&#39;website&#39;</span><span class="p">])</span>
+ <span class="n">text</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">text</span>
+ <span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">[</span><span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;INITIAL_PROPS&#39;</span><span class="p">)</span> <span class="p">:]</span>
+ <span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">[</span><span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;{&#39;</span><span class="p">)</span> <span class="p">:</span> <span class="n">text</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;&lt;/script&gt;&#39;</span><span class="p">)]</span>
+
+ <span class="n">q_initial_props</span> <span class="o">=</span> <span class="n">loads</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">q_locales</span> <span class="o">=</span> <span class="n">q_initial_props</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;locales&#39;</span><span class="p">)</span>
+ <span class="n">eng_tag_list</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+
+ <span class="k">for</span> <span class="n">country</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">q_locales</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">v</span><span class="p">[</span><span class="s1">&#39;langs&#39;</span><span class="p">]:</span>
+ <span class="n">_locale</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{lang}</span><span class="s2">_</span><span class="si">{country}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">lang</span><span class="o">=</span><span class="n">lang</span><span class="p">,</span> <span class="n">country</span><span class="o">=</span><span class="n">country</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">qwant_categ</span> <span class="o">==</span> <span class="s1">&#39;news&#39;</span> <span class="ow">and</span> <span class="n">_locale</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">qwant_news_locales</span><span class="p">:</span>
+ <span class="c1"># qwant-news does not support all locales from qwant-web:</span>
+ <span class="k">continue</span>
+
+ <span class="n">eng_tag_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">_locale</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">eng_tag</span> <span class="ow">in</span> <span class="n">eng_tag_list</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">region_tag</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">parse</span><span class="p">(</span><span class="n">eng_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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: can&#39;t determine babel locale of quant&#39;s locale </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">eng_tag</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/radio_browser.html b/_modules/searx/engines/radio_browser.html
new file mode 100644
index 000000000..83c21b704
--- /dev/null
+++ b/_modules/searx/engines/radio_browser.html
@@ -0,0 +1,290 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.radio_browser &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.radio_browser</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.radio_browser</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;Search radio stations from RadioBrowser by `Advanced station search API`_.</span>
+
+<span class="sd">.. _Advanced station search API:</span>
+<span class="sd"> https://de1.api.radio-browser.info/#Advanced_station_search</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+<span class="kn">from</span> <span class="nn">flask_babel</span> <span class="kn">import</span> <span class="n">gettext</span>
+
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.radio-browser.info/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q111664849&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://de1.api.radio-browser.info/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;music&#39;</span><span class="p">,</span> <span class="s1">&#39;radio&#39;</span><span class="p">]</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;https://de1.api.radio-browser.info&quot;</span> <span class="c1"># see https://api.radio-browser.info/ for all nodes</span>
+<span class="n">number_of_results</span> <span class="o">=</span> <span class="mi">10</span>
+
+<span class="n">station_filters</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># [&#39;countrycode&#39;, &#39;language&#39;]</span>
+<span class="sd">&quot;&quot;&quot;A list of filters to be applied to the search of radio stations. By default</span>
+<span class="sd">none filters are applied. Valid filters are:</span>
+
+<span class="sd">``language``</span>
+<span class="sd"> Filter stations by selected language. For instance the ``de`` from ``:de-AU``</span>
+<span class="sd"> will be translated to `german` and used in the argument ``language=``.</span>
+
+<span class="sd">``countrycode``</span>
+<span class="sd"> Filter stations by selected country. The 2-digit countrycode of the station</span>
+<span class="sd"> comes from the region the user selected. For instance ``:de-AU`` will filter</span>
+<span class="sd"> out all stations not in ``AU``.</span>
+
+<span class="sd">.. note::</span>
+
+<span class="sd"> RadioBrowser has registered a lot of languages and countrycodes unknown to</span>
+<span class="sd"> :py:obj:`babel` and note that when searching for radio stations, users are</span>
+<span class="sd"> more likely to search by name than by region or language.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;order&#39;</span><span class="p">:</span> <span class="s1">&#39;votes&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;offset&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">number_of_results</span><span class="p">,</span>
+ <span class="s1">&#39;limit&#39;</span><span class="p">:</span> <span class="n">number_of_results</span><span class="p">,</span>
+ <span class="s1">&#39;hidebroken&#39;</span><span class="p">:</span> <span class="s1">&#39;true&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;reverse&#39;</span><span class="p">:</span> <span class="s1">&#39;true&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="s1">&#39;language&#39;</span> <span class="ow">in</span> <span class="n">station_filters</span><span class="p">:</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">])</span> <span class="c1"># type: ignore</span>
+ <span class="k">if</span> <span class="n">lang</span><span class="p">:</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">lang</span>
+
+ <span class="k">if</span> <span class="s1">&#39;countrycode&#39;</span> <span class="ow">in</span> <span class="n">station_filters</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">countrycode</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">countrycode</span> <span class="ow">in</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;countrycodes&#39;</span><span class="p">]:</span> <span class="c1"># type: ignore</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;countrycode&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">countrycode</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/json/stations/search?</span><span class="si">{</span><span class="n">urlencode</span><span class="p">(</span><span class="n">args</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">json_resp</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="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">json_resp</span><span class="p">:</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;homepage&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">url</span><span class="p">:</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;url_resolved&#39;</span><span class="p">]</span>
+
+ <span class="n">content</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">tags</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tags&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
+ <span class="n">content</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tags</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;state&#39;</span><span class="p">,</span> <span class="s1">&#39;country&#39;</span><span class="p">]:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="n">content</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+
+ <span class="n">metadata</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">codec</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;codec&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">codec</span> <span class="ow">and</span> <span class="n">codec</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;unknown&#39;</span><span class="p">:</span>
+ <span class="n">metadata</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">codec</span><span class="si">}</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="n">gettext</span><span class="p">(</span><span class="s1">&#39;radio&#39;</span><span class="p">))</span>
+ <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="p">(</span><span class="n">gettext</span><span class="p">(</span><span class="s1">&#39;bitrate&#39;</span><span class="p">),</span> <span class="s1">&#39;bitrate&#39;</span><span class="p">),</span>
+ <span class="p">(</span><span class="n">gettext</span><span class="p">(</span><span class="s1">&#39;votes&#39;</span><span class="p">),</span> <span class="s1">&#39;votes&#39;</span><span class="p">),</span>
+ <span class="p">(</span><span class="n">gettext</span><span class="p">(</span><span class="s1">&#39;clicks&#39;</span><span class="p">),</span> <span class="s1">&#39;clickcount&#39;</span><span class="p">),</span>
+ <span class="p">]:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="n">metadata</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;favicon&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;http://&quot;</span><span class="p">,</span> <span class="s2">&quot;https://&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="s1">&#39; | &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">content</span><span class="p">),</span>
+ <span class="s1">&#39;metadata&#39;</span><span class="p">:</span> <span class="s1">&#39; | &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">metadata</span><span class="p">),</span>
+ <span class="s1">&#39;iframe_src&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;url_resolved&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;http://&quot;</span><span class="p">,</span> <span class="s2">&quot;https://&quot;</span><span class="p">),</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/radio_browser.html#searx.engines.radio_browser.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages and countrycodes from RadioBrowser</span>
+
+<span class="sd"> - ``traits.languages``: `list of languages API`_</span>
+<span class="sd"> - ``traits.custom[&#39;countrycodes&#39;]``: `list of countries API`_</span>
+
+<span class="sd"> .. _list of countries API: https://de1.api.radio-browser.info/#List_of_countries</span>
+<span class="sd"> .. _list of languages API: https://de1.api.radio-browser.info/#List_of_languages</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+
+ <span class="kn">from</span> <span class="nn">babel.core</span> <span class="kn">import</span> <span class="n">get_global</span>
+
+ <span class="n">babel_reg_list</span> <span class="o">=</span> <span class="n">get_global</span><span class="p">(</span><span class="s2">&quot;territory_languages&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
+
+ <span class="n">language_list</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s1">/json/languages&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="c1"># type: ignore</span>
+ <span class="n">country_list</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s1">/json/countries&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="c1"># type: ignore</span>
+
+ <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">language_list</span><span class="p">:</span>
+
+ <span class="n">babel_lang</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;iso_639&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">babel_lang</span><span class="p">:</span>
+ <span class="c1"># the language doesn&#39;t have any iso code, and hence can&#39;t be parsed</span>
+ <span class="c1"># print(f&quot;ERROR: lang - no iso code in {lang}&quot;)</span>
+ <span class="k">continue</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">babel_lang</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot;-&quot;</span><span class="p">))</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="c1"># print(f&quot;ERROR: language tag {babel_lang} is unknown by babel&quot;)</span>
+ <span class="k">continue</span>
+
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">lang</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span>
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+
+ <span class="n">countrycodes</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">region</span> <span class="ow">in</span> <span class="n">country_list</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">region</span><span class="p">[</span><span class="s1">&#39;iso_3166_1&#39;</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">babel_reg_list</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;ERROR: region tag </span><span class="si">{</span><span class="n">region</span><span class="p">[</span><span class="s1">&#39;iso_3166_1&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> is unknown by babel&quot;</span><span class="p">)</span>
+ <span class="k">continue</span>
+ <span class="n">countrycodes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">region</span><span class="p">[</span><span class="s1">&#39;iso_3166_1&#39;</span><span class="p">])</span>
+
+ <span class="n">countrycodes</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">countrycodes</span><span class="p">)</span>
+ <span class="n">countrycodes</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;countrycodes&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">countrycodes</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/sepiasearch.html b/_modules/searx/engines/sepiasearch.html
new file mode 100644
index 000000000..5d4c07c36
--- /dev/null
+++ b/_modules/searx/engines/sepiasearch.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.sepiasearch &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.sepiasearch</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.sepiasearch</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;SepiaSearch uses the same languages as :py:obj:`Peertube</span>
+<span class="sd">&lt;searx.engines.peertube&gt;` and the response is identical to the response from the</span>
+<span class="sd">peertube engines.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+
+<span class="kn">from</span> <span class="nn">searx.engines.peertube</span> <span class="kn">import</span> <span class="n">fetch_traits</span> <span class="c1"># pylint: disable=unused-import</span>
+<span class="kn">from</span> <span class="nn">searx.engines.peertube</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="c1"># pylint: disable=unused-import</span>
+ <span class="n">video_response</span><span class="p">,</span>
+ <span class="n">safesearch_table</span><span class="p">,</span>
+ <span class="n">time_range_table</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="c1"># pylint: disable=line-too-long</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://sepiasearch.org&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://docs.joinpeertube.org/api-rest-reference.html#tag/Search/operation/searchVideos&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;videos&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://sepiasearch.org&#39;</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/peertube.html#searx.engines.sepiasearch.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble request for the SepiaSearch API&quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">query</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="c1"># eng_region = traits.get_region(params[&#39;searxng_locale&#39;], &#39;en_US&#39;)</span>
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">base_url</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
+ <span class="o">+</span> <span class="s2">&quot;/api/v1/search/videos?&quot;</span>
+ <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;search&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;start&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span>
+ <span class="s1">&#39;count&#39;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
+ <span class="c1"># -createdAt: sort by date ascending / createdAt: date descending</span>
+ <span class="s1">&#39;sort&#39;</span><span class="p">:</span> <span class="s1">&#39;-match&#39;</span><span class="p">,</span> <span class="c1"># sort by *match descending*</span>
+ <span class="s1">&#39;nsfw&#39;</span><span class="p">:</span> <span class="n">safesearch_table</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">eng_lang</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39;&amp;languageOneOf[]=&#39;</span> <span class="o">+</span> <span class="n">eng_lang</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39;&amp;boostLanguages[]=&#39;</span> <span class="o">+</span> <span class="n">eng_lang</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">time_range_table</span><span class="p">:</span>
+ <span class="n">time</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">date</span><span class="p">()</span> <span class="o">+</span> <span class="n">time_range_table</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]]</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39;&amp;startDate=&#39;</span> <span class="o">+</span> <span class="n">time</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">video_response</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/sqlite.html b/_modules/searx/engines/sqlite.html
new file mode 100644
index 000000000..6e5a7d03f
--- /dev/null
+++ b/_modules/searx/engines/sqlite.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.sqlite &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.sqlite</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.sqlite</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;SQLite is a small, fast and reliable SQL database engine. It does not require</span>
+<span class="sd">any extra dependency.</span>
+
+<span class="sd">Example</span>
+<span class="sd">=======</span>
+
+<span class="sd">.. _MediathekView: https://mediathekview.de/</span>
+
+<span class="sd">To demonstrate the power of database engines, here is a more complex example</span>
+<span class="sd">which reads from a MediathekView_ (DE) movie database. For this example of the</span>
+<span class="sd">SQLite engine download the database:</span>
+
+<span class="sd">- https://liste.mediathekview.de/filmliste-v2.db.bz2</span>
+
+<span class="sd">and unpack into ``searx/data/filmliste-v2.db``. To search the database use e.g</span>
+<span class="sd">Query to test: ``!mediathekview concert``</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: mediathekview</span>
+<span class="sd"> engine: sqlite</span>
+<span class="sd"> disabled: False</span>
+<span class="sd"> categories: general</span>
+<span class="sd"> result_template: default.html</span>
+<span class="sd"> database: searx/data/filmliste-v2.db</span>
+<span class="sd"> query_str: &gt;-</span>
+<span class="sd"> SELECT title || &#39; (&#39; || time(duration, &#39;unixepoch&#39;) || &#39;)&#39; AS title,</span>
+<span class="sd"> COALESCE( NULLIF(url_video_hd,&#39;&#39;), NULLIF(url_video_sd,&#39;&#39;), url_video) AS url,</span>
+<span class="sd"> description AS content</span>
+<span class="sd"> FROM film</span>
+<span class="sd"> WHERE title LIKE :wildcard OR description LIKE :wildcard</span>
+<span class="sd"> ORDER BY duration DESC</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">sqlite3</span>
+<span class="kn">import</span> <span class="nn">contextlib</span>
+
+<span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;offline&#39;</span>
+<span class="n">database</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+<span class="n">query_str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+<span class="n">limit</span> <span class="o">=</span> <span class="mi">10</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">result_template</span> <span class="o">=</span> <span class="s1">&#39;key-value.html&#39;</span>
+
+
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="p">):</span>
+ <span class="k">if</span> <span class="s1">&#39;query_str&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine_settings</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;query_str cannot be empty&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">engine_settings</span><span class="p">[</span><span class="s1">&#39;query_str&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;select &#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;only SELECT query is supported&#39;</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="sqlite_cursor">
+<a class="viewcode-back" href="../../../dev/engines/offline/sql-engines.html#searx.engines.sqlite.sqlite_cursor">[docs]</a>
+<span class="nd">@contextlib</span><span class="o">.</span><span class="n">contextmanager</span>
+<span class="k">def</span> <span class="nf">sqlite_cursor</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Implements a :py:obj:`Context Manager &lt;contextlib.contextmanager&gt;` for a</span>
+<span class="sd"> :py:obj:`sqlite3.Cursor`.</span>
+
+<span class="sd"> Open database in read only mode: if the database doesn&#39;t exist. The default</span>
+<span class="sd"> mode creates an empty file on the file system. See:</span>
+
+<span class="sd"> * https://docs.python.org/3/library/sqlite3.html#sqlite3.connect</span>
+<span class="sd"> * https://www.sqlite.org/uri.html</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">uri</span> <span class="o">=</span> <span class="s1">&#39;file:&#39;</span> <span class="o">+</span> <span class="n">database</span> <span class="o">+</span> <span class="s1">&#39;?mode=ro&#39;</span>
+ <span class="k">with</span> <span class="n">contextlib</span><span class="o">.</span><span class="n">closing</span><span class="p">(</span><span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">uri</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span> <span class="k">as</span> <span class="n">connect</span><span class="p">:</span>
+ <span class="n">connect</span><span class="o">.</span><span class="n">row_factory</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">Row</span>
+ <span class="k">with</span> <span class="n">contextlib</span><span class="o">.</span><span class="n">closing</span><span class="p">(</span><span class="n">connect</span><span class="o">.</span><span class="n">cursor</span><span class="p">())</span> <span class="k">as</span> <span class="n">cursor</span><span class="p">:</span>
+ <span class="k">yield</span> <span class="n">cursor</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;wildcard&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;%&#39;</span> <span class="o">+</span> <span class="n">query</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;%&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="sa">r</span><span class="s1">&#39;%&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;limit&#39;</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span>
+ <span class="s1">&#39;offset&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">limit</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="n">query_to_run</span> <span class="o">=</span> <span class="n">query_str</span> <span class="o">+</span> <span class="s1">&#39; LIMIT :limit OFFSET :offset&#39;</span>
+
+ <span class="k">with</span> <span class="n">sqlite_cursor</span><span class="p">()</span> <span class="k">as</span> <span class="n">cur</span><span class="p">:</span>
+
+ <span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">query_to_run</span><span class="p">,</span> <span class="n">query_params</span><span class="p">)</span>
+ <span class="n">col_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">cn</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">cn</span> <span class="ow">in</span> <span class="n">cur</span><span class="o">.</span><span class="n">description</span><span class="p">]</span>
+
+ <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">():</span>
+ <span class="n">item</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">col_names</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">row</span><span class="p">)))</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;template&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">result_template</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;append result --&gt; </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/startpage.html b/_modules/searx/engines/startpage.html
new file mode 100644
index 000000000..91d0a0351
--- /dev/null
+++ b/_modules/searx/engines/startpage.html
@@ -0,0 +1,611 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.startpage &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.startpage</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.startpage</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;Startpage&#39;s language &amp; region selectors are a mess ..</span>
+
+<span class="sd">.. _startpage regions:</span>
+
+<span class="sd">Startpage regions</span>
+<span class="sd">=================</span>
+
+<span class="sd">In the list of regions there are tags we need to map to common region tags::</span>
+
+<span class="sd"> pt-BR_BR --&gt; pt_BR</span>
+<span class="sd"> zh-CN_CN --&gt; zh_Hans_CN</span>
+<span class="sd"> zh-TW_TW --&gt; zh_Hant_TW</span>
+<span class="sd"> zh-TW_HK --&gt; zh_Hant_HK</span>
+<span class="sd"> en-GB_GB --&gt; en_GB</span>
+
+<span class="sd">and there is at least one tag with a three letter language tag (ISO 639-2)::</span>
+
+<span class="sd"> fil_PH --&gt; fil_PH</span>
+
+<span class="sd">The locale code ``no_NO`` from Startpage does not exists and is mapped to</span>
+<span class="sd">``nb-NO``::</span>
+
+<span class="sd"> babel.core.UnknownLocaleError: unknown locale &#39;no_NO&#39;</span>
+
+<span class="sd">For reference see languages-subtag at iana; ``no`` is the macrolanguage [1]_ and</span>
+<span class="sd">W3C recommends subtag over macrolanguage [2]_.</span>
+
+<span class="sd">.. [1] `iana: language-subtag-registry</span>
+<span class="sd"> &lt;https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry&gt;`_ ::</span>
+
+<span class="sd"> type: language</span>
+<span class="sd"> Subtag: nb</span>
+<span class="sd"> Description: Norwegian Bokmål</span>
+<span class="sd"> Added: 2005-10-16</span>
+<span class="sd"> Suppress-Script: Latn</span>
+<span class="sd"> Macrolanguage: no</span>
+
+<span class="sd">.. [2]</span>
+<span class="sd"> Use macrolanguages with care. Some language subtags have a Scope field set to</span>
+<span class="sd"> macrolanguage, i.e. this primary language subtag encompasses a number of more</span>
+<span class="sd"> specific primary language subtags in the registry. ... As we recommended for</span>
+<span class="sd"> the collection subtags mentioned above, in most cases you should try to use</span>
+<span class="sd"> the more specific subtags ... `W3: The primary language subtag</span>
+<span class="sd"> &lt;https://www.w3.org/International/questions/qa-choosing-language-tags#langsubtag&gt;`_</span>
+
+<span class="sd">.. _startpage languages:</span>
+
+<span class="sd">Startpage languages</span>
+<span class="sd">===================</span>
+
+<span class="sd">:py:obj:`send_accept_language_header`:</span>
+<span class="sd"> The displayed name in Startpage&#39;s settings page depend on the location of the</span>
+<span class="sd"> IP when ``Accept-Language`` HTTP header is unset. In :py:obj:`fetch_traits`</span>
+<span class="sd"> we use::</span>
+
+<span class="sd"> &#39;Accept-Language&#39;: &quot;en-US,en;q=0.5&quot;,</span>
+<span class="sd"> ..</span>
+
+<span class="sd"> to get uniform names independent from the IP).</span>
+
+<span class="sd">.. _startpage categories:</span>
+
+<span class="sd">Startpage categories</span>
+<span class="sd">====================</span>
+
+<span class="sd">Startpage&#39;s category (for Web-search, News, Videos, ..) is set by</span>
+<span class="sd">:py:obj:`startpage_categ` in settings.yml::</span>
+
+<span class="sd"> - name: startpage</span>
+<span class="sd"> engine: startpage</span>
+<span class="sd"> startpage_categ: web</span>
+<span class="sd"> ...</span>
+
+<span class="sd">.. hint::</span>
+
+<span class="sd"> The default category is ``web`` .. and other categories than ``web`` are not</span>
+<span class="sd"> yet implemented.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span>
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">from</span> <span class="nn">unicodedata</span> <span class="kn">import</span> <span class="n">normalize</span><span class="p">,</span> <span class="n">combining</span>
+<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
+
+<span class="kn">import</span> <span class="nn">dateutil.parser</span>
+<span class="kn">import</span> <span class="nn">lxml.html</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">gen_useragent</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineCaptchaException</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">region_tag</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://startpage.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q2333295&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">startpage_categ</span> <span class="o">=</span> <span class="s1">&#39;web&#39;</span>
+<span class="sd">&quot;&quot;&quot;Startpage&#39;s category, visit :ref:`startpage categories`.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="sd">&quot;&quot;&quot;Startpage tries to guess user&#39;s language and territory from the HTTP</span>
+<span class="sd">``Accept-Language``. Optional the user can select a search-language (can be</span>
+<span class="sd">different to the UI language) and a region filter.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">max_page</span> <span class="o">=</span> <span class="mi">18</span>
+<span class="sd">&quot;&quot;&quot;Tested 18 pages maximum (argument ``page``), to be save max is set to 20.&quot;&quot;&quot;</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">time_range_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="s1">&#39;m&#39;</span><span class="p">,</span> <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="s1">&#39;y&#39;</span><span class="p">}</span>
+<span class="n">safesearch_dict</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">}</span>
+
+<span class="c1"># search-url</span>
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://www.startpage.com&#39;</span>
+<span class="n">search_url</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;/sp/search&#39;</span>
+
+<span class="c1"># specific xpath variables</span>
+<span class="c1"># ads xpath //div[@id=&quot;results&quot;]/div[@id=&quot;sponsored&quot;]//div[@class=&quot;result&quot;]</span>
+<span class="c1"># not ads: div[@class=&quot;result&quot;] are the direct childs of div[@id=&quot;results&quot;]</span>
+<span class="n">search_form_xpath</span> <span class="o">=</span> <span class="s1">&#39;//form[@id=&quot;search&quot;]&#39;</span>
+<span class="sd">&quot;&quot;&quot;XPath of Startpage&#39;s origin search form</span>
+
+<span class="sd">.. code: html</span>
+
+<span class="sd"> &lt;form action=&quot;/sp/search&quot; method=&quot;post&quot;&gt;</span>
+<span class="sd"> &lt;input type=&quot;text&quot; name=&quot;query&quot; value=&quot;&quot; ..&gt;</span>
+<span class="sd"> &lt;input type=&quot;hidden&quot; name=&quot;t&quot; value=&quot;device&quot;&gt;</span>
+<span class="sd"> &lt;input type=&quot;hidden&quot; name=&quot;lui&quot; value=&quot;english&quot;&gt;</span>
+<span class="sd"> &lt;input type=&quot;hidden&quot; name=&quot;sc&quot; value=&quot;Q7Mt5TRqowKB00&quot;&gt;</span>
+<span class="sd"> &lt;input type=&quot;hidden&quot; name=&quot;cat&quot; value=&quot;web&quot;&gt;</span>
+<span class="sd"> &lt;input type=&quot;hidden&quot; class=&quot;abp&quot; id=&quot;abp-input&quot; name=&quot;abp&quot; value=&quot;1&quot;&gt;</span>
+<span class="sd"> &lt;/form&gt;</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="c1"># timestamp of the last fetch of &#39;sc&#39; code</span>
+<span class="n">sc_code_ts</span> <span class="o">=</span> <span class="mi">0</span>
+<span class="n">sc_code</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="n">sc_code_cache_sec</span> <span class="o">=</span> <span class="mi">30</span>
+<span class="sd">&quot;&quot;&quot;Time in seconds the sc-code is cached in memory :py:obj:`get_sc_code`.&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="get_sc_code">
+<a class="viewcode-back" href="../../../dev/engines/online/startpage.html#searx.engines.startpage.get_sc_code">[docs]</a>
+<span class="k">def</span> <span class="nf">get_sc_code</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get an actual ``sc`` argument from Startpage&#39;s search form (HTML page).</span>
+
+<span class="sd"> Startpage puts a ``sc`` argument on every HTML :py:obj:`search form</span>
+<span class="sd"> &lt;search_form_xpath&gt;`. Without this argument Startpage considers the request</span>
+<span class="sd"> is from a bot. We do not know what is encoded in the value of the ``sc``</span>
+<span class="sd"> argument, but it seems to be a kind of a *time-stamp*.</span>
+
+<span class="sd"> Startpage&#39;s search form generates a new sc-code on each request. This</span>
+<span class="sd"> function scrap a new sc-code from Startpage&#39;s home page every</span>
+<span class="sd"> :py:obj:`sc_code_cache_sec` seconds.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">global</span> <span class="n">sc_code_ts</span><span class="p">,</span> <span class="n">sc_code</span> <span class="c1"># pylint: disable=global-statement</span>
+
+ <span class="k">if</span> <span class="n">sc_code</span> <span class="ow">and</span> <span class="p">(</span><span class="n">time</span><span class="p">()</span> <span class="o">&lt;</span> <span class="p">(</span><span class="n">sc_code_ts</span> <span class="o">+</span> <span class="n">sc_code_cache_sec</span><span class="p">)):</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;get_sc_code: reuse &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span><span class="p">,</span> <span class="n">sc_code</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">sc_code</span>
+
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]}</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Origin&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Referer&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span>
+ <span class="c1"># headers[&#39;Connection&#39;] = &#39;keep-alive&#39;</span>
+ <span class="c1"># headers[&#39;Accept-Encoding&#39;] = &#39;gzip, deflate, br&#39;</span>
+ <span class="c1"># headers[&#39;Accept&#39;] = &#39;text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8&#39;</span>
+ <span class="c1"># headers[&#39;User-Agent&#39;] = &#39;Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:105.0) Gecko/20100101 Firefox/105.0&#39;</span>
+
+ <span class="c1"># add Accept-Language header</span>
+ <span class="k">if</span> <span class="n">searxng_locale</span> <span class="o">==</span> <span class="s1">&#39;all&#39;</span><span class="p">:</span>
+ <span class="n">searxng_locale</span> <span class="o">=</span> <span class="s1">&#39;en-US&#39;</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">searxng_locale</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">send_accept_language_header</span><span class="p">:</span>
+ <span class="n">ac_lang</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">language</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">:</span>
+ <span class="n">ac_lang</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">,</span><span class="si">%s</span><span class="s2">;q=0.9,*;q=0.5&quot;</span> <span class="o">%</span> <span class="p">(</span>
+ <span class="n">locale</span><span class="o">.</span><span class="n">language</span><span class="p">,</span>
+ <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">,</span>
+ <span class="n">locale</span><span class="o">.</span><span class="n">language</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ac_lang</span>
+
+ <span class="n">get_sc_url</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;/?sc=</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sc_code</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;query new sc time-stamp ... </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">get_sc_url</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;headers: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">get_sc_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
+
+ <span class="c1"># ?? x = network.get(&#39;https://www.startpage.com/sp/cdn/images/filter-chevron.svg&#39;, headers=headers)</span>
+ <span class="c1"># ?? https://www.startpage.com/sp/cdn/images/filter-chevron.svg</span>
+ <span class="c1"># ?? ping-back URL: https://www.startpage.com/sp/pb?sc=TLsB0oITjZ8F21</span>
+
+ <span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://www.startpage.com/sp/captcha&#39;</span><span class="p">):</span> <span class="c1"># type: ignore</span>
+ <span class="k">raise</span> <span class="n">SearxEngineCaptchaException</span><span class="p">(</span>
+ <span class="n">message</span><span class="o">=</span><span class="s2">&quot;get_sc_code: got redirected to https://www.startpage.com/sp/captcha&quot;</span><span class="p">,</span>
+ <span class="p">)</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sc_code</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">search_form_xpath</span> <span class="o">+</span> <span class="s1">&#39;//input[@name=&quot;sc&quot;]/@value&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">IndexError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;suspend startpage API --&gt; https://github.com/searxng/searxng/pull/695&quot;</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">SearxEngineCaptchaException</span><span class="p">(</span>
+ <span class="n">message</span><span class="o">=</span><span class="s2">&quot;get_sc_code: [PR-695] query new sc time-stamp failed! (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">resp</span><span class="o">.</span><span class="n">url</span><span class="p">,</span> <span class="c1"># type: ignore</span>
+ <span class="p">)</span> <span class="kn">from</span> <span class="nn">exc</span>
+
+ <span class="n">sc_code_ts</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;get_sc_code: new value is: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">sc_code</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">sc_code</span></div>
+
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/startpage.html#searx.engines.startpage.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble a Startpage request.</span>
+
+<span class="sd"> To avoid CAPTCHA we need to send a well formed HTTP POST request with a</span>
+<span class="sd"> cookie. We need to form a request that is identical to the request build by</span>
+<span class="sd"> Startpage&#39;s search form:</span>
+
+<span class="sd"> - in the cookie the **region** is selected</span>
+<span class="sd"> - in the HTTP POST data the **language** is selected</span>
+
+<span class="sd"> Additionally the arguments form Startpage&#39;s search form needs to be set in</span>
+<span class="sd"> HTML POST data / compare ``&lt;input&gt;`` elements: :py:obj:`search_form_xpath`.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">startpage_categ</span> <span class="o">==</span> <span class="s1">&#39;web&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">_request_cat_web</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Startpages&#39;s category &#39;%&#39; is not yet implemented.&quot;</span><span class="p">,</span> <span class="n">startpage_categ</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">_request_cat_web</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+
+ <span class="n">engine_region</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en-US&#39;</span><span class="p">)</span>
+ <span class="n">engine_language</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span>
+
+ <span class="c1"># build arguments</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;cat&#39;</span><span class="p">:</span> <span class="s1">&#39;web&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;t&#39;</span><span class="p">:</span> <span class="s1">&#39;device&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;sc&#39;</span><span class="p">:</span> <span class="n">get_sc_code</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">params</span><span class="p">),</span> <span class="c1"># hint: this func needs HTTP headers,</span>
+ <span class="s1">&#39;with_date&#39;</span><span class="p">:</span> <span class="n">time_range_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">],</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="n">engine_language</span><span class="p">:</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_language</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;lui&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_language</span>
+
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;abp&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">args</span><span class="p">[</span><span class="s1">&#39;page&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span>
+
+ <span class="c1"># build cookie</span>
+ <span class="n">lang_homepage</span> <span class="o">=</span> <span class="s1">&#39;en&#39;</span>
+ <span class="n">cookie</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;date_time&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;world&#39;</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;disable_family_filter&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">safesearch_dict</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]]</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;disable_open_in_new_window&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;0&#39;</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;enable_post_method&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span> <span class="c1"># hint: POST</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;enable_proxy_safety_suggest&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;enable_stay_control&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;instant_answers&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;lang_homepage&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;s/device/</span><span class="si">%s</span><span class="s1">/&#39;</span> <span class="o">%</span> <span class="n">lang_homepage</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;num_of_results&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;10&#39;</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;suggestions&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;wt_unit&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;celsius&#39;</span>
+
+ <span class="k">if</span> <span class="n">engine_language</span><span class="p">:</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_language</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;language_ui&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_language</span>
+
+ <span class="k">if</span> <span class="n">engine_region</span><span class="p">:</span>
+ <span class="n">cookie</span><span class="p">[</span><span class="s1">&#39;search_results_region&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_region</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;preferences&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;N1N&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">EEE</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">cookie</span><span class="o">.</span><span class="n">items</span><span class="p">()])</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;cookie preferences: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;preferences&#39;</span><span class="p">])</span>
+
+ <span class="c1"># POST request</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;data: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">args</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;method&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;POST&#39;</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_url</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;Origin&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;Referer&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span>
+ <span class="c1"># is the Accept header needed?</span>
+ <span class="c1"># params[&#39;headers&#39;][&#39;Accept&#39;] = &#39;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8&#39;</span>
+
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="c1"># get response from search-request</span>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">startpage_categ</span> <span class="o">==</span> <span class="s1">&#39;web&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">_response_cat_web</span><span class="p">(</span><span class="n">dom</span><span class="p">)</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Startpages&#39;s category &#39;%&#39; is not yet implemented.&quot;</span><span class="p">,</span> <span class="n">startpage_categ</span><span class="p">)</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+
+<span class="k">def</span> <span class="nf">_response_cat_web</span><span class="p">(</span><span class="n">dom</span><span class="p">):</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># parse results</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[@class=&quot;w-gl&quot;]/div[contains(@class, &quot;result&quot;)]&#39;</span><span class="p">):</span>
+ <span class="n">links</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//a[contains(@class, &quot;result-title result-link&quot;)]&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">links</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">link</span> <span class="o">=</span> <span class="n">links</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">link</span><span class="o">.</span><span class="n">attrib</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;href&#39;</span><span class="p">)</span>
+
+ <span class="c1"># block google-ad url&#39;s</span>
+ <span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^http(s|)://(www\.)?google\.[a-z]+/aclk.*$&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
+ <span class="k">continue</span>
+
+ <span class="c1"># block startpage search url&#39;s</span>
+ <span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^http(s|)://(www\.)?startpage\.com/do/search\?.*$&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
+ <span class="k">continue</span>
+
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">link</span><span class="p">,</span> <span class="s1">&#39;h2&#39;</span><span class="p">))</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//p[contains(@class, &quot;description&quot;)]&#39;</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">allow_none</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span>
+
+ <span class="n">published_date</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="c1"># check if search result starts with something like: &quot;2 Sep 2014 ... &quot;</span>
+ <span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^([1-9]|[1-2][0-9]|3[0-1]) [A-Z][a-z]</span><span class="si">{2}</span><span class="s2"> [0-9]</span><span class="si">{4}</span><span class="s2"> \.\.\. &quot;</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
+ <span class="n">date_pos</span> <span class="o">=</span> <span class="n">content</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;...&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">4</span>
+ <span class="n">date_string</span> <span class="o">=</span> <span class="n">content</span><span class="p">[</span><span class="mi">0</span> <span class="p">:</span> <span class="n">date_pos</span> <span class="o">-</span> <span class="mi">5</span><span class="p">]</span>
+ <span class="c1"># fix content string</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">content</span><span class="p">[</span><span class="n">date_pos</span><span class="p">:]</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">published_date</span> <span class="o">=</span> <span class="n">dateutil</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">date_string</span><span class="p">,</span> <span class="n">dayfirst</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+ <span class="c1"># check if search result starts with something like: &quot;5 days ago ... &quot;</span>
+ <span class="k">elif</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;^[0-9]+ days? ago \.\.\. &quot;</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
+ <span class="n">date_pos</span> <span class="o">=</span> <span class="n">content</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;...&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">4</span>
+ <span class="n">date_string</span> <span class="o">=</span> <span class="n">content</span><span class="p">[</span><span class="mi">0</span> <span class="p">:</span> <span class="n">date_pos</span> <span class="o">-</span> <span class="mi">5</span><span class="p">]</span>
+
+ <span class="c1"># calculate datetime</span>
+ <span class="n">published_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;\d+&#39;</span><span class="p">,</span> <span class="n">date_string</span><span class="p">)</span><span class="o">.</span><span class="n">group</span><span class="p">()))</span> <span class="c1"># type: ignore</span>
+
+ <span class="c1"># fix content string</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">content</span><span class="p">[</span><span class="n">date_pos</span><span class="p">:]</span>
+
+ <span class="k">if</span> <span class="n">published_date</span><span class="p">:</span>
+ <span class="c1"># append result</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span> <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">published_date</span><span class="p">})</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># append result</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">})</span>
+
+ <span class="c1"># return results</span>
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/startpage.html#searx.engines.startpage.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch :ref:`languages &lt;startpage languages&gt;` and :ref:`regions &lt;startpage</span>
+<span class="sd"> regions&gt;` from Startpage.&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-branches</span>
+
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="n">gen_useragent</span><span class="p">(),</span>
+ <span class="s1">&#39;Accept-Language&#39;</span><span class="p">:</span> <span class="s2">&quot;en-US,en;q=0.5&quot;</span><span class="p">,</span> <span class="c1"># bing needs to set the English language</span>
+ <span class="p">}</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://www.startpage.com/do/settings&#39;</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from Startpage is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">lxml</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="c1"># regions</span>
+
+ <span class="n">sp_region_names</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//form[@name=&quot;settings&quot;]//select[@name=&quot;search_results_region&quot;]/option&#39;</span><span class="p">):</span>
+ <span class="n">sp_region_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">option</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">))</span>
+
+ <span class="k">for</span> <span class="n">eng_tag</span> <span class="ow">in</span> <span class="n">sp_region_names</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">eng_tag</span> <span class="o">==</span> <span class="s1">&#39;all&#39;</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">babel_region_tag</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;no_NO&#39;</span><span class="p">:</span> <span class="s1">&#39;nb_NO&#39;</span><span class="p">}</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">)</span> <span class="c1"># norway</span>
+
+ <span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">in</span> <span class="n">babel_region_tag</span><span class="p">:</span>
+ <span class="n">l</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">babel_region_tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
+ <span class="n">r</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">region_tag</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">parse</span><span class="p">(</span><span class="n">l</span> <span class="o">+</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="n">r</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">else</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">region_tag</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">parse</span><span class="p">(</span><span class="n">babel_region_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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: can&#39;t determine babel locale of startpage&#39;s locale </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">eng_tag</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+
+ <span class="c1"># languages</span>
+
+ <span class="n">catalog_engine2code</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> <span class="n">lang_code</span> <span class="k">for</span> <span class="n">lang_code</span><span class="p">,</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="p">(</span><span class="s1">&#39;en&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
+
+ <span class="c1"># get the native name of every language known by babel</span>
+
+ <span class="k">for</span> <span class="n">lang_code</span> <span class="ow">in</span> <span class="nb">filter</span><span class="p">(</span>
+ <span class="k">lambda</span> <span class="n">lang_code</span><span class="p">:</span> <span class="n">lang_code</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">babel</span><span class="o">.</span><span class="n">localedata</span><span class="o">.</span><span class="n">locale_identifiers</span><span class="p">()</span> <span class="c1"># type: ignore</span>
+ <span class="p">):</span>
+ <span class="n">native_name</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="p">(</span><span class="n">lang_code</span><span class="p">)</span><span class="o">.</span><span class="n">get_language_name</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="c1"># type: ignore</span>
+ <span class="c1"># add native name exactly as it is</span>
+ <span class="n">catalog_engine2code</span><span class="p">[</span><span class="n">native_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">lang_code</span>
+
+ <span class="c1"># add &quot;normalized&quot; language name (i.e. français becomes francais and español becomes espanol)</span>
+ <span class="n">unaccented_name</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">c</span><span class="p">:</span> <span class="ow">not</span> <span class="n">combining</span><span class="p">(</span><span class="n">c</span><span class="p">),</span> <span class="n">normalize</span><span class="p">(</span><span class="s1">&#39;NFKD&#39;</span><span class="p">,</span> <span class="n">native_name</span><span class="p">)))</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">unaccented_name</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">unaccented_name</span><span class="o">.</span><span class="n">encode</span><span class="p">()):</span>
+ <span class="c1"># add only if result is ascii (otherwise &quot;normalization&quot; didn&#39;t work)</span>
+ <span class="n">catalog_engine2code</span><span class="p">[</span><span class="n">unaccented_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">lang_code</span>
+
+ <span class="c1"># values that can&#39;t be determined by babel&#39;s languages names</span>
+
+ <span class="n">catalog_engine2code</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="c1"># traditional chinese used in ..</span>
+ <span class="s1">&#39;fantizhengwen&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_Hant&#39;</span><span class="p">,</span>
+ <span class="c1"># Korean alphabet</span>
+ <span class="s1">&#39;hangul&#39;</span><span class="p">:</span> <span class="s1">&#39;ko&#39;</span><span class="p">,</span>
+ <span class="c1"># Malayalam is one of 22 scheduled languages of India.</span>
+ <span class="s1">&#39;malayam&#39;</span><span class="p">:</span> <span class="s1">&#39;ml&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;norsk&#39;</span><span class="p">:</span> <span class="s1">&#39;nb&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;sinhalese&#39;</span><span class="p">:</span> <span class="s1">&#39;si&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="n">skip_eng_tags</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;english_uk&#39;</span><span class="p">,</span> <span class="c1"># SearXNG lang &#39;en&#39; already maps to &#39;english&#39;</span>
+ <span class="p">}</span>
+
+ <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//form[@name=&quot;settings&quot;]//select[@name=&quot;language&quot;]/option&#39;</span><span class="p">):</span>
+
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">option</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">eng_tag</span> <span class="ow">in</span> <span class="n">skip_eng_tags</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">option</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="c1"># type: ignore</span>
+
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">catalog_engine2code</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">sxng_tag</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">catalog_engine2code</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/tineye.html b/_modules/searx/engines/tineye.html
new file mode 100644
index 000000000..5393db1d6
--- /dev/null
+++ b/_modules/searx/engines/tineye.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.tineye &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.tineye</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.tineye</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;This engine implements *Tineye - reverse image search*</span>
+
+<span class="sd">Using TinEye, you can search by image or perform what we call a reverse image</span>
+<span class="sd">search. You can do that by uploading an image or searching by URL. You can also</span>
+<span class="sd">simply drag and drop your images to start your search. TinEye constantly crawls</span>
+<span class="sd">the web and adds images to its index. Today, the TinEye index is over 50.2</span>
+<span class="sd">billion images `[tineye.com] &lt;https://tineye.com/how&gt;`_.</span>
+
+<span class="sd">.. hint::</span>
+
+<span class="sd"> This SearXNG engine only supports *&#39;searching by URL&#39;* and it does not use</span>
+<span class="sd"> the official API `[api.tineye.com] &lt;https://api.tineye.com/python/docs/&gt;`_.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+<span class="kn">from</span> <span class="nn">flask_babel</span> <span class="kn">import</span> <span class="n">gettext</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://tineye.com&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q2382535&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://api.tineye.com/python/docs/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;online_url_search&#39;</span>
+<span class="sd">&quot;&quot;&quot;:py:obj:`searx.search.processors.online_url_search`&quot;&quot;&quot;</span>
+
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="n">base_url</span> <span class="o">=</span> <span class="s1">&#39;https://tineye.com&#39;</span>
+<span class="n">search_string</span> <span class="o">=</span> <span class="s1">&#39;/result_json/?page=</span><span class="si">{page}</span><span class="s1">&amp;</span><span class="si">{query}</span><span class="s1">&#39;</span>
+
+<span class="n">FORMAT_NOT_SUPPORTED</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span>
+ <span class="s2">&quot;Could not read that image url. This may be due to an unsupported file&quot;</span>
+ <span class="s2">&quot; format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or WebP.&quot;</span>
+<span class="p">)</span>
+<span class="sd">&quot;&quot;&quot;TinEye error message&quot;&quot;&quot;</span>
+
+<span class="n">NO_SIGNATURE_ERROR</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span>
+ <span class="s2">&quot;The image is too simple to find matches. TinEye requires a basic level of&quot;</span>
+ <span class="s2">&quot; visual detail to successfully identify matches.&quot;</span>
+<span class="p">)</span>
+<span class="sd">&quot;&quot;&quot;TinEye error message&quot;&quot;&quot;</span>
+
+<span class="n">DOWNLOAD_ERROR</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;The image could not be downloaded.&quot;</span><span class="p">)</span>
+<span class="sd">&quot;&quot;&quot;TinEye error message&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online_url_search/tineye.html#searx.engines.tineye.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Build TinEye HTTP request using ``search_urls`` of a :py:obj:`engine_type`.&quot;&quot;&quot;</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
+
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;search_urls&#39;</span><span class="p">][</span><span class="s1">&#39;data:image&#39;</span><span class="p">]:</span>
+ <span class="n">query</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;search_urls&#39;</span><span class="p">][</span><span class="s1">&#39;data:image&#39;</span><span class="p">]</span>
+ <span class="k">elif</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;search_urls&#39;</span><span class="p">][</span><span class="s1">&#39;http&#39;</span><span class="p">]:</span>
+ <span class="n">query</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;search_urls&#39;</span><span class="p">][</span><span class="s1">&#39;http&#39;</span><span class="p">]</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;query URL: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
+ <span class="n">query</span> <span class="o">=</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">})</span>
+
+ <span class="c1"># see https://github.com/TinEye/pytineye/blob/main/pytineye/api.py</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="n">search_string</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="n">query</span><span class="p">,</span> <span class="n">page</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">])</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;Connection&#39;</span><span class="p">:</span> <span class="s1">&#39;keep-alive&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;Accept-Encoding&#39;</span><span class="p">:</span> <span class="s1">&#39;gzip, defalte, br&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;Host&#39;</span><span class="p">:</span> <span class="s1">&#39;tineye.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;DNT&#39;</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;TE&#39;</span><span class="p">:</span> <span class="s1">&#39;trailers&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="parse_tineye_match">
+<a class="viewcode-back" href="../../../dev/engines/online_url_search/tineye.html#searx.engines.tineye.parse_tineye_match">[docs]</a>
+<span class="k">def</span> <span class="nf">parse_tineye_match</span><span class="p">(</span><span class="n">match_json</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Takes parsed JSON from the API server and turns it into a :py:obj:`dict`</span>
+<span class="sd"> object.</span>
+
+<span class="sd"> Attributes `(class Match) &lt;https://github.com/TinEye/pytineye/blob/main/pytineye/api.py&gt;`__</span>
+
+<span class="sd"> - `image_url`, link to the result image.</span>
+<span class="sd"> - `domain`, domain this result was found on.</span>
+<span class="sd"> - `score`, a number (0 to 100) that indicates how closely the images match.</span>
+<span class="sd"> - `width`, image width in pixels.</span>
+<span class="sd"> - `height`, image height in pixels.</span>
+<span class="sd"> - `size`, image area in pixels.</span>
+<span class="sd"> - `format`, image format.</span>
+<span class="sd"> - `filesize`, image size in bytes.</span>
+<span class="sd"> - `overlay`, overlay URL.</span>
+<span class="sd"> - `tags`, whether this match belongs to a collection or stock domain.</span>
+
+<span class="sd"> - `backlinks`, a list of Backlink objects pointing to the original websites</span>
+<span class="sd"> and image URLs. List items are instances of :py:obj:`dict`, (`Backlink</span>
+<span class="sd"> &lt;https://github.com/TinEye/pytineye/blob/main/pytineye/api.py&gt;`__):</span>
+
+<span class="sd"> - `url`, the image URL to the image.</span>
+<span class="sd"> - `backlink`, the original website URL.</span>
+<span class="sd"> - `crawl_date`, the date the image was crawled.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="c1"># HINT: there exists an alternative backlink dict in the domains list / e.g.::</span>
+ <span class="c1">#</span>
+ <span class="c1"># match_json[&#39;domains&#39;][0][&#39;backlinks&#39;]</span>
+
+ <span class="n">backlinks</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">if</span> <span class="s2">&quot;backlinks&quot;</span> <span class="ow">in</span> <span class="n">match_json</span><span class="p">:</span>
+
+ <span class="k">for</span> <span class="n">backlink_json</span> <span class="ow">in</span> <span class="n">match_json</span><span class="p">[</span><span class="s2">&quot;backlinks&quot;</span><span class="p">]:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">backlink_json</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">continue</span>
+
+ <span class="n">crawl_date</span> <span class="o">=</span> <span class="n">backlink_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;crawl_date&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">crawl_date</span><span class="p">:</span>
+ <span class="n">crawl_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">crawl_date</span><span class="p">[:</span><span class="o">-</span><span class="mi">3</span><span class="p">])</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">crawl_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">min</span>
+
+ <span class="n">backlinks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">backlink_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;url&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;backlink&#39;</span><span class="p">:</span> <span class="n">backlink_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;backlink&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;crawl_date&#39;</span><span class="p">:</span> <span class="n">crawl_date</span><span class="p">,</span>
+ <span class="s1">&#39;image_name&#39;</span><span class="p">:</span> <span class="n">backlink_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;image_name&quot;</span><span class="p">),</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="s1">&#39;image_url&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;image_url&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;domain&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;domain&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;score&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;score&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;width&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;width&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;height&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;height&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;size&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;size&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;image_format&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;format&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;filesize&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;filesize&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;overlay&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;overlay&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;tags&#39;</span><span class="p">:</span> <span class="n">match_json</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">),</span>
+ <span class="s1">&#39;backlinks&#39;</span><span class="p">:</span> <span class="n">backlinks</span><span class="p">,</span>
+ <span class="p">}</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online_url_search/tineye.html#searx.engines.tineye.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse HTTP response from TinEye.&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">json_data</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="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;can&#39;t parse JSON response // </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">exc</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="n">json_data</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="n">msg</span><span class="p">}</span>
+
+ <span class="c1"># handle error codes from Tineye</span>
+
+ <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">is_error</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="ow">in</span> <span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="mi">422</span><span class="p">):</span>
+
+ <span class="n">message</span> <span class="o">=</span> <span class="s1">&#39;HTTP status: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">resp</span><span class="o">.</span><span class="n">status_code</span>
+ <span class="n">error</span> <span class="o">=</span> <span class="n">json_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">)</span>
+ <span class="n">s_key</span> <span class="o">=</span> <span class="n">json_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;suggestions&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;key&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">error</span> <span class="ow">and</span> <span class="n">s_key</span><span class="p">:</span>
+ <span class="n">message</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">error</span><span class="p">,</span> <span class="n">s_key</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">error</span><span class="p">:</span>
+ <span class="n">message</span> <span class="o">=</span> <span class="n">error</span>
+
+ <span class="k">if</span> <span class="n">s_key</span> <span class="o">==</span> <span class="s2">&quot;Invalid image URL&quot;</span><span class="p">:</span>
+ <span class="c1"># test https://docs.searxng.org/_static/searxng-wordmark.svg</span>
+ <span class="n">message</span> <span class="o">=</span> <span class="n">FORMAT_NOT_SUPPORTED</span>
+ <span class="k">elif</span> <span class="n">s_key</span> <span class="o">==</span> <span class="s1">&#39;NO_SIGNATURE_ERROR&#39;</span><span class="p">:</span>
+ <span class="c1"># test https://pngimg.com/uploads/dot/dot_PNG4.png</span>
+ <span class="n">message</span> <span class="o">=</span> <span class="n">NO_SIGNATURE_ERROR</span>
+ <span class="k">elif</span> <span class="n">s_key</span> <span class="o">==</span> <span class="s1">&#39;Download Error&#39;</span><span class="p">:</span>
+ <span class="c1"># test https://notexists</span>
+ <span class="n">message</span> <span class="o">=</span> <span class="n">DOWNLOAD_ERROR</span>
+
+ <span class="c1"># see https://github.com/searxng/searxng/pull/1456#issuecomment-1193105023</span>
+ <span class="c1"># results.append({&#39;answer&#39;: message})</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+ <span class="n">resp</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
+
+ <span class="c1"># append results from matches</span>
+
+ <span class="k">for</span> <span class="n">match_json</span> <span class="ow">in</span> <span class="n">json_data</span><span class="p">[</span><span class="s1">&#39;matches&#39;</span><span class="p">]:</span>
+
+ <span class="n">tineye_match</span> <span class="o">=</span> <span class="n">parse_tineye_match</span><span class="p">(</span><span class="n">match_json</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">tineye_match</span><span class="p">[</span><span class="s1">&#39;backlinks&#39;</span><span class="p">]:</span>
+ <span class="k">continue</span>
+
+ <span class="n">backlink</span> <span class="o">=</span> <span class="n">tineye_match</span><span class="p">[</span><span class="s1">&#39;backlinks&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;images.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">backlink</span><span class="p">[</span><span class="s1">&#39;backlink&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;thumbnail_src&#39;</span><span class="p">:</span> <span class="n">tineye_match</span><span class="p">[</span><span class="s1">&#39;image_url&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;source&#39;</span><span class="p">:</span> <span class="n">backlink</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">backlink</span><span class="p">[</span><span class="s1">&#39;image_name&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">backlink</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;format&#39;</span><span class="p">:</span> <span class="n">tineye_match</span><span class="p">[</span><span class="s1">&#39;image_format&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;widht&#39;</span><span class="p">:</span> <span class="n">tineye_match</span><span class="p">[</span><span class="s1">&#39;width&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;height&#39;</span><span class="p">:</span> <span class="n">tineye_match</span><span class="p">[</span><span class="s1">&#39;height&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">backlink</span><span class="p">[</span><span class="s1">&#39;crawl_date&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="c1"># append number of results</span>
+
+ <span class="n">number_of_results</span> <span class="o">=</span> <span class="n">json_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;num_matches&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">number_of_results</span><span class="p">:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;number_of_results&#39;</span><span class="p">:</span> <span class="n">number_of_results</span><span class="p">})</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/torznab.html b/_modules/searx/engines/torznab.html
new file mode 100644
index 000000000..4375c05b7
--- /dev/null
+++ b/_modules/searx/engines/torznab.html
@@ -0,0 +1,372 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.torznab &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.torznab</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.torznab</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;Torznab_ is an API specification that provides a standardized way to query</span>
+<span class="sd">torrent site for content. It is used by a number of torrent applications,</span>
+<span class="sd">including Prowlarr_ and Jackett_.</span>
+
+<span class="sd">Using this engine together with Prowlarr_ or Jackett_ allows you to search</span>
+<span class="sd">a huge number of torrent sites which are not directly supported.</span>
+
+<span class="sd">Configuration</span>
+<span class="sd">=============</span>
+
+<span class="sd">The engine has the following settings:</span>
+
+<span class="sd">``base_url``:</span>
+<span class="sd"> Torznab endpoint URL.</span>
+
+<span class="sd">``api_key``:</span>
+<span class="sd"> The API key to use for authentication.</span>
+
+<span class="sd">``torznab_categories``:</span>
+<span class="sd"> The categories to use for searching. This is a list of category IDs. See</span>
+<span class="sd"> Prowlarr-categories_ or Jackett-categories_ for more information.</span>
+
+<span class="sd">``show_torrent_files``:</span>
+<span class="sd"> Whether to show the torrent file in the search results. Be careful as using</span>
+<span class="sd"> this with Prowlarr_ or Jackett_ leaks the API key. This should be used only</span>
+<span class="sd"> if you are querying a Torznab endpoint without authentication or if the</span>
+<span class="sd"> instance is private. Be aware that private trackers may ban you if you share</span>
+<span class="sd"> the torrent file. Defaults to ``false``.</span>
+
+<span class="sd">``show_magnet_links``:</span>
+<span class="sd"> Whether to show the magnet link in the search results. Be aware that private</span>
+<span class="sd"> trackers may ban you if you share the magnet link. Defaults to ``true``.</span>
+
+<span class="sd">.. _Torznab:</span>
+<span class="sd"> https://torznab.github.io/spec-1.3-draft/index.html</span>
+<span class="sd">.. _Prowlarr:</span>
+<span class="sd"> https://github.com/Prowlarr/Prowlarr</span>
+<span class="sd">.. _Jackett:</span>
+<span class="sd"> https://github.com/Jackett/Jackett</span>
+<span class="sd">.. _Prowlarr-categories:</span>
+<span class="sd"> https://wiki.servarr.com/en/prowlarr/cardigann-yml-definition#categories</span>
+<span class="sd">.. _Jackett-categories:</span>
+<span class="sd"> https://github.com/Jackett/Jackett/wiki/Jackett-Categories</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">quote</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">etree</span> <span class="c1"># type: ignore</span>
+
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineAPIException</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">httpx</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="c1"># engine settings</span>
+<span class="n">about</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s2">&quot;https://torznab.github.io/spec-1.3-draft&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;XML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="n">categories</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;files&#39;</span><span class="p">]</span>
+<span class="n">paging</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="n">time_range_support</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
+
+<span class="c1"># defined in settings.yml</span>
+<span class="c1"># example (Jackett): &quot;http://localhost:9117/api/v2.0/indexers/all/results/torznab&quot;</span>
+<span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="n">api_key</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="c1"># https://newznab.readthedocs.io/en/latest/misc/api/#predefined-categories</span>
+<span class="n">torznab_categories</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+<span class="n">show_torrent_files</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="n">show_magnet_links</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
+
+
+<div class="viewcode-block" id="init">
+<a class="viewcode-back" href="../../../dev/engines/online/torznab.html#searx.engines.torznab.init">[docs]</a>
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="c1"># pylint: disable=unused-argument</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initialize the engine.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">base_url</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;missing torznab base_url&#39;</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/torznab.html#searx.engines.torznab.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">params</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Build the request params.&quot;&quot;&quot;</span>
+ <span class="n">search_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">base_url</span> <span class="o">+</span> <span class="s1">&#39;?t=search&amp;q=</span><span class="si">{search_query}</span><span class="s1">&#39;</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">api_key</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">search_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;apikey=</span><span class="si">{api_key}</span><span class="s1">&#39;</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">torznab_categories</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">search_url</span> <span class="o">+=</span> <span class="s1">&#39;&amp;cat=</span><span class="si">{torznab_categories}</span><span class="s1">&#39;</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">search_query</span><span class="o">=</span><span class="n">quote</span><span class="p">(</span><span class="n">query</span><span class="p">),</span> <span class="n">api_key</span><span class="o">=</span><span class="n">api_key</span><span class="p">,</span> <span class="n">torznab_categories</span><span class="o">=</span><span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">torznab_categories</span><span class="p">])</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/torznab.html#searx.engines.torznab.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">:</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse the XML response and return a list of results.&quot;&quot;&quot;</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">search_results</span> <span class="o">=</span> <span class="n">etree</span><span class="o">.</span><span class="n">XML</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
+
+ <span class="c1"># handle errors: https://newznab.readthedocs.io/en/latest/misc/api/#newznab-error-codes</span>
+ <span class="k">if</span> <span class="n">search_results</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SearxEngineAPIException</span><span class="p">(</span><span class="n">search_results</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">))</span>
+
+ <span class="n">channel</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span> <span class="o">=</span> <span class="n">search_results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+
+ <span class="n">item</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">channel</span><span class="o">.</span><span class="n">iterfind</span><span class="p">(</span><span class="s1">&#39;item&#39;</span><span class="p">):</span>
+ <span class="n">result</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="n">build_result</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<div class="viewcode-block" id="build_result">
+<a class="viewcode-back" href="../../../dev/engines/online/torznab.html#searx.engines.torznab.build_result">[docs]</a>
+<span class="k">def</span> <span class="nf">build_result</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Build a result from a XML item.&quot;&quot;&quot;</span>
+
+ <span class="c1"># extract attributes from XML</span>
+ <span class="c1"># see https://torznab.github.io/spec-1.3-draft/torznab/Specification-v1.3.html#predefined-attributes</span>
+ <span class="n">enclosure</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;enclosure&#39;</span><span class="p">)</span>
+ <span class="n">enclosure_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="n">enclosure</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">enclosure_url</span> <span class="o">=</span> <span class="n">enclosure</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;url&#39;</span><span class="p">)</span>
+
+ <span class="n">size</span> <span class="o">=</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;size&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">size</span> <span class="ow">and</span> <span class="n">enclosure</span><span class="p">:</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="n">enclosure</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;length&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">size</span><span class="p">:</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
+
+ <span class="n">guid</span> <span class="o">=</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;guid&#39;</span><span class="p">)</span>
+ <span class="n">comments</span> <span class="o">=</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;comments&#39;</span><span class="p">)</span>
+ <span class="n">pubDate</span> <span class="o">=</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;pubDate&#39;</span><span class="p">)</span>
+ <span class="n">seeders</span> <span class="o">=</span> <span class="n">get_torznab_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;seeders&#39;</span><span class="p">)</span>
+ <span class="n">leechers</span> <span class="o">=</span> <span class="n">get_torznab_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;leechers&#39;</span><span class="p">)</span>
+ <span class="n">peers</span> <span class="o">=</span> <span class="n">get_torznab_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;peers&#39;</span><span class="p">)</span>
+
+ <span class="c1"># map attributes to searx result</span>
+ <span class="n">result</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;torrent.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;filesize&#39;</span><span class="p">:</span> <span class="n">size</span><span class="p">,</span>
+ <span class="s1">&#39;files&#39;</span><span class="p">:</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;files&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;seed&#39;</span><span class="p">:</span> <span class="n">seeders</span><span class="p">,</span>
+ <span class="s1">&#39;leech&#39;</span><span class="p">:</span> <span class="n">_map_leechers</span><span class="p">(</span><span class="n">leechers</span><span class="p">,</span> <span class="n">seeders</span><span class="p">,</span> <span class="n">peers</span><span class="p">),</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">_map_result_url</span><span class="p">(</span><span class="n">guid</span><span class="p">,</span> <span class="n">comments</span><span class="p">),</span>
+ <span class="s1">&#39;publishedDate&#39;</span><span class="p">:</span> <span class="n">_map_published_date</span><span class="p">(</span><span class="n">pubDate</span><span class="p">),</span>
+ <span class="s1">&#39;torrentfile&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s1">&#39;magnetlink&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">link</span> <span class="o">=</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;link&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">show_torrent_files</span><span class="p">:</span>
+ <span class="n">result</span><span class="p">[</span><span class="s1">&#39;torrentfile&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_map_torrent_file</span><span class="p">(</span><span class="n">link</span><span class="p">,</span> <span class="n">enclosure_url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">show_magnet_links</span><span class="p">:</span>
+ <span class="n">magneturl</span> <span class="o">=</span> <span class="n">get_torznab_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;magneturl&#39;</span><span class="p">)</span>
+ <span class="n">result</span><span class="p">[</span><span class="s1">&#39;magnetlink&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_map_magnet_link</span><span class="p">(</span><span class="n">magneturl</span><span class="p">,</span> <span class="n">guid</span><span class="p">,</span> <span class="n">enclosure_url</span><span class="p">,</span> <span class="n">link</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">result</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">_map_result_url</span><span class="p">(</span><span class="n">guid</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">comments</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</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="k">if</span> <span class="n">guid</span> <span class="ow">and</span> <span class="n">guid</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">guid</span>
+ <span class="k">if</span> <span class="n">comments</span> <span class="ow">and</span> <span class="n">comments</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">comments</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">_map_leechers</span><span class="p">(</span><span class="n">leechers</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">seeders</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">peers</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</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="k">if</span> <span class="n">leechers</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">leechers</span>
+ <span class="k">if</span> <span class="n">seeders</span> <span class="ow">and</span> <span class="n">peers</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">peers</span><span class="p">)</span> <span class="o">-</span> <span class="nb">int</span><span class="p">(</span><span class="n">seeders</span><span class="p">))</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">_map_published_date</span><span class="p">(</span><span class="n">pubDate</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">datetime</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">pubDate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">pubDate</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%a</span><span class="s1">, </span><span class="si">%d</span><span class="s1"> %b %Y %H:%M:%S %z&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;ignore exception (publishedDate): </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">_map_torrent_file</span><span class="p">(</span><span class="n">link</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">enclosure_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</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="k">if</span> <span class="n">link</span> <span class="ow">and</span> <span class="n">link</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">link</span>
+ <span class="k">if</span> <span class="n">enclosure_url</span> <span class="ow">and</span> <span class="n">enclosure_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">enclosure_url</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">def</span> <span class="nf">_map_magnet_link</span><span class="p">(</span>
+ <span class="n">magneturl</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">guid</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">enclosure_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">link</span><span class="p">:</span> <span class="nb">str</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="o">|</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">magneturl</span> <span class="ow">and</span> <span class="n">magneturl</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;magnet&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">magneturl</span>
+ <span class="k">if</span> <span class="n">guid</span> <span class="ow">and</span> <span class="n">guid</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;magnet&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">guid</span>
+ <span class="k">if</span> <span class="n">enclosure_url</span> <span class="ow">and</span> <span class="n">enclosure_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;magnet&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">enclosure_url</span>
+ <span class="k">if</span> <span class="n">link</span> <span class="ow">and</span> <span class="n">link</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;magnet&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">link</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<div class="viewcode-block" id="get_attribute">
+<a class="viewcode-back" href="../../../dev/engines/online/torznab.html#searx.engines.torznab.get_attribute">[docs]</a>
+<span class="k">def</span> <span class="nf">get_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span><span class="p">,</span> <span class="n">property_name</span><span class="p">:</span> <span class="nb">str</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;Get attribute from item.&quot;&quot;&quot;</span>
+ <span class="n">property_element</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">property_name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">property_element</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">property_element</span><span class="o">.</span><span class="n">text</span>
+ <span class="k">return</span> <span class="kc">None</span></div>
+
+
+
+<div class="viewcode-block" id="get_torznab_attribute">
+<a class="viewcode-back" href="../../../dev/engines/online/torznab.html#searx.engines.torznab.get_torznab_attribute">[docs]</a>
+<span class="k">def</span> <span class="nf">get_torznab_attribute</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span><span class="p">,</span> <span class="n">attribute_name</span><span class="p">:</span> <span class="nb">str</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;Get torznab special attribute from item.&quot;&quot;&quot;</span>
+ <span class="n">element</span><span class="p">:</span> <span class="n">etree</span><span class="o">.</span><span class="n">Element</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">find</span><span class="p">(</span>
+ <span class="s1">&#39;.//torznab:attr[@name=&quot;</span><span class="si">{attribute_name}</span><span class="s1">&quot;]&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">attribute_name</span><span class="o">=</span><span class="n">attribute_name</span><span class="p">),</span>
+ <span class="p">{</span><span class="s1">&#39;torznab&#39;</span><span class="p">:</span> <span class="s1">&#39;http://torznab.com/schemas/2015/feed&#39;</span><span class="p">},</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">element</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">element</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">None</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/voidlinux.html b/_modules/searx/engines/voidlinux.html
new file mode 100644
index 000000000..ab019ae0a
--- /dev/null
+++ b/_modules/searx/engines/voidlinux.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.voidlinux &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.voidlinux</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.voidlinux</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;SearXNG engine for `Void Linux binary packages`_. Void is a general purpose</span>
+<span class="sd">operating system, based on the monolithic Linux kernel. Its package system</span>
+<span class="sd">allows you to quickly install, update and remove software; software is provided</span>
+<span class="sd">in binary packages or can be built directly from sources with the help of the</span>
+<span class="sd">XBPS source packages collection.</span>
+
+<span class="sd">.. _Void Linux binary packages: https://voidlinux.org/packages/</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">quote_plus</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">humanize_bytes</span>
+
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;website&#39;</span><span class="p">:</span> <span class="s1">&#39;https://voidlinux.org/packages/&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;wikidata_id&#39;</span><span class="p">:</span> <span class="s1">&#39;Q19310966&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;use_official_api&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s1">&#39;official_api_documentation&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s1">&#39;require_api_key&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s1">&#39;results&#39;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;packages&#39;</span><span class="p">,</span> <span class="s1">&#39;it&#39;</span><span class="p">]</span>
+
+<span class="n">base_url</span> <span class="o">=</span> <span class="s2">&quot;https://xq-api.voidlinux.org&quot;</span>
+<span class="n">pkg_repo_url</span> <span class="o">=</span> <span class="s2">&quot;https://github.com/void-linux/void-packages&quot;</span>
+
+<span class="n">void_arch</span> <span class="o">=</span> <span class="s1">&#39;x86_64&#39;</span>
+<span class="sd">&quot;&quot;&quot;Default architecture to search for. For valid values see :py:obj:`ARCH_RE`&quot;&quot;&quot;</span>
+
+<span class="n">ARCH_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;aarch64-musl|armv6l-musl|armv7l-musl|x86_64-musl|aarch64|armv6l|armv7l|i686|x86_64&#39;</span><span class="p">)</span>
+<span class="sd">&quot;&quot;&quot;Regular expresion that match a architecture in the query string.&quot;&quot;&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="n">arch_path</span> <span class="o">=</span> <span class="n">ARCH_RE</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">arch_path</span><span class="p">:</span>
+ <span class="n">arch_path</span> <span class="o">=</span> <span class="n">arch_path</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+ <span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">arch_path</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">arch_path</span> <span class="o">=</span> <span class="n">void_arch</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s2">/v1/query/</span><span class="si">{</span><span class="n">arch_path</span><span class="si">}</span><span class="s2">?q=</span><span class="si">{</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">query</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/void.html#searx.engines.voidlinux.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> At Void Linux, several packages sometimes share the same source code</span>
+<span class="sd"> (template) and therefore also have the same URL. Results with identical</span>
+<span class="sd"> URLs are merged as one result for SearXNG.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">packages</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="s1">&#39;data&#39;</span><span class="p">]:</span>
+
+ <span class="c1"># 32bit and dbg packages don&#39;t have their own package templates</span>
+ <span class="n">github_slug</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;-(32bit|dbg)$&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">])</span>
+ <span class="n">pkg_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">pkg_repo_url</span><span class="si">}</span><span class="s2">/tree/master/srcpkgs/</span><span class="si">{</span><span class="n">github_slug</span><span class="si">}</span><span class="s2">&quot;</span>
+
+ <span class="n">pkg_list</span> <span class="o">=</span> <span class="n">packages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">pkg_url</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="n">pkg_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;short_desc&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="n">humanize_bytes</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;filename_size&#39;</span><span class="p">])</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="s1">&#39;package_name&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;version&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;v</span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;version&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;revision&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="s1">&#39;tags&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;repository&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="n">packages</span><span class="p">[</span><span class="n">pkg_url</span><span class="p">]</span> <span class="o">=</span> <span class="n">pkg_list</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">pkg_url</span><span class="p">,</span> <span class="n">pkg_list</span> <span class="ow">in</span> <span class="n">packages</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">pkg_url</span><span class="p">,</span>
+ <span class="s1">&#39;template&#39;</span><span class="p">:</span> <span class="s1">&#39;packages.html&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="s1">&#39; | &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">pkg_list</span><span class="p">),</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">pkg_list</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;content&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;package_name&#39;</span><span class="p">:</span> <span class="s1">&#39; | &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="s1">&#39;package_name&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">pkg_list</span><span class="p">),</span>
+ <span class="s1">&#39;version&#39;</span><span class="p">:</span> <span class="n">pkg_list</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;version&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;tags&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="s1">&#39;tags&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">pkg_list</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/wikidata.html b/_modules/searx/engines/wikidata.html
new file mode 100644
index 000000000..33a233899
--- /dev/null
+++ b/_modules/searx/engines/wikidata.html
@@ -0,0 +1,914 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.wikidata &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.wikidata</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.wikidata</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;This module implements the Wikidata engine. Some implementations are shared</span>
+<span class="sd">from :ref:`wikipedia engine`.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=missing-class-docstring</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">from</span> <span class="nn">hashlib</span> <span class="kn">import</span> <span class="n">md5</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span><span class="p">,</span> <span class="n">unquote</span>
+<span class="kn">from</span> <span class="nn">json</span> <span class="kn">import</span> <span class="n">loads</span>
+
+<span class="kn">from</span> <span class="nn">dateutil.parser</span> <span class="kn">import</span> <span class="n">isoparse</span>
+<span class="kn">from</span> <span class="nn">babel.dates</span> <span class="kn">import</span> <span class="n">format_datetime</span><span class="p">,</span> <span class="n">format_date</span><span class="p">,</span> <span class="n">format_time</span><span class="p">,</span> <span class="n">get_datetime_format</span>
+
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">WIKIDATA_UNITS</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">post</span><span class="p">,</span> <span class="n">get</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">searx_useragent</span><span class="p">,</span> <span class="n">get_string_replaces_function</span>
+<span class="kn">from</span> <span class="nn">searx.external_urls</span> <span class="kn">import</span> <span class="n">get_external_url</span><span class="p">,</span> <span class="n">get_earth_coordinates_url</span><span class="p">,</span> <span class="n">area_to_osm_zoom</span>
+<span class="kn">from</span> <span class="nn">searx.engines.wikipedia</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">fetch_wikimedia_traits</span><span class="p">,</span>
+ <span class="n">get_wiki_params</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://wikidata.org/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q2013&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://query.wikidata.org/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">display_type</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;infobox&quot;</span><span class="p">]</span>
+<span class="sd">&quot;&quot;&quot;A list of display types composed from ``infobox`` and ``list``. The latter</span>
+<span class="sd">one will add a hit to the result list. The first one will show a hit in the</span>
+<span class="sd">info box. Both values can be set, or one of the two can be set.&quot;&quot;&quot;</span>
+
+
+<span class="c1"># SPARQL</span>
+<span class="n">SPARQL_ENDPOINT_URL</span> <span class="o">=</span> <span class="s1">&#39;https://query.wikidata.org/sparql&#39;</span>
+<span class="n">SPARQL_EXPLAIN_URL</span> <span class="o">=</span> <span class="s1">&#39;https://query.wikidata.org/bigdata/namespace/wdq/sparql?explain&#39;</span>
+<span class="n">WIKIDATA_PROPERTIES</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;P434&#39;</span><span class="p">:</span> <span class="s1">&#39;MusicBrainz&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P435&#39;</span><span class="p">:</span> <span class="s1">&#39;MusicBrainz&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P436&#39;</span><span class="p">:</span> <span class="s1">&#39;MusicBrainz&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P966&#39;</span><span class="p">:</span> <span class="s1">&#39;MusicBrainz&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P345&#39;</span><span class="p">:</span> <span class="s1">&#39;IMDb&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P2397&#39;</span><span class="p">:</span> <span class="s1">&#39;YouTube&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P1651&#39;</span><span class="p">:</span> <span class="s1">&#39;YouTube&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P2002&#39;</span><span class="p">:</span> <span class="s1">&#39;Twitter&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P2013&#39;</span><span class="p">:</span> <span class="s1">&#39;Facebook&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;P2003&#39;</span><span class="p">:</span> <span class="s1">&#39;Instagram&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># SERVICE wikibase:mwapi : https://www.mediawiki.org/wiki/Wikidata_Query_Service/User_Manual/MWAPI</span>
+<span class="c1"># SERVICE wikibase:label: https://en.wikibooks.org/wiki/SPARQL/SERVICE_-_Label#Manual_Label_SERVICE</span>
+<span class="c1"># https://en.wikibooks.org/wiki/SPARQL/WIKIDATA_Precision,_Units_and_Coordinates</span>
+<span class="c1"># https://www.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format#Data_model</span>
+<span class="c1"># optimization:</span>
+<span class="c1"># * https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization</span>
+<span class="c1"># * https://github.com/blazegraph/database/wiki/QueryHints</span>
+<span class="n">QUERY_TEMPLATE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">SELECT ?item ?itemLabel ?itemDescription ?lat ?long %SELECT%</span>
+<span class="s2">WHERE</span>
+<span class="s2">{</span>
+<span class="s2"> SERVICE wikibase:mwapi {</span>
+<span class="s2"> bd:serviceParam wikibase:endpoint &quot;www.wikidata.org&quot;;</span>
+<span class="s2"> wikibase:api &quot;EntitySearch&quot;;</span>
+<span class="s2"> wikibase:limit 1;</span>
+<span class="s2"> mwapi:search &quot;%QUERY%&quot;;</span>
+<span class="s2"> mwapi:language &quot;%LANGUAGE%&quot;.</span>
+<span class="s2"> ?item wikibase:apiOutputItem mwapi:item.</span>
+<span class="s2"> }</span>
+<span class="s2"> hint:Prior hint:runFirst &quot;true&quot;.</span>
+
+<span class="s2"> %WHERE%</span>
+
+<span class="s2"> SERVICE wikibase:label {</span>
+<span class="s2"> bd:serviceParam wikibase:language &quot;%LANGUAGE%,en&quot;.</span>
+<span class="s2"> ?item rdfs:label ?itemLabel .</span>
+<span class="s2"> ?item schema:description ?itemDescription .</span>
+<span class="s2"> %WIKIBASE_LABELS%</span>
+<span class="s2"> }</span>
+
+<span class="s2">}</span>
+<span class="s2">GROUP BY ?item ?itemLabel ?itemDescription ?lat ?long </span><span class="si">%G</span><span class="s2">ROUP_BY%</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="c1"># Get the calendar names and the property names</span>
+<span class="n">QUERY_PROPERTY_NAMES</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">SELECT ?item ?name</span>
+<span class="s2">WHERE {</span>
+<span class="s2"> {</span>
+<span class="s2"> SELECT ?item</span>
+<span class="s2"> WHERE { ?item wdt:P279* wd:Q12132 }</span>
+<span class="s2"> } UNION {</span>
+<span class="s2"> VALUES ?item { %ATTRIBUTES% }</span>
+<span class="s2"> }</span>
+<span class="s2"> OPTIONAL { ?item rdfs:label ?name. }</span>
+<span class="s2">}</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="c1"># see the property &quot;dummy value&quot; of https://www.wikidata.org/wiki/Q2013 (Wikidata)</span>
+<span class="c1"># hard coded here to avoid to an additional SPARQL request when the server starts</span>
+<span class="n">DUMMY_ENTITY_URLS</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span>
+ <span class="s2">&quot;http://www.wikidata.org/entity/&quot;</span> <span class="o">+</span> <span class="n">wid</span> <span class="k">for</span> <span class="n">wid</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;Q4115189&quot;</span><span class="p">,</span> <span class="s2">&quot;Q13406268&quot;</span><span class="p">,</span> <span class="s2">&quot;Q15397819&quot;</span><span class="p">,</span> <span class="s2">&quot;Q17339402&quot;</span><span class="p">)</span>
+<span class="p">)</span>
+
+
+<span class="c1"># https://www.w3.org/TR/sparql11-query/#rSTRING_LITERAL1</span>
+<span class="c1"># https://lists.w3.org/Archives/Public/public-rdf-dawg/2011OctDec/0175.html</span>
+<span class="n">sparql_string_escape</span> <span class="o">=</span> <span class="n">get_string_replaces_function</span><span class="p">(</span>
+ <span class="c1"># fmt: off</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;</span><span class="se">\t</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\t</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\n</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="se">\r</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\r</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="se">\b</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\b</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="se">\f</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\f</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="se">\&quot;</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\&quot;</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="se">\&#39;</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\&#39;</span><span class="s1">&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\\\\</span><span class="s1">&#39;</span>
+ <span class="p">}</span>
+ <span class="c1"># fmt: on</span>
+<span class="p">)</span>
+
+<span class="n">replace_http_by_https</span> <span class="o">=</span> <span class="n">get_string_replaces_function</span><span class="p">({</span><span class="s1">&#39;http:&#39;</span><span class="p">:</span> <span class="s1">&#39;https:&#39;</span><span class="p">})</span>
+
+
+<span class="k">def</span> <span class="nf">get_headers</span><span class="p">():</span>
+ <span class="c1"># user agent: https://www.mediawiki.org/wiki/Wikidata_Query_Service/User_Manual#Query_limits</span>
+ <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;Accept&#39;</span><span class="p">:</span> <span class="s1">&#39;application/sparql-results+json&#39;</span><span class="p">,</span> <span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="n">searx_useragent</span><span class="p">()}</span>
+
+
+<span class="k">def</span> <span class="nf">get_label_for_entity</span><span class="p">(</span><span class="n">entity_id</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">WIKIDATA_PROPERTIES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entity_id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">WIKIDATA_PROPERTIES</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="n">entity_id</span><span class="p">,</span> <span class="n">language</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">WIKIDATA_PROPERTIES</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="n">entity_id</span><span class="p">,</span> <span class="n">language</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]))</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">WIKIDATA_PROPERTIES</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="n">entity_id</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">entity_id</span>
+ <span class="k">return</span> <span class="n">name</span>
+
+
+<span class="k">def</span> <span class="nf">send_wikidata_query</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;GET&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;GET&#39;</span><span class="p">:</span>
+ <span class="c1"># query will be cached by wikidata</span>
+ <span class="n">http_response</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">SPARQL_ENDPOINT_URL</span> <span class="o">+</span> <span class="s1">&#39;?&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">}),</span> <span class="n">headers</span><span class="o">=</span><span class="n">get_headers</span><span class="p">())</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># query won&#39;t be cached by wikidata</span>
+ <span class="n">http_response</span> <span class="o">=</span> <span class="n">post</span><span class="p">(</span><span class="n">SPARQL_ENDPOINT_URL</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">},</span> <span class="n">headers</span><span class="o">=</span><span class="n">get_headers</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">http_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">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;SPARQL endpoint error </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">http_response</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;request time </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">http_response</span><span class="o">.</span><span class="n">elapsed</span><span class="p">))</span>
+ <span class="n">http_response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">loads</span><span class="p">(</span><span class="n">http_response</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+
+ <span class="n">eng_tag</span><span class="p">,</span> <span class="n">_wiki_netloc</span> <span class="o">=</span> <span class="n">get_wiki_params</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="p">)</span>
+ <span class="n">query</span><span class="p">,</span> <span class="n">attributes</span> <span class="o">=</span> <span class="n">get_query</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;request --&gt; language </span><span class="si">%s</span><span class="s2"> // len(attributes): </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">attributes</span><span class="p">))</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;method&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;POST&#39;</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">SPARQL_ENDPOINT_URL</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">}</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_headers</span><span class="p">()</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;attributes&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">attributes</span>
+
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">jsonresponse</span> <span class="o">=</span> <span class="n">loads</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
+
+ <span class="n">language</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">search_params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span>
+ <span class="n">attributes</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">search_params</span><span class="p">[</span><span class="s1">&#39;attributes&#39;</span><span class="p">]</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;request --&gt; language </span><span class="si">%s</span><span class="s2"> // len(attributes): </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">language</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">attributes</span><span class="p">))</span>
+
+ <span class="n">seen_entities</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">jsonresponse</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;results&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;bindings&#39;</span><span class="p">,</span> <span class="p">[]):</span>
+ <span class="n">attribute_result</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="n">value</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
+ <span class="n">entity_url</span> <span class="o">=</span> <span class="n">attribute_result</span><span class="p">[</span><span class="s1">&#39;item&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">entity_url</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">seen_entities</span> <span class="ow">and</span> <span class="n">entity_url</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">DUMMY_ENTITY_URLS</span><span class="p">:</span>
+ <span class="n">seen_entities</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">entity_url</span><span class="p">)</span>
+ <span class="n">results</span> <span class="o">+=</span> <span class="n">get_results</span><span class="p">(</span><span class="n">attribute_result</span><span class="p">,</span> <span class="n">attributes</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;The SPARQL request returns duplicate entities: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">attribute_result</span><span class="p">))</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="n">_IMG_SRC_DEFAULT_URL_PREFIX</span> <span class="o">=</span> <span class="s2">&quot;https://commons.wikimedia.org/wiki/Special:FilePath/&quot;</span>
+<span class="n">_IMG_SRC_NEW_URL_PREFIX</span> <span class="o">=</span> <span class="s2">&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/&quot;</span>
+
+
+<div class="viewcode-block" id="get_thumbnail">
+<a class="viewcode-back" href="../../../dev/engines/online/wikipedia.html#searx.engines.wikidata.get_thumbnail">[docs]</a>
+<span class="k">def</span> <span class="nf">get_thumbnail</span><span class="p">(</span><span class="n">img_src</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get Thumbnail image from wikimedia commons</span>
+
+<span class="sd"> Images from commons.wikimedia.org are (HTTP) redirected to</span>
+<span class="sd"> upload.wikimedia.org. The redirected URL can be calculated by this</span>
+<span class="sd"> function.</span>
+
+<span class="sd"> - https://stackoverflow.com/a/33691240</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;get_thumbnail(): </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">img_src</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">img_src</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">_IMG_SRC_DEFAULT_URL_PREFIX</span> <span class="ow">in</span> <span class="n">img_src</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]:</span>
+ <span class="n">img_src_name</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">img_src</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">_IMG_SRC_DEFAULT_URL_PREFIX</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;?&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;%20&quot;</span><span class="p">,</span> <span class="s2">&quot;_&quot;</span><span class="p">))</span>
+ <span class="n">img_src_name_first</span> <span class="o">=</span> <span class="n">img_src_name</span>
+ <span class="n">img_src_name_second</span> <span class="o">=</span> <span class="n">img_src_name</span>
+
+ <span class="k">if</span> <span class="s2">&quot;.svg&quot;</span> <span class="ow">in</span> <span class="n">img_src_name</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]:</span>
+ <span class="n">img_src_name_second</span> <span class="o">=</span> <span class="n">img_src_name</span> <span class="o">+</span> <span class="s2">&quot;.png&quot;</span>
+
+ <span class="n">img_src_size</span> <span class="o">=</span> <span class="n">img_src</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">_IMG_SRC_DEFAULT_URL_PREFIX</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;?&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">img_src_size</span> <span class="o">=</span> <span class="n">img_src_size</span><span class="p">[</span><span class="n">img_src_size</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">:</span> <span class="n">img_src_size</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&quot;&amp;&quot;</span><span class="p">)]</span>
+ <span class="n">img_src_name_md5</span> <span class="o">=</span> <span class="n">md5</span><span class="p">(</span><span class="n">img_src_name</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">_IMG_SRC_NEW_URL_PREFIX</span>
+ <span class="o">+</span> <span class="n">img_src_name_md5</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="o">+</span> <span class="s2">&quot;/&quot;</span>
+ <span class="o">+</span> <span class="n">img_src_name_md5</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span>
+ <span class="o">+</span> <span class="s2">&quot;/&quot;</span>
+ <span class="o">+</span> <span class="n">img_src_name_first</span>
+ <span class="o">+</span> <span class="s2">&quot;/&quot;</span>
+ <span class="o">+</span> <span class="n">img_src_size</span>
+ <span class="o">+</span> <span class="s2">&quot;px-&quot;</span>
+ <span class="o">+</span> <span class="n">img_src_name_second</span>
+ <span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;get_thumbnail() redirected: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">img_src</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">img_src</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">get_results</span><span class="p">(</span><span class="n">attribute_result</span><span class="p">,</span> <span class="n">attributes</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="c1"># pylint: disable=too-many-branches</span>
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">infobox_title</span> <span class="o">=</span> <span class="n">attribute_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;itemLabel&#39;</span><span class="p">)</span>
+ <span class="n">infobox_id</span> <span class="o">=</span> <span class="n">attribute_result</span><span class="p">[</span><span class="s1">&#39;item&#39;</span><span class="p">]</span>
+ <span class="n">infobox_id_lang</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">infobox_urls</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">infobox_attributes</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">infobox_content</span> <span class="o">=</span> <span class="n">attribute_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;itemDescription&#39;</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">img_src_priority</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">for</span> <span class="n">attribute</span> <span class="ow">in</span> <span class="n">attributes</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">attribute</span><span class="o">.</span><span class="n">get_str</span><span class="p">(</span><span class="n">attribute_result</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="n">attribute_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">attribute</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">attribute_type</span> <span class="ow">in</span> <span class="p">(</span><span class="n">WDURLAttribute</span><span class="p">,</span> <span class="n">WDArticle</span><span class="p">):</span>
+ <span class="c1"># get_select() method : there is group_concat(distinct ...;separator=&quot;, &quot;)</span>
+ <span class="c1"># split the value here</span>
+ <span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">):</span>
+ <span class="n">infobox_urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">attribute</span><span class="o">.</span><span class="n">get_label</span><span class="p">(</span><span class="n">language</span><span class="p">),</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="o">**</span><span class="n">attribute</span><span class="o">.</span><span class="n">kwargs</span><span class="p">})</span>
+ <span class="c1"># &quot;normal&quot; results (not infobox) include official website and Wikipedia links.</span>
+ <span class="k">if</span> <span class="s2">&quot;list&quot;</span> <span class="ow">in</span> <span class="n">display_type</span> <span class="ow">and</span> <span class="p">(</span><span class="n">attribute</span><span class="o">.</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;official&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">attribute_type</span> <span class="o">==</span> <span class="n">WDArticle</span><span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">infobox_title</span><span class="p">,</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s2">&quot;content&quot;</span><span class="p">:</span> <span class="n">infobox_content</span><span class="p">})</span>
+
+ <span class="c1"># update the infobox_id with the wikipedia URL</span>
+ <span class="c1"># first the local wikipedia URL, and as fallback the english wikipedia URL</span>
+ <span class="k">if</span> <span class="n">attribute_type</span> <span class="o">==</span> <span class="n">WDArticle</span> <span class="ow">and</span> <span class="p">(</span>
+ <span class="p">(</span><span class="n">attribute</span><span class="o">.</span><span class="n">language</span> <span class="o">==</span> <span class="s1">&#39;en&#39;</span> <span class="ow">and</span> <span class="n">infobox_id_lang</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">or</span> <span class="n">attribute</span><span class="o">.</span><span class="n">language</span> <span class="o">!=</span> <span class="s1">&#39;en&#39;</span>
+ <span class="p">):</span>
+ <span class="n">infobox_id_lang</span> <span class="o">=</span> <span class="n">attribute</span><span class="o">.</span><span class="n">language</span>
+ <span class="n">infobox_id</span> <span class="o">=</span> <span class="n">url</span>
+ <span class="k">elif</span> <span class="n">attribute_type</span> <span class="o">==</span> <span class="n">WDImageAttribute</span><span class="p">:</span>
+ <span class="c1"># this attribute is an image.</span>
+ <span class="c1"># replace the current image only the priority is lower</span>
+ <span class="c1"># (the infobox contain only one image).</span>
+ <span class="k">if</span> <span class="n">attribute</span><span class="o">.</span><span class="n">priority</span> <span class="o">&gt;</span> <span class="n">img_src_priority</span><span class="p">:</span>
+ <span class="n">img_src</span> <span class="o">=</span> <span class="n">get_thumbnail</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="n">img_src_priority</span> <span class="o">=</span> <span class="n">attribute</span><span class="o">.</span><span class="n">priority</span>
+ <span class="k">elif</span> <span class="n">attribute_type</span> <span class="o">==</span> <span class="n">WDGeoAttribute</span><span class="p">:</span>
+ <span class="c1"># geocoordinate link</span>
+ <span class="c1"># use the area to get the OSM zoom</span>
+ <span class="c1"># Note: ignore the unit (must be km² otherwise the calculation is wrong)</span>
+ <span class="c1"># Should use normalized value p:P2046/psn:P2046/wikibase:quantityAmount</span>
+ <span class="n">area</span> <span class="o">=</span> <span class="n">attribute_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;P2046&#39;</span><span class="p">)</span>
+ <span class="n">osm_zoom</span> <span class="o">=</span> <span class="n">area_to_osm_zoom</span><span class="p">(</span><span class="n">area</span><span class="p">)</span> <span class="k">if</span> <span class="n">area</span> <span class="k">else</span> <span class="mi">19</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">attribute</span><span class="o">.</span><span class="n">get_geo_url</span><span class="p">(</span><span class="n">attribute_result</span><span class="p">,</span> <span class="n">osm_zoom</span><span class="o">=</span><span class="n">osm_zoom</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">url</span><span class="p">:</span>
+ <span class="n">infobox_urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">attribute</span><span class="o">.</span><span class="n">get_label</span><span class="p">(</span><span class="n">language</span><span class="p">),</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;entity&#39;</span><span class="p">:</span> <span class="n">attribute</span><span class="o">.</span><span class="n">name</span><span class="p">})</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">infobox_attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span><span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="n">attribute</span><span class="o">.</span><span class="n">get_label</span><span class="p">(</span><span class="n">language</span><span class="p">),</span> <span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span> <span class="s1">&#39;entity&#39;</span><span class="p">:</span> <span class="n">attribute</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">infobox_id</span><span class="p">:</span>
+ <span class="n">infobox_id</span> <span class="o">=</span> <span class="n">replace_http_by_https</span><span class="p">(</span><span class="n">infobox_id</span><span class="p">)</span>
+
+ <span class="c1"># add the wikidata URL at the end</span>
+ <span class="n">infobox_urls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="s1">&#39;Wikidata&#39;</span><span class="p">,</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">attribute_result</span><span class="p">[</span><span class="s1">&#39;item&#39;</span><span class="p">]})</span>
+
+ <span class="k">if</span> <span class="p">(</span>
+ <span class="s2">&quot;list&quot;</span> <span class="ow">in</span> <span class="n">display_type</span>
+ <span class="ow">and</span> <span class="n">img_src</span> <span class="ow">is</span> <span class="kc">None</span>
+ <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">infobox_attributes</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
+ <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">infobox_urls</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
+ <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">infobox_content</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
+ <span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">infobox_urls</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;url&#39;</span><span class="p">],</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">infobox_title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">infobox_content</span><span class="p">})</span>
+ <span class="k">elif</span> <span class="s2">&quot;infobox&quot;</span> <span class="ow">in</span> <span class="n">display_type</span><span class="p">:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;infobox&#39;</span><span class="p">:</span> <span class="n">infobox_title</span><span class="p">,</span>
+ <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">infobox_id</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">infobox_content</span><span class="p">,</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">img_src</span><span class="p">,</span>
+ <span class="s1">&#39;urls&#39;</span><span class="p">:</span> <span class="n">infobox_urls</span><span class="p">,</span>
+ <span class="s1">&#39;attributes&#39;</span><span class="p">:</span> <span class="n">infobox_attributes</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">get_query</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="n">attributes</span> <span class="o">=</span> <span class="n">get_attributes</span><span class="p">(</span><span class="n">language</span><span class="p">)</span>
+ <span class="n">select</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">get_select</span><span class="p">()</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">attributes</span><span class="p">]</span>
+ <span class="n">where</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">get_where</span><span class="p">()</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">attributes</span><span class="p">]))</span>
+ <span class="n">wikibase_label</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">get_wikibase_label</span><span class="p">()</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">attributes</span><span class="p">]))</span>
+ <span class="n">group_by</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">get_group_by</span><span class="p">()</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">attributes</span><span class="p">]))</span>
+ <span class="n">query</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">QUERY_TEMPLATE</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%QUERY%&#39;</span><span class="p">,</span> <span class="n">sparql_string_escape</span><span class="p">(</span><span class="n">query</span><span class="p">))</span>
+ <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%SELECT%&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">select</span><span class="p">))</span>
+ <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%WHERE%&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1"> &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">where</span><span class="p">))</span>
+ <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%WIKIBASE_LABELS%&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1"> &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">wikibase_label</span><span class="p">))</span>
+ <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%G</span><span class="s1">ROUP_BY%&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">group_by</span><span class="p">))</span>
+ <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%LANGUAGE%&#39;</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">query</span><span class="p">,</span> <span class="n">attributes</span>
+
+
+<span class="k">def</span> <span class="nf">get_attributes</span><span class="p">(</span><span class="n">language</span><span class="p">):</span>
+ <span class="c1"># pylint: disable=too-many-statements</span>
+ <span class="n">attributes</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">def</span> <span class="nf">add_value</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDAttribute</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">add_amount</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDAmountAttribute</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">add_label</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDLabelAttribute</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">add_url</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDURLAttribute</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">url_id</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">add_image</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDImageAttribute</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">url_id</span><span class="p">,</span> <span class="n">priority</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">add_date</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDDateAttribute</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
+
+ <span class="c1"># Dates</span>
+ <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="s1">&#39;P571&#39;</span><span class="p">,</span> <span class="c1"># inception date</span>
+ <span class="s1">&#39;P576&#39;</span><span class="p">,</span> <span class="c1"># dissolution date</span>
+ <span class="s1">&#39;P580&#39;</span><span class="p">,</span> <span class="c1"># start date</span>
+ <span class="s1">&#39;P582&#39;</span><span class="p">,</span> <span class="c1"># end date</span>
+ <span class="s1">&#39;P569&#39;</span><span class="p">,</span> <span class="c1"># date of birth</span>
+ <span class="s1">&#39;P570&#39;</span><span class="p">,</span> <span class="c1"># date of death</span>
+ <span class="s1">&#39;P619&#39;</span><span class="p">,</span> <span class="c1"># date of spacecraft launch</span>
+ <span class="s1">&#39;P620&#39;</span><span class="p">,</span>
+ <span class="p">]:</span> <span class="c1"># date of spacecraft landing</span>
+ <span class="n">add_date</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="s1">&#39;P27&#39;</span><span class="p">,</span> <span class="c1"># country of citizenship</span>
+ <span class="s1">&#39;P495&#39;</span><span class="p">,</span> <span class="c1"># country of origin</span>
+ <span class="s1">&#39;P17&#39;</span><span class="p">,</span> <span class="c1"># country</span>
+ <span class="s1">&#39;P159&#39;</span><span class="p">,</span>
+ <span class="p">]:</span> <span class="c1"># headquarters location</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+
+ <span class="c1"># Places</span>
+ <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="s1">&#39;P36&#39;</span><span class="p">,</span> <span class="c1"># capital</span>
+ <span class="s1">&#39;P35&#39;</span><span class="p">,</span> <span class="c1"># head of state</span>
+ <span class="s1">&#39;P6&#39;</span><span class="p">,</span> <span class="c1"># head of government</span>
+ <span class="s1">&#39;P122&#39;</span><span class="p">,</span> <span class="c1"># basic form of government</span>
+ <span class="s1">&#39;P37&#39;</span><span class="p">,</span>
+ <span class="p">]:</span> <span class="c1"># official language</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P1082&#39;</span><span class="p">)</span> <span class="c1"># population</span>
+ <span class="n">add_amount</span><span class="p">(</span><span class="s1">&#39;P2046&#39;</span><span class="p">)</span> <span class="c1"># area</span>
+ <span class="n">add_amount</span><span class="p">(</span><span class="s1">&#39;P281&#39;</span><span class="p">)</span> <span class="c1"># postal code</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P38&#39;</span><span class="p">)</span> <span class="c1"># currency</span>
+ <span class="n">add_amount</span><span class="p">(</span><span class="s1">&#39;P2048&#39;</span><span class="p">)</span> <span class="c1"># height (building)</span>
+
+ <span class="c1"># Media</span>
+ <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="s1">&#39;P400&#39;</span><span class="p">,</span> <span class="c1"># platform (videogames, computing)</span>
+ <span class="s1">&#39;P50&#39;</span><span class="p">,</span> <span class="c1"># author</span>
+ <span class="s1">&#39;P170&#39;</span><span class="p">,</span> <span class="c1"># creator</span>
+ <span class="s1">&#39;P57&#39;</span><span class="p">,</span> <span class="c1"># director</span>
+ <span class="s1">&#39;P175&#39;</span><span class="p">,</span> <span class="c1"># performer</span>
+ <span class="s1">&#39;P178&#39;</span><span class="p">,</span> <span class="c1"># developer</span>
+ <span class="s1">&#39;P162&#39;</span><span class="p">,</span> <span class="c1"># producer</span>
+ <span class="s1">&#39;P176&#39;</span><span class="p">,</span> <span class="c1"># manufacturer</span>
+ <span class="s1">&#39;P58&#39;</span><span class="p">,</span> <span class="c1"># screenwriter</span>
+ <span class="s1">&#39;P272&#39;</span><span class="p">,</span> <span class="c1"># production company</span>
+ <span class="s1">&#39;P264&#39;</span><span class="p">,</span> <span class="c1"># record label</span>
+ <span class="s1">&#39;P123&#39;</span><span class="p">,</span> <span class="c1"># publisher</span>
+ <span class="s1">&#39;P449&#39;</span><span class="p">,</span> <span class="c1"># original network</span>
+ <span class="s1">&#39;P750&#39;</span><span class="p">,</span> <span class="c1"># distributed by</span>
+ <span class="s1">&#39;P86&#39;</span><span class="p">,</span>
+ <span class="p">]:</span> <span class="c1"># composer</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+
+ <span class="n">add_date</span><span class="p">(</span><span class="s1">&#39;P577&#39;</span><span class="p">)</span> <span class="c1"># publication date</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P136&#39;</span><span class="p">)</span> <span class="c1"># genre (music, film, artistic...)</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P364&#39;</span><span class="p">)</span> <span class="c1"># original language</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P212&#39;</span><span class="p">)</span> <span class="c1"># ISBN-13</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P957&#39;</span><span class="p">)</span> <span class="c1"># ISBN-10</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P275&#39;</span><span class="p">)</span> <span class="c1"># copyright license</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P277&#39;</span><span class="p">)</span> <span class="c1"># programming language</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P348&#39;</span><span class="p">)</span> <span class="c1"># version</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P840&#39;</span><span class="p">)</span> <span class="c1"># narrative location</span>
+
+ <span class="c1"># Languages</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P1098&#39;</span><span class="p">)</span> <span class="c1"># number of speakers</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P282&#39;</span><span class="p">)</span> <span class="c1"># writing system</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P1018&#39;</span><span class="p">)</span> <span class="c1"># language regulatory body</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P218&#39;</span><span class="p">)</span> <span class="c1"># language code (ISO 639-1)</span>
+
+ <span class="c1"># Other</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P169&#39;</span><span class="p">)</span> <span class="c1"># ceo</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P112&#39;</span><span class="p">)</span> <span class="c1"># founded by</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P1454&#39;</span><span class="p">)</span> <span class="c1"># legal form (company, organization)</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P137&#39;</span><span class="p">)</span> <span class="c1"># operator (service, facility, ...)</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P1029&#39;</span><span class="p">)</span> <span class="c1"># crew members (tripulation)</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P225&#39;</span><span class="p">)</span> <span class="c1"># taxon name</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P274&#39;</span><span class="p">)</span> <span class="c1"># chemical formula</span>
+ <span class="n">add_label</span><span class="p">(</span><span class="s1">&#39;P1346&#39;</span><span class="p">)</span> <span class="c1"># winner (sports, contests, ...)</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P1120&#39;</span><span class="p">)</span> <span class="c1"># number of deaths</span>
+ <span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;P498&#39;</span><span class="p">)</span> <span class="c1"># currency code (ISO 4217)</span>
+
+ <span class="c1"># URL</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P856&#39;</span><span class="p">,</span> <span class="n">official</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># official website</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDArticle</span><span class="p">(</span><span class="n">language</span><span class="p">))</span> <span class="c1"># wikipedia (user language)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">language</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;en&#39;</span><span class="p">):</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDArticle</span><span class="p">(</span><span class="s1">&#39;en&#39;</span><span class="p">))</span> <span class="c1"># wikipedia (english)</span>
+
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P1324&#39;</span><span class="p">)</span> <span class="c1"># source code repository</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P1581&#39;</span><span class="p">)</span> <span class="c1"># blog</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P434&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;musicbrainz_artist&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P435&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;musicbrainz_work&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P436&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;musicbrainz_release_group&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P966&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;musicbrainz_label&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P345&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;imdb_id&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P2397&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;youtube_channel&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P1651&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;youtube_video&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P2002&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;twitter_profile&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P2013&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;facebook_profile&#39;</span><span class="p">)</span>
+ <span class="n">add_url</span><span class="p">(</span><span class="s1">&#39;P2003&#39;</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;instagram_profile&#39;</span><span class="p">)</span>
+
+ <span class="c1"># Map</span>
+ <span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WDGeoAttribute</span><span class="p">(</span><span class="s1">&#39;P625&#39;</span><span class="p">))</span>
+
+ <span class="c1"># Image</span>
+ <span class="n">add_image</span><span class="p">(</span><span class="s1">&#39;P15&#39;</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;wikimedia_image&#39;</span><span class="p">)</span> <span class="c1"># route map</span>
+ <span class="n">add_image</span><span class="p">(</span><span class="s1">&#39;P242&#39;</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;wikimedia_image&#39;</span><span class="p">)</span> <span class="c1"># locator map</span>
+ <span class="n">add_image</span><span class="p">(</span><span class="s1">&#39;P154&#39;</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;wikimedia_image&#39;</span><span class="p">)</span> <span class="c1"># logo</span>
+ <span class="n">add_image</span><span class="p">(</span><span class="s1">&#39;P18&#39;</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;wikimedia_image&#39;</span><span class="p">)</span> <span class="c1"># image</span>
+ <span class="n">add_image</span><span class="p">(</span><span class="s1">&#39;P41&#39;</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;wikimedia_image&#39;</span><span class="p">)</span> <span class="c1"># flag</span>
+ <span class="n">add_image</span><span class="p">(</span><span class="s1">&#39;P2716&#39;</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;wikimedia_image&#39;</span><span class="p">)</span> <span class="c1"># collage</span>
+ <span class="n">add_image</span><span class="p">(</span><span class="s1">&#39;P2910&#39;</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">7</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="s1">&#39;wikimedia_image&#39;</span><span class="p">)</span> <span class="c1"># icon</span>
+
+ <span class="k">return</span> <span class="n">attributes</span>
+
+
+<span class="k">class</span> <span class="nc">WDAttribute</span><span class="p">:</span>
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">,)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+
+ <span class="k">def</span> <span class="nf">get_select</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;(group_concat(distinct ?</span><span class="si">{name}</span><span class="s1">;separator=&quot;, &quot;) as ?</span><span class="si">{name}</span><span class="s1">s)&#39;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">get_label_for_entity</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_where</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;OPTIONAL { ?item wdt:</span><span class="si">{name}</span><span class="s2"> ?</span><span class="si">{name}</span><span class="s2"> . }&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_wikibase_label</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">get_group_by</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">get_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span> <span class="c1"># pylint: disable=unused-argument</span>
+ <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;s&#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;&lt;&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;:&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;&gt;&#39;</span>
+
+
+<span class="k">class</span> <span class="nc">WDAmountAttribute</span><span class="p">(</span><span class="n">WDAttribute</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">get_select</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;?</span><span class="si">{name}</span><span class="s1"> ?</span><span class="si">{name}</span><span class="s1">Unit&#39;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_where</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;&quot;&quot; OPTIONAL { ?item p:</span><span class="si">{name}</span><span class="s2"> ?</span><span class="si">{name}</span><span class="s2">Node .</span>
+<span class="s2"> ?</span><span class="si">{name}</span><span class="s2">Node rdf:type wikibase:BestRank ; ps:</span><span class="si">{name}</span><span class="s2"> ?</span><span class="si">{name}</span><span class="s2"> .</span>
+<span class="s2"> OPTIONAL { ?</span><span class="si">{name}</span><span class="s2">Node psv:</span><span class="si">{name}</span><span class="s2">/wikibase:quantityUnit ?</span><span class="si">{name}</span><span class="s2">Unit. } }&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span>
+ <span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_group_by</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">get_select</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">get_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">unit</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;Unit&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">unit</span> <span class="o">=</span> <span class="n">unit</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;http://www.wikidata.org/entity/&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">value</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">get_label_for_entity</span><span class="p">(</span><span class="n">unit</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">value</span>
+
+
+<span class="k">class</span> <span class="nc">WDArticle</span><span class="p">(</span><span class="n">WDAttribute</span><span class="p">):</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="s1">&#39;language&#39;</span><span class="p">,</span> <span class="s1">&#39;kwargs&#39;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">language</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="s1">&#39;wikipedia&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">language</span> <span class="o">=</span> <span class="n">language</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span> <span class="ow">or</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">get_label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="c1"># language parameter is ignored</span>
+ <span class="k">return</span> <span class="s2">&quot;Wikipedia (</span><span class="si">{language}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{language}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_select</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;?article</span><span class="si">{language}</span><span class="s2"> ?articleName</span><span class="si">{language}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{language}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_where</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;&quot;&quot;OPTIONAL { ?article</span><span class="si">{language}</span><span class="s2"> schema:about ?item ;</span>
+<span class="s2"> schema:inLanguage &quot;</span><span class="si">{language}</span><span class="s2">&quot; ;</span>
+<span class="s2"> schema:isPartOf &lt;https://</span><span class="si">{language}</span><span class="s2">.wikipedia.org/&gt; ;</span>
+<span class="s2"> schema:name ?articleName</span><span class="si">{language}</span><span class="s2"> . }&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span>
+ <span class="s1">&#39;</span><span class="si">{language}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">language</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_group_by</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">get_select</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">get_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="s1">&#39;article</span><span class="si">{language}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{language}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">WDLabelAttribute</span><span class="p">(</span><span class="n">WDAttribute</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">get_select</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;(group_concat(distinct ?</span><span class="si">{name}</span><span class="s1">Label;separator=&quot;, &quot;) as ?</span><span class="si">{name}</span><span class="s1">Labels)&#39;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_where</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;OPTIONAL { ?item wdt:</span><span class="si">{name}</span><span class="s2"> ?</span><span class="si">{name}</span><span class="s2"> . }&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_wikibase_label</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;?</span><span class="si">{name}</span><span class="s2"> rdfs:label ?</span><span class="si">{name}</span><span class="s2">Label .&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;Labels&#39;</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">WDURLAttribute</span><span class="p">(</span><span class="n">WDAttribute</span><span class="p">):</span>
+
+ <span class="n">HTTP_WIKIMEDIA_IMAGE</span> <span class="o">=</span> <span class="s1">&#39;http://commons.wikimedia.org/wiki/Special:FilePath/&#39;</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="s1">&#39;url_id&#39;</span><span class="p">,</span> <span class="s1">&#39;kwargs&#39;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">url_id</span> <span class="o">=</span> <span class="n">url_id</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
+
+ <span class="k">def</span> <span class="nf">get_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;s&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_id</span> <span class="ow">and</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">url_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_id</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">WDURLAttribute</span><span class="o">.</span><span class="n">HTTP_WIKIMEDIA_IMAGE</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">WDURLAttribute</span><span class="o">.</span><span class="n">HTTP_WIKIMEDIA_IMAGE</span><span class="p">)</span> <span class="p">:]</span>
+ <span class="n">url_id</span> <span class="o">=</span> <span class="s1">&#39;wikimedia_image&#39;</span>
+ <span class="k">return</span> <span class="n">get_external_url</span><span class="p">(</span><span class="n">url_id</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">value</span>
+
+
+<span class="k">class</span> <span class="nc">WDGeoAttribute</span><span class="p">(</span><span class="n">WDAttribute</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">get_label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;OpenStreetMap&quot;</span>
+
+ <span class="k">def</span> <span class="nf">get_select</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;?</span><span class="si">{name}</span><span class="s2">Lat ?</span><span class="si">{name}</span><span class="s2">Long&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_where</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;&quot;&quot;OPTIONAL { ?item p:</span><span class="si">{name}</span><span class="s2">/psv:</span><span class="si">{name}</span><span class="s2"> [</span>
+<span class="s2"> wikibase:geoLatitude ?</span><span class="si">{name}</span><span class="s2">Lat ;</span>
+<span class="s2"> wikibase:geoLongitude ?</span><span class="si">{name}</span><span class="s2">Long ] }&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span>
+ <span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_group_by</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">get_select</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">get_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="n">latitude</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;Lat&#39;</span><span class="p">)</span>
+ <span class="n">longitude</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;Long&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">latitude</span> <span class="ow">and</span> <span class="n">longitude</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">latitude</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="n">longitude</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="k">def</span> <span class="nf">get_geo_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">osm_zoom</span><span class="o">=</span><span class="mi">19</span><span class="p">):</span>
+ <span class="n">latitude</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;Lat&#39;</span><span class="p">)</span>
+ <span class="n">longitude</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;Long&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">latitude</span> <span class="ow">and</span> <span class="n">longitude</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">get_earth_coordinates_url</span><span class="p">(</span><span class="n">latitude</span><span class="p">,</span> <span class="n">longitude</span><span class="p">,</span> <span class="n">osm_zoom</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">class</span> <span class="nc">WDImageAttribute</span><span class="p">(</span><span class="n">WDURLAttribute</span><span class="p">):</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;priority&#39;</span><span class="p">,)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">url_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">100</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">url_id</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">priority</span> <span class="o">=</span> <span class="n">priority</span>
+
+
+<span class="k">class</span> <span class="nc">WDDateAttribute</span><span class="p">(</span><span class="n">WDAttribute</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">get_select</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;?</span><span class="si">{name}</span><span class="s1"> ?</span><span class="si">{name}</span><span class="s1">timePrecision ?</span><span class="si">{name}</span><span class="s1">timeZone ?</span><span class="si">{name}</span><span class="s1">timeCalendar&#39;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_where</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># To remove duplicate, add</span>
+ <span class="c1"># FILTER NOT EXISTS { ?item p:{name}/psv:{name}/wikibase:timeValue ?{name}bis FILTER (?{name}bis &lt; ?{name}) }</span>
+ <span class="c1"># this filter is too slow, so the response function ignore duplicate results</span>
+ <span class="c1"># (see the seen_entities variable)</span>
+ <span class="k">return</span> <span class="s2">&quot;&quot;&quot;OPTIONAL { ?item p:</span><span class="si">{name}</span><span class="s2">/psv:</span><span class="si">{name}</span><span class="s2"> [</span>
+<span class="s2"> wikibase:timeValue ?</span><span class="si">{name}</span><span class="s2"> ;</span>
+<span class="s2"> wikibase:timePrecision ?</span><span class="si">{name}</span><span class="s2">timePrecision ;</span>
+<span class="s2"> wikibase:timeTimezone ?</span><span class="si">{name}</span><span class="s2">timeZone ;</span>
+<span class="s2"> wikibase:timeCalendarModel ?</span><span class="si">{name}</span><span class="s2">timeCalendar ] . }</span>
+<span class="s2"> hint:Prior hint:rangeSafe true;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span>
+ <span class="s1">&#39;</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_group_by</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">get_select</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">format_8</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">locale</span><span class="p">):</span> <span class="c1"># pylint: disable=unused-argument</span>
+ <span class="c1"># precision: less than a year</span>
+ <span class="k">return</span> <span class="n">value</span>
+
+ <span class="k">def</span> <span class="nf">format_9</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">locale</span><span class="p">):</span>
+ <span class="n">year</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="c1"># precision: year</span>
+ <span class="k">if</span> <span class="n">year</span> <span class="o">&lt;</span> <span class="mi">1584</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">year</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">year</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">year</span><span class="p">)</span>
+ <span class="n">timestamp</span> <span class="o">=</span> <span class="n">isoparse</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">format_date</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s1">&#39;yyyy&#39;</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="k">def</span> <span class="nf">format_10</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">locale</span><span class="p">):</span>
+ <span class="c1"># precision: month</span>
+ <span class="n">timestamp</span> <span class="o">=</span> <span class="n">isoparse</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">format_date</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s1">&#39;MMMM y&#39;</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="k">def</span> <span class="nf">format_11</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">locale</span><span class="p">):</span>
+ <span class="c1"># precision: day</span>
+ <span class="n">timestamp</span> <span class="o">=</span> <span class="n">isoparse</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">format_date</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s1">&#39;full&#39;</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="k">def</span> <span class="nf">format_13</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">locale</span><span class="p">):</span>
+ <span class="n">timestamp</span> <span class="o">=</span> <span class="n">isoparse</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="c1"># precision: minute</span>
+ <span class="k">return</span> <span class="p">(</span>
+ <span class="n">get_datetime_format</span><span class="p">(</span><span class="nb">format</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="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;&#39;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
+ <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">format_time</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="s1">&#39;full&#39;</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="kc">None</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="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{1}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">format_date</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="s1">&#39;short&#39;</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="p">)</span>
+
+ <span class="k">def</span> <span class="nf">format_14</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">locale</span><span class="p">):</span>
+ <span class="c1"># precision: second.</span>
+ <span class="k">return</span> <span class="n">format_datetime</span><span class="p">(</span><span class="n">isoparse</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="nb">format</span><span class="o">=</span><span class="s1">&#39;full&#39;</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="n">DATE_FORMAT</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;0&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">1000000000</span><span class="p">),</span>
+ <span class="s1">&#39;1&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">100000000</span><span class="p">),</span>
+ <span class="s1">&#39;2&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">10000000</span><span class="p">),</span>
+ <span class="s1">&#39;3&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">1000000</span><span class="p">),</span>
+ <span class="s1">&#39;4&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">100000</span><span class="p">),</span>
+ <span class="s1">&#39;5&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">10000</span><span class="p">),</span>
+ <span class="s1">&#39;6&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">1000</span><span class="p">),</span>
+ <span class="s1">&#39;7&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
+ <span class="s1">&#39;8&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_8&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span>
+ <span class="s1">&#39;9&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_9&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="c1"># year</span>
+ <span class="s1">&#39;10&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_10&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="c1"># month</span>
+ <span class="s1">&#39;11&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_11&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="c1"># day</span>
+ <span class="s1">&#39;12&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_13&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="c1"># hour (not supported by babel, display minute)</span>
+ <span class="s1">&#39;13&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_13&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="c1"># minute</span>
+ <span class="s1">&#39;14&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;format_14&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="c1"># second</span>
+ <span class="p">}</span>
+
+ <span class="k">def</span> <span class="nf">get_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span> <span class="ow">or</span> <span class="n">value</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">precision</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">&#39;timePrecision&#39;</span><span class="p">)</span>
+ <span class="n">date_format</span> <span class="o">=</span> <span class="n">WDDateAttribute</span><span class="o">.</span><span class="n">DATE_FORMAT</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">precision</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">date_format</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">format_method</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">date_format</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="n">precision</span> <span class="o">=</span> <span class="n">date_format</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">precision</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">format_method</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="k">return</span> <span class="n">value</span>
+ <span class="k">return</span> <span class="n">value</span>
+
+
+<span class="k">def</span> <span class="nf">debug_explain_wikidata_query</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;GET&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;GET&#39;</span><span class="p">:</span>
+ <span class="n">http_response</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">SPARQL_EXPLAIN_URL</span> <span class="o">+</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">}),</span> <span class="n">headers</span><span class="o">=</span><span class="n">get_headers</span><span class="p">())</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">http_response</span> <span class="o">=</span> <span class="n">post</span><span class="p">(</span><span class="n">SPARQL_EXPLAIN_URL</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">},</span> <span class="n">headers</span><span class="o">=</span><span class="n">get_headers</span><span class="p">())</span>
+ <span class="n">http_response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">http_response</span><span class="o">.</span><span class="n">content</span>
+
+
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="c1"># pylint: disable=unused-argument</span>
+ <span class="c1"># WIKIDATA_PROPERTIES : add unit symbols</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">WIKIDATA_UNITS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">WIKIDATA_PROPERTIES</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="s1">&#39;symbol&#39;</span><span class="p">]</span>
+
+ <span class="c1"># WIKIDATA_PROPERTIES : add property labels</span>
+ <span class="n">wikidata_property_names</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">attribute</span> <span class="ow">in</span> <span class="n">get_attributes</span><span class="p">(</span><span class="s1">&#39;en&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">attribute</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="n">WDAttribute</span><span class="p">,</span> <span class="n">WDAmountAttribute</span><span class="p">,</span> <span class="n">WDURLAttribute</span><span class="p">,</span> <span class="n">WDDateAttribute</span><span class="p">,</span> <span class="n">WDLabelAttribute</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">attribute</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">WIKIDATA_PROPERTIES</span><span class="p">:</span>
+ <span class="n">wikidata_property_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;wd:&quot;</span> <span class="o">+</span> <span class="n">attribute</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">query</span> <span class="o">=</span> <span class="n">QUERY_PROPERTY_NAMES</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%ATTRIBUTES%&#39;</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">wikidata_property_names</span><span class="p">))</span>
+ <span class="n">jsonresponse</span> <span class="o">=</span> <span class="n">send_wikidata_query</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">jsonresponse</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;results&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;bindings&#39;</span><span class="p">,</span> <span class="p">{}):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">][</span><span class="s1">&#39;xml:lang&#39;</span><span class="p">]</span>
+ <span class="n">entity_id</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;item&#39;</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;http://www.wikidata.org/entity/&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">WIKIDATA_PROPERTIES</span><span class="p">[(</span><span class="n">entity_id</span><span class="p">,</span> <span class="n">lang</span><span class="p">)]</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/wikipedia.html#searx.engines.wikidata.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Uses languages evaluated from :py:obj:`wikipedia.fetch_wikimedia_traits</span>
+<span class="sd"> &lt;searx.engines.wikipedia.fetch_wikimedia_traits&gt;` and removes</span>
+
+<span class="sd"> - ``traits.custom[&#39;wiki_netloc&#39;]``: wikidata does not have net-locations for</span>
+<span class="sd"> the languages and the list of all</span>
+
+<span class="sd"> - ``traits.custom[&#39;WIKIPEDIA_LANGUAGES&#39;]``: not used in the wikipedia engine</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">fetch_wikimedia_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">)</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;WIKIPEDIA_LANGUAGES&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/wikipedia.html b/_modules/searx/engines/wikipedia.html
new file mode 100644
index 000000000..8e74d43bb
--- /dev/null
+++ b/_modules/searx/engines/wikipedia.html
@@ -0,0 +1,447 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.wikipedia &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.wikipedia</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.wikipedia</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;This module implements the Wikipedia engine. Some of this implementations</span>
+<span class="sd">are shared by other engines:</span>
+
+<span class="sd">- :ref:`wikidata engine`</span>
+
+<span class="sd">The list of supported languages is :py:obj:`fetched &lt;fetch_wikimedia_traits&gt;` from</span>
+<span class="sd">the article linked by :py:obj:`list_of_wikipedias`.</span>
+
+<span class="sd">Unlike traditional search engines, wikipedia does not support one Wikipedia for</span>
+<span class="sd">all languages, but there is one Wikipedia for each supported language. Some of</span>
+<span class="sd">these Wikipedias have a LanguageConverter_ enabled</span>
+<span class="sd">(:py:obj:`rest_v1_summary_url`).</span>
+
+<span class="sd">A LanguageConverter_ (LC) is a system based on language variants that</span>
+<span class="sd">automatically converts the content of a page into a different variant. A variant</span>
+<span class="sd">is mostly the same language in a different script.</span>
+
+<span class="sd">- `Wikipedias in multiple writing systems`_</span>
+<span class="sd">- `Automatic conversion between traditional and simplified Chinese characters`_</span>
+
+<span class="sd">PR-2554_:</span>
+<span class="sd"> The Wikipedia link returned by the API is still the same in all cases</span>
+<span class="sd"> (`https://zh.wikipedia.org/wiki/出租車`_) but if your browser&#39;s</span>
+<span class="sd"> ``Accept-Language`` is set to any of ``zh``, ``zh-CN``, ``zh-TW``, ``zh-HK``</span>
+<span class="sd"> or .. Wikipedia&#39;s LC automatically returns the desired script in their</span>
+<span class="sd"> web-page.</span>
+
+<span class="sd"> - You can test the API here: https://reqbin.com/gesg2kvx</span>
+
+<span class="sd">.. _https://zh.wikipedia.org/wiki/出租車:</span>
+<span class="sd"> https://zh.wikipedia.org/wiki/%E5%87%BA%E7%A7%9F%E8%BB%8A</span>
+
+<span class="sd">To support Wikipedia&#39;s LanguageConverter_, a SearXNG request to Wikipedia uses</span>
+<span class="sd">:py:obj:`get_wiki_params` and :py:obj:`wiki_lc_locale_variants&#39; in the</span>
+<span class="sd">:py:obj:`fetch_wikimedia_traits` function.</span>
+
+<span class="sd">To test in SearXNG, query for ``!wp 出租車`` with each of the available Chinese</span>
+<span class="sd">options:</span>
+
+<span class="sd">- ``!wp 出租車 :zh`` should show 出租車</span>
+<span class="sd">- ``!wp 出租車 :zh-CN`` should show 出租车</span>
+<span class="sd">- ``!wp 出租車 :zh-TW`` should show 計程車</span>
+<span class="sd">- ``!wp 出租車 :zh-HK`` should show 的士</span>
+<span class="sd">- ``!wp 出租車 :zh-SG`` should show 德士</span>
+
+<span class="sd">.. _LanguageConverter:</span>
+<span class="sd"> https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter</span>
+<span class="sd">.. _Wikipedias in multiple writing systems:</span>
+<span class="sd"> https://meta.wikimedia.org/wiki/Wikipedias_in_multiple_writing_systems</span>
+<span class="sd">.. _Automatic conversion between traditional and simplified Chinese characters:</span>
+<span class="sd"> https://en.wikipedia.org/wiki/Chinese_Wikipedia#Automatic_conversion_between_traditional_and_simplified_Chinese_characters</span>
+<span class="sd">.. _PR-2554: https://github.com/searx/searx/pull/2554</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">urllib.parse</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">utils</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">network</span> <span class="k">as</span> <span class="n">_network</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">locales</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://www.wikipedia.org/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s1">&#39;Q52&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://en.wikipedia.org/api/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;JSON&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">display_type</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;infobox&quot;</span><span class="p">]</span>
+<span class="sd">&quot;&quot;&quot;A list of display types composed from ``infobox`` and ``list``. The latter</span>
+<span class="sd">one will add a hit to the result list. The first one will show a hit in the</span>
+<span class="sd">info box. Both values can be set, or one of the two can be set.&quot;&quot;&quot;</span>
+
+<span class="n">send_accept_language_header</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="sd">&quot;&quot;&quot;The HTTP ``Accept-Language`` header is needed for wikis where</span>
+<span class="sd">LanguageConverter_ is enabled.&quot;&quot;&quot;</span>
+
+<span class="n">list_of_wikipedias</span> <span class="o">=</span> <span class="s1">&#39;https://meta.wikimedia.org/wiki/List_of_Wikipedias&#39;</span>
+<span class="sd">&quot;&quot;&quot;`List of all wikipedias &lt;https://meta.wikimedia.org/wiki/List_of_Wikipedias&gt;`_</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">wikipedia_article_depth</span> <span class="o">=</span> <span class="s1">&#39;https://meta.wikimedia.org/wiki/Wikipedia_article_depth&#39;</span>
+<span class="sd">&quot;&quot;&quot;The *editing depth* of Wikipedia is one of several possible rough indicators</span>
+<span class="sd">of the encyclopedia&#39;s collaborative quality, showing how frequently its articles</span>
+<span class="sd">are updated. The measurement of depth was introduced after some limitations of</span>
+<span class="sd">the classic measurement of article count were realized.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">rest_v1_summary_url</span> <span class="o">=</span> <span class="s1">&#39;https://</span><span class="si">{wiki_netloc}</span><span class="s1">/api/rest_v1/page/summary/</span><span class="si">{title}</span><span class="s1">&#39;</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">`wikipedia rest_v1 summary API`_:</span>
+<span class="sd"> The summary response includes an extract of the first paragraph of the page in</span>
+<span class="sd"> plain text and HTML as well as the type of page. This is useful for page</span>
+<span class="sd"> previews (fka. Hovercards, aka. Popups) on the web and link previews in the</span>
+<span class="sd"> apps.</span>
+
+<span class="sd">HTTP ``Accept-Language`` header (:py:obj:`send_accept_language_header`):</span>
+<span class="sd"> The desired language variant code for wikis where LanguageConverter_ is</span>
+<span class="sd"> enabled.</span>
+
+<span class="sd">.. _wikipedia rest_v1 summary API:</span>
+<span class="sd"> https://en.wikipedia.org/api/rest_v1/#/Page%20content/get_page_summary__title_</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">wiki_lc_locale_variants</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;zh&quot;</span><span class="p">:</span> <span class="p">(</span>
+ <span class="s2">&quot;zh-CN&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh-HK&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh-MO&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh-MY&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh-SG&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh-TW&quot;</span><span class="p">,</span>
+ <span class="p">),</span>
+ <span class="s2">&quot;zh-classical&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;zh-classical&quot;</span><span class="p">,),</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;Mapping rule of the LanguageConverter_ to map a language and its variants to</span>
+<span class="sd">a Locale (used in the HTTP ``Accept-Language`` header). For example see `LC</span>
+<span class="sd">Chinese`_.</span>
+
+<span class="sd">.. _LC Chinese:</span>
+<span class="sd"> https://meta.wikimedia.org/wiki/Wikipedias_in_multiple_writing_systems#Chinese</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">wikipedia_script_variants</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;zh&quot;</span><span class="p">:</span> <span class="p">(</span>
+ <span class="s2">&quot;zh_Hant&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh_Hans&quot;</span><span class="p">,</span>
+ <span class="p">)</span>
+<span class="p">}</span>
+
+
+<div class="viewcode-block" id="get_wiki_params">
+<a class="viewcode-back" href="../../../dev/engines/online/wikipedia.html#searx.engines.wikipedia.get_wiki_params">[docs]</a>
+<span class="k">def</span> <span class="nf">get_wiki_params</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="n">eng_traits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the Wikipedia language tag and the netloc that fits to the</span>
+<span class="sd"> ``sxng_locale``. To support LanguageConverter_ this function rates a locale</span>
+<span class="sd"> (region) higher than a language (compare :py:obj:`wiki_lc_locale_variants`).</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">get_region</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">))</span>
+ <span class="n">wiki_netloc</span> <span class="o">=</span> <span class="n">eng_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">,</span> <span class="s1">&#39;en.wikipedia.org&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">eng_tag</span><span class="p">,</span> <span class="n">wiki_netloc</span></div>
+
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/wikipedia.html#searx.engines.wikipedia.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Assemble a request (`wikipedia rest_v1 summary API`_).&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">query</span><span class="o">.</span><span class="n">islower</span><span class="p">():</span>
+ <span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">title</span><span class="p">()</span>
+
+ <span class="n">_eng_tag</span><span class="p">,</span> <span class="n">wiki_netloc</span> <span class="o">=</span> <span class="n">get_wiki_params</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">],</span> <span class="n">traits</span><span class="p">)</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">quote</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">rest_v1_summary_url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">wiki_netloc</span><span class="o">=</span><span class="n">wiki_netloc</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="n">title</span><span class="p">)</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;soft_max_redirects&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<span class="c1"># get response from search-request</span>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+
+ <span class="n">results</span> <span class="o">=</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">404</span><span class="p">:</span>
+ <span class="k">return</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">400</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">api_result</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="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">if</span> <span class="p">(</span>
+ <span class="n">api_result</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;https://mediawiki.org/wiki/HyperSwitch/errors/bad_request&#39;</span>
+ <span class="ow">and</span> <span class="n">api_result</span><span class="p">[</span><span class="s1">&#39;detail&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;title-invalid-characters&#39;</span>
+ <span class="p">):</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="n">_network</span><span class="o">.</span><span class="n">raise_for_httperror</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="n">api_result</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="n">title</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">html_to_text</span><span class="p">(</span><span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;titles&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;display&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;title&#39;</span><span class="p">))</span>
+ <span class="n">wikipedia_link</span> <span class="o">=</span> <span class="n">api_result</span><span class="p">[</span><span class="s1">&#39;content_urls&#39;</span><span class="p">][</span><span class="s1">&#39;desktop&#39;</span><span class="p">][</span><span class="s1">&#39;page&#39;</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="s2">&quot;list&quot;</span> <span class="ow">in</span> <span class="n">display_type</span> <span class="ow">or</span> <span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="s1">&#39;standard&#39;</span><span class="p">:</span>
+ <span class="c1"># show item in the result list if &#39;list&#39; is in the display options or it</span>
+ <span class="c1"># is a item that can&#39;t be displayed in a infobox.</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">wikipedia_link</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)})</span>
+
+ <span class="k">if</span> <span class="s2">&quot;infobox&quot;</span> <span class="ow">in</span> <span class="n">display_type</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;standard&#39;</span><span class="p">:</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;infobox&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">wikipedia_link</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;extract&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;img_src&#39;</span><span class="p">:</span> <span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;thumbnail&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;source&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;urls&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="s1">&#39;Wikipedia&#39;</span><span class="p">,</span> <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">wikipedia_link</span><span class="p">}],</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="c1"># Nonstandard language codes</span>
+<span class="c1">#</span>
+<span class="c1"># These Wikipedias use language codes that do not conform to the ISO 639</span>
+<span class="c1"># standard (which is how wiki subdomains are chosen nowadays).</span>
+
+<span class="n">lang_map</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">LOCALE_BEST_MATCH</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+<span class="n">lang_map</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;be-tarask&#39;</span><span class="p">:</span> <span class="s1">&#39;bel&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ak&#39;</span><span class="p">:</span> <span class="s1">&#39;aka&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;als&#39;</span><span class="p">:</span> <span class="s1">&#39;gsw&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;bat-smg&#39;</span><span class="p">:</span> <span class="s1">&#39;sgs&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;cbk-zam&#39;</span><span class="p">:</span> <span class="s1">&#39;cbk&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fiu-vro&#39;</span><span class="p">:</span> <span class="s1">&#39;vro&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;map-bms&#39;</span><span class="p">:</span> <span class="s1">&#39;map&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;no&#39;</span><span class="p">:</span> <span class="s1">&#39;nb-NO&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;nrm&#39;</span><span class="p">:</span> <span class="s1">&#39;nrf&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;roa-rup&#39;</span><span class="p">:</span> <span class="s1">&#39;rup&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;nds-nl&#39;</span><span class="p">:</span> <span class="s1">&#39;nds&#39;</span><span class="p">,</span>
+ <span class="c1">#&#39;simple: – invented code used for the Simple English Wikipedia (not the official IETF code en-simple)</span>
+ <span class="s1">&#39;zh-min-nan&#39;</span><span class="p">:</span> <span class="s1">&#39;nan&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;zh-yue&#39;</span><span class="p">:</span> <span class="s1">&#39;yue&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;an&#39;</span><span class="p">:</span> <span class="s1">&#39;arg&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+<span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+ <span class="n">fetch_wikimedia_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WIKIPEDIA_LANGUAGES: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;WIKIPEDIA_LANGUAGES&#39;</span><span class="p">]))</span>
+
+
+<div class="viewcode-block" id="fetch_wikimedia_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/wikipedia.html#searx.engines.wikipedia.fetch_wikimedia_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_wikimedia_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages from Wikipedia. Not all languages from the</span>
+<span class="sd"> :py:obj:`list_of_wikipedias` are supported by SearXNG locales, only those</span>
+<span class="sd"> known from :py:obj:`searx.locales.LOCALE_NAMES` or those with a minimal</span>
+<span class="sd"> :py:obj:`editing depth &lt;wikipedia_article_depth&gt;`.</span>
+
+<span class="sd"> The location of the Wikipedia address of a language is mapped in a</span>
+<span class="sd"> :py:obj:`custom field &lt;searx.enginelib.traits.EngineTraits.custom&gt;`</span>
+<span class="sd"> (``wiki_netloc``). Here is a reduced example:</span>
+
+<span class="sd"> .. code:: python</span>
+
+<span class="sd"> traits.custom[&#39;wiki_netloc&#39;] = {</span>
+<span class="sd"> &quot;en&quot;: &quot;en.wikipedia.org&quot;,</span>
+<span class="sd"> ..</span>
+<span class="sd"> &quot;gsw&quot;: &quot;als.wikipedia.org&quot;,</span>
+<span class="sd"> ..</span>
+<span class="sd"> &quot;zh&quot;: &quot;zh.wikipedia.org&quot;,</span>
+<span class="sd"> &quot;zh-classical&quot;: &quot;zh-classical.wikipedia.org&quot;</span>
+<span class="sd"> }</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-branches</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;WIKIPEDIA_LANGUAGES&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># insert alias to map from a script or region to a wikipedia variant</span>
+
+ <span class="k">for</span> <span class="n">eng_tag</span><span class="p">,</span> <span class="n">sxng_tag_list</span> <span class="ow">in</span> <span class="n">wikipedia_script_variants</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">sxng_tag</span> <span class="ow">in</span> <span class="n">sxng_tag_list</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+ <span class="k">for</span> <span class="n">eng_tag</span><span class="p">,</span> <span class="n">sxng_tag_list</span> <span class="ow">in</span> <span class="n">wiki_lc_locale_variants</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">sxng_tag</span> <span class="ow">in</span> <span class="n">sxng_tag_list</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">regions</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</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">list_of_wikipedias</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from Wikipedia is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//table[contains(@class,&quot;sortable&quot;)]//tbody/tr&#39;</span><span class="p">):</span>
+
+ <span class="n">cols</span> <span class="o">=</span> <span class="n">row</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;./td&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">cols</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">cols</span> <span class="o">=</span> <span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">text_content</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">cols</span><span class="p">]</span>
+
+ <span class="n">depth</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">cols</span><span class="p">[</span><span class="mi">11</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;0&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
+ <span class="n">articles</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">cols</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
+
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">cols</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
+ <span class="n">wiki_url</span> <span class="o">=</span> <span class="n">row</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;./td[4]/a/@href&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">wiki_url</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">wiki_url</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">lang_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">,</span> <span class="n">eng_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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="c1"># print(&quot;ERROR: %s [%s] is unknown by babel&quot; % (cols[0], eng_tag))</span>
+ <span class="k">continue</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;WIKIPEDIA_LANGUAGES&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">sxng_tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">locales</span><span class="o">.</span><span class="n">LOCALE_NAMES</span><span class="p">:</span>
+
+ <span class="k">if</span> <span class="n">articles</span> <span class="o">&lt;</span> <span class="mi">10000</span><span class="p">:</span>
+ <span class="c1"># exclude languages with too few articles</span>
+ <span class="k">continue</span>
+
+ <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">depth</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">20</span><span class="p">:</span>
+ <span class="c1"># Rough indicator of a Wikipedia’s quality, showing how</span>
+ <span class="c1"># frequently its articles are updated.</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">][</span><span class="n">eng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">wiki_url</span><span class="o">.</span><span class="n">netloc</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;WIKIPEDIA_LANGUAGES&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/xpath.html b/_modules/searx/engines/xpath.html
new file mode 100644
index 000000000..de9e521fe
--- /dev/null
+++ b/_modules/searx/engines/xpath.html
@@ -0,0 +1,428 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.xpath &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.xpath</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.xpath</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;The XPath engine is a *generic* engine with which it is possible to configure</span>
+<span class="sd">engines in the settings.</span>
+
+<span class="sd">.. _XPath selector: https://quickref.me/xpath.html#xpath-selectors</span>
+
+<span class="sd">Configuration</span>
+<span class="sd">=============</span>
+
+<span class="sd">Request:</span>
+
+<span class="sd">- :py:obj:`search_url`</span>
+<span class="sd">- :py:obj:`lang_all`</span>
+<span class="sd">- :py:obj:`soft_max_redirects`</span>
+<span class="sd">- :py:obj:`cookies`</span>
+<span class="sd">- :py:obj:`headers`</span>
+
+<span class="sd">Paging:</span>
+
+<span class="sd">- :py:obj:`paging`</span>
+<span class="sd">- :py:obj:`page_size`</span>
+<span class="sd">- :py:obj:`first_page_num`</span>
+
+<span class="sd">Time Range:</span>
+
+<span class="sd">- :py:obj:`time_range_support`</span>
+<span class="sd">- :py:obj:`time_range_url`</span>
+<span class="sd">- :py:obj:`time_range_map`</span>
+
+<span class="sd">Safe-Search:</span>
+
+<span class="sd">- :py:obj:`safe_search_support`</span>
+<span class="sd">- :py:obj:`safe_search_map`</span>
+
+<span class="sd">Response:</span>
+
+<span class="sd">- :py:obj:`no_result_for_http_status`</span>
+
+<span class="sd">`XPath selector`_:</span>
+
+<span class="sd">- :py:obj:`results_xpath`</span>
+<span class="sd">- :py:obj:`url_xpath`</span>
+<span class="sd">- :py:obj:`title_xpath`</span>
+<span class="sd">- :py:obj:`content_xpath`</span>
+<span class="sd">- :py:obj:`thumbnail_xpath`</span>
+<span class="sd">- :py:obj:`suggestion_xpath`</span>
+
+
+<span class="sd">Example</span>
+<span class="sd">=======</span>
+
+<span class="sd">Here is a simple example of a XPath engine configured in the :ref:`settings</span>
+<span class="sd">engine` section, further read :ref:`engines-dev`.</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name : bitbucket</span>
+<span class="sd"> engine : xpath</span>
+<span class="sd"> paging : True</span>
+<span class="sd"> search_url : https://bitbucket.org/repo/all/{pageno}?name={query}</span>
+<span class="sd"> url_xpath : //article[@class=&quot;repo-summary&quot;]//a[@class=&quot;repo-link&quot;]/@href</span>
+<span class="sd"> title_xpath : //article[@class=&quot;repo-summary&quot;]//a[@class=&quot;repo-link&quot;]</span>
+<span class="sd"> content_xpath : //article[@class=&quot;repo-summary&quot;]/p</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlencode</span>
+
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">extract_url</span><span class="p">,</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">eval_xpath_list</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">raise_for_httperror</span>
+
+<span class="n">search_url</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">Search URL of the engine. Example::</span>
+
+<span class="sd"> https://example.org/?search={query}&amp;page={pageno}{time_range}{safe_search}</span>
+
+<span class="sd">Replacements are:</span>
+
+<span class="sd">``{query}``:</span>
+<span class="sd"> Search terms from user.</span>
+
+<span class="sd">``{pageno}``:</span>
+<span class="sd"> Page number if engine supports paging :py:obj:`paging`</span>
+
+<span class="sd">``{lang}``:</span>
+<span class="sd"> ISO 639-1 language code (en, de, fr ..)</span>
+
+<span class="sd">``{time_range}``:</span>
+<span class="sd"> :py:obj:`URL parameter &lt;time_range_url&gt;` if engine :py:obj:`supports time</span>
+<span class="sd"> range &lt;time_range_support&gt;`. The value for the parameter is taken from</span>
+<span class="sd"> :py:obj:`time_range_map`.</span>
+
+<span class="sd">``{safe_search}``:</span>
+<span class="sd"> Safe-search :py:obj:`URL parameter &lt;safe_search_map&gt;` if engine</span>
+<span class="sd"> :py:obj:`supports safe-search &lt;safe_search_support&gt;`. The ``{safe_search}``</span>
+<span class="sd"> replacement is taken from the :py:obj:`safes_search_map`. Filter results::</span>
+
+<span class="sd"> 0: none, 1: moderate, 2:strict</span>
+
+<span class="sd"> If not supported, the URL parameter is an empty string.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">lang_all</span> <span class="o">=</span> <span class="s1">&#39;en&#39;</span>
+<span class="sd">&#39;&#39;&#39;Replacement ``{lang}`` in :py:obj:`search_url` if language ``all`` is</span>
+<span class="sd">selected.</span>
+<span class="sd">&#39;&#39;&#39;</span>
+
+<span class="n">no_result_for_http_status</span> <span class="o">=</span> <span class="p">[]</span>
+<span class="sd">&#39;&#39;&#39;Return empty result for these HTTP status codes instead of throwing an error.</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> no_result_for_http_status: []</span>
+<span class="sd">&#39;&#39;&#39;</span>
+
+<span class="n">soft_max_redirects</span> <span class="o">=</span> <span class="mi">0</span>
+<span class="sd">&#39;&#39;&#39;Maximum redirects, soft limit. Record an error but don&#39;t stop the engine&#39;&#39;&#39;</span>
+
+<span class="n">results_xpath</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="sd">&#39;&#39;&#39;`XPath selector`_ for the list of result items&#39;&#39;&#39;</span>
+
+<span class="n">url_xpath</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="sd">&#39;&#39;&#39;`XPath selector`_ of result&#39;s ``url``.&#39;&#39;&#39;</span>
+
+<span class="n">content_xpath</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="sd">&#39;&#39;&#39;`XPath selector`_ of result&#39;s ``content``.&#39;&#39;&#39;</span>
+
+<span class="n">title_xpath</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="sd">&#39;&#39;&#39;`XPath selector`_ of result&#39;s ``title``.&#39;&#39;&#39;</span>
+
+<span class="n">thumbnail_xpath</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="sd">&#39;&#39;&#39;`XPath selector`_ of result&#39;s ``img_src``.&#39;&#39;&#39;</span>
+
+<span class="n">suggestion_xpath</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="sd">&#39;&#39;&#39;`XPath selector`_ of result&#39;s ``suggestion``.&#39;&#39;&#39;</span>
+
+<span class="n">cached_xpath</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="n">cached_url</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+
+<span class="n">cookies</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="sd">&#39;&#39;&#39;Some engines might offer different result based on cookies.</span>
+<span class="sd">Possible use-case: To set safesearch cookie.&#39;&#39;&#39;</span>
+
+<span class="n">headers</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="sd">&#39;&#39;&#39;Some engines might offer different result based headers. Possible use-case:</span>
+<span class="sd">To set header to moderate.&#39;&#39;&#39;</span>
+
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="sd">&#39;&#39;&#39;Engine supports paging [True or False].&#39;&#39;&#39;</span>
+
+<span class="n">page_size</span> <span class="o">=</span> <span class="mi">1</span>
+<span class="sd">&#39;&#39;&#39;Number of results on each page. Only needed if the site requires not a page</span>
+<span class="sd">number, but an offset.&#39;&#39;&#39;</span>
+
+<span class="n">first_page_num</span> <span class="o">=</span> <span class="mi">1</span>
+<span class="sd">&#39;&#39;&#39;Number of the first page (usually 0 or 1).&#39;&#39;&#39;</span>
+
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="sd">&#39;&#39;&#39;Engine supports search time range.&#39;&#39;&#39;</span>
+
+<span class="n">time_range_url</span> <span class="o">=</span> <span class="s1">&#39;&amp;hours=</span><span class="si">{time_range_val}</span><span class="s1">&#39;</span>
+<span class="sd">&#39;&#39;&#39;Time range URL parameter in the in :py:obj:`search_url`. If no time range is</span>
+<span class="sd">requested by the user, the URL parameter is an empty string. The</span>
+<span class="sd">``{time_range_val}`` replacement is taken from the :py:obj:`time_range_map`.</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> time_range_url : &#39;&amp;days={time_range_val}&#39;</span>
+<span class="sd">&#39;&#39;&#39;</span>
+
+<span class="n">time_range_map</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="mi">24</span><span class="p">,</span>
+ <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">7</span><span class="p">,</span>
+ <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">30</span><span class="p">,</span>
+ <span class="s1">&#39;year&#39;</span><span class="p">:</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">365</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="sd">&#39;&#39;&#39;Maps time range value from user to ``{time_range_val}`` in</span>
+<span class="sd">:py:obj:`time_range_url`.</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> time_range_map:</span>
+<span class="sd"> day: 1</span>
+<span class="sd"> week: 7</span>
+<span class="sd"> month: 30</span>
+<span class="sd"> year: 365</span>
+<span class="sd">&#39;&#39;&#39;</span>
+
+<span class="n">safe_search_support</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="sd">&#39;&#39;&#39;Engine supports safe-search.&#39;&#39;&#39;</span>
+
+<span class="n">safe_search_map</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s1">&#39;&amp;filter=none&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s1">&#39;&amp;filter=moderate&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s1">&#39;&amp;filter=strict&#39;</span><span class="p">}</span>
+<span class="sd">&#39;&#39;&#39;Maps safe-search value to ``{safe_search}`` in :py:obj:`search_url`.</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> safesearch: true</span>
+<span class="sd"> safes_search_map:</span>
+<span class="sd"> 0: &#39;&amp;filter=none&#39;</span>
+<span class="sd"> 1: &#39;&amp;filter=moderate&#39;</span>
+<span class="sd"> 2: &#39;&amp;filter=strict&#39;</span>
+
+<span class="sd">&#39;&#39;&#39;</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/xpath.html#searx.engines.xpath.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&#39;&#39;&#39;Build request parameters (see :ref:`engine request`).&#39;&#39;&#39;</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">lang_all</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;all&#39;</span><span class="p">:</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">][:</span><span class="mi">2</span><span class="p">]</span>
+
+ <span class="n">time_range</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="k">if</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;time_range&#39;</span><span class="p">):</span>
+ <span class="n">time_range_val</span> <span class="o">=</span> <span class="n">time_range_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;time_range&#39;</span><span class="p">))</span>
+ <span class="n">time_range</span> <span class="o">=</span> <span class="n">time_range_url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">time_range_val</span><span class="o">=</span><span class="n">time_range_val</span><span class="p">)</span>
+
+ <span class="n">safe_search</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]:</span>
+ <span class="n">safe_search</span> <span class="o">=</span> <span class="n">safe_search_map</span><span class="p">[</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]]</span>
+
+ <span class="n">fargs</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">})[</span><span class="mi">2</span><span class="p">:],</span>
+ <span class="s1">&#39;lang&#39;</span><span class="p">:</span> <span class="n">lang</span><span class="p">,</span>
+ <span class="s1">&#39;pageno&#39;</span><span class="p">:</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">page_size</span> <span class="o">+</span> <span class="n">first_page_num</span><span class="p">,</span>
+ <span class="s1">&#39;time_range&#39;</span><span class="p">:</span> <span class="n">time_range</span><span class="p">,</span>
+ <span class="s1">&#39;safe_search&#39;</span><span class="p">:</span> <span class="n">safe_search</span><span class="p">,</span>
+ <span class="p">}</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">cookies</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">headers</span><span class="p">)</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">fargs</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;soft_max_redirects&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">soft_max_redirects</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/xpath.html#searx.engines.xpath.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span> <span class="c1"># pylint: disable=too-many-branches</span>
+<span class="w"> </span><span class="sd">&#39;&#39;&#39;Scrap *results* from the response (see :ref:`engine results`).&#39;&#39;&#39;</span>
+ <span class="k">if</span> <span class="n">no_result_for_http_status</span> <span class="ow">and</span> <span class="n">resp</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="n">no_result_for_http_status</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[]</span>
+
+ <span class="n">raise_for_httperror</span><span class="p">(</span><span class="n">resp</span><span class="p">)</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">is_onion</span> <span class="o">=</span> <span class="s1">&#39;onions&#39;</span> <span class="ow">in</span> <span class="n">categories</span>
+
+ <span class="k">if</span> <span class="n">results_xpath</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">results_xpath</span><span class="p">):</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">extract_url</span><span class="p">(</span><span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">url_xpath</span><span class="p">,</span> <span class="n">min_len</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span> <span class="n">search_url</span><span class="p">)</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">title_xpath</span><span class="p">,</span> <span class="n">min_len</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">content_xpath</span><span class="p">))</span>
+ <span class="n">tmp_result</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">}</span>
+
+ <span class="c1"># add thumbnail if available</span>
+ <span class="k">if</span> <span class="n">thumbnail_xpath</span><span class="p">:</span>
+ <span class="n">thumbnail_xpath_result</span> <span class="o">=</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">thumbnail_xpath</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">thumbnail_xpath_result</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">tmp_result</span><span class="p">[</span><span class="s1">&#39;img_src&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">extract_url</span><span class="p">(</span><span class="n">thumbnail_xpath_result</span><span class="p">,</span> <span class="n">search_url</span><span class="p">)</span>
+
+ <span class="c1"># add alternative cached url if available</span>
+ <span class="k">if</span> <span class="n">cached_xpath</span><span class="p">:</span>
+ <span class="n">tmp_result</span><span class="p">[</span><span class="s1">&#39;cached_url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">cached_url</span> <span class="o">+</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">cached_xpath</span><span class="p">,</span> <span class="n">min_len</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="n">is_onion</span><span class="p">:</span>
+ <span class="n">tmp_result</span><span class="p">[</span><span class="s1">&#39;is_onion&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
+
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp_result</span><span class="p">)</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">cached_xpath</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">url</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">cached</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
+ <span class="p">(</span><span class="n">extract_url</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">search_url</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">url_xpath</span><span class="p">)),</span>
+ <span class="nb">map</span><span class="p">(</span><span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">title_xpath</span><span class="p">)),</span>
+ <span class="nb">map</span><span class="p">(</span><span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">content_xpath</span><span class="p">)),</span>
+ <span class="nb">map</span><span class="p">(</span><span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">cached_xpath</span><span class="p">)),</span>
+ <span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span>
+ <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
+ <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
+ <span class="s1">&#39;cached_url&#39;</span><span class="p">:</span> <span class="n">cached_url</span> <span class="o">+</span> <span class="n">cached</span><span class="p">,</span>
+ <span class="s1">&#39;is_onion&#39;</span><span class="p">:</span> <span class="n">is_onion</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">url</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">content</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
+ <span class="p">(</span><span class="n">extract_url</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">search_url</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">url_xpath</span><span class="p">)),</span>
+ <span class="nb">map</span><span class="p">(</span><span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">title_xpath</span><span class="p">)),</span>
+ <span class="nb">map</span><span class="p">(</span><span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">content_xpath</span><span class="p">)),</span>
+ <span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span> <span class="s1">&#39;is_onion&#39;</span><span class="p">:</span> <span class="n">is_onion</span><span class="p">})</span>
+
+ <span class="k">if</span> <span class="n">suggestion_xpath</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">suggestion</span> <span class="ow">in</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="n">suggestion_xpath</span><span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;suggestion&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">suggestion</span><span class="p">)})</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;found </span><span class="si">%s</span><span class="s2"> results&quot;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">results</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/yahoo.html b/_modules/searx/engines/yahoo.html
new file mode 100644
index 000000000..6c21a1abd
--- /dev/null
+++ b/_modules/searx/engines/yahoo.html
@@ -0,0 +1,307 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.yahoo &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.yahoo</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.yahoo</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;Yahoo Search (Web)</span>
+
+<span class="sd">Languages are supported by mapping the language to a domain. If domain is not</span>
+<span class="sd">found in :py:obj:`lang2domain` URL ``&lt;lang&gt;.search.yahoo.com`` is used.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">unquote</span><span class="p">,</span>
+ <span class="n">urlencode</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">eval_xpath_getindex</span><span class="p">,</span>
+ <span class="n">eval_xpath_list</span><span class="p">,</span>
+ <span class="n">extract_text</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+
+<span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s1">&#39;https://search.yahoo.com/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="s1">&#39;https://developer.yahoo.com/api/&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s1">&#39;HTML&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">,</span> <span class="s1">&#39;web&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">time_range_support</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="c1"># send_accept_language_header = True</span>
+
+<span class="n">time_range_dict</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;day&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;1d&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;week&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;1w&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;month&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;1m&#39;</span><span class="p">,</span> <span class="s1">&#39;m&#39;</span><span class="p">),</span>
+<span class="p">}</span>
+
+<span class="n">lang2domain</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;zh_chs&#39;</span><span class="p">:</span> <span class="s1">&#39;hk.search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;zh_cht&#39;</span><span class="p">:</span> <span class="s1">&#39;tw.search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;any&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;en&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;bg&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;cs&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;da&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;el&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;et&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;he&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;hr&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ja&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ko&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;sk&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;sl&#39;</span><span class="p">:</span> <span class="s1">&#39;search.yahoo.com&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;Map language to domain&quot;&quot;&quot;</span>
+
+<span class="n">locale_aliases</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;zh&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_Hans&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;zh-HK&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_Hans&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;zh-CN&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_Hans&#39;</span><span class="p">,</span> <span class="c1"># dead since 2015 / routed to hk.search.yahoo.com</span>
+ <span class="s1">&#39;zh-TW&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_Hant&#39;</span><span class="p">,</span>
+<span class="p">}</span>
+
+
+<div class="viewcode-block" id="request">
+<a class="viewcode-back" href="../../../dev/engines/online/yahoo.html#searx.engines.yahoo.request">[docs]</a>
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;build request&quot;&quot;&quot;</span>
+
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">locale_aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">lang</span><span class="p">:</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">lang</span><span class="p">,</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span>
+
+ <span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">7</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">age</span><span class="p">,</span> <span class="n">btf</span> <span class="o">=</span> <span class="n">time_range_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">],</span> <span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
+
+ <span class="n">args</span> <span class="o">=</span> <span class="n">urlencode</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s1">&#39;p&#39;</span><span class="p">:</span> <span class="n">query</span><span class="p">,</span>
+ <span class="s1">&#39;ei&#39;</span><span class="p">:</span> <span class="s1">&#39;UTF-8&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fl&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="s1">&#39;vl&#39;</span><span class="p">:</span> <span class="s1">&#39;lang_&#39;</span> <span class="o">+</span> <span class="n">lang</span><span class="p">,</span>
+ <span class="s1">&#39;btf&#39;</span><span class="p">:</span> <span class="n">btf</span><span class="p">,</span>
+ <span class="s1">&#39;fr2&#39;</span><span class="p">:</span> <span class="s1">&#39;time&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;age&#39;</span><span class="p">:</span> <span class="n">age</span><span class="p">,</span>
+ <span class="s1">&#39;b&#39;</span><span class="p">:</span> <span class="n">offset</span><span class="p">,</span>
+ <span class="s1">&#39;xargs&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">)</span>
+
+ <span class="n">domain</span> <span class="o">=</span> <span class="n">lang2domain</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">lang</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">.search.yahoo.com&#39;</span> <span class="o">%</span> <span class="n">lang</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;https://</span><span class="si">%s</span><span class="s1">/search?</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">domain</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+
+<div class="viewcode-block" id="parse_url">
+<a class="viewcode-back" href="../../../dev/engines/online/yahoo.html#searx.engines.yahoo.parse_url">[docs]</a>
+<span class="k">def</span> <span class="nf">parse_url</span><span class="p">(</span><span class="n">url_string</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;remove yahoo-specific tracking-url&quot;&quot;&quot;</span>
+
+ <span class="n">endings</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;/RS&#39;</span><span class="p">,</span> <span class="s1">&#39;/RK&#39;</span><span class="p">]</span>
+ <span class="n">endpositions</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">start</span> <span class="o">=</span> <span class="n">url_string</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="n">url_string</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;/RU=&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">ending</span> <span class="ow">in</span> <span class="n">endings</span><span class="p">:</span>
+ <span class="n">endpos</span> <span class="o">=</span> <span class="n">url_string</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="n">ending</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">endpos</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
+ <span class="n">endpositions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">endpos</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">start</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">endpositions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">url_string</span>
+
+ <span class="n">end</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">endpositions</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">unquote</span><span class="p">(</span><span class="n">url_string</span><span class="p">[</span><span class="n">start</span><span class="p">:</span><span class="n">end</span><span class="p">])</span></div>
+
+
+
+<div class="viewcode-block" id="response">
+<a class="viewcode-back" href="../../../dev/engines/online/yahoo.html#searx.engines.yahoo.response">[docs]</a>
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;parse response&quot;&quot;&quot;</span>
+
+ <span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="c1"># parse results</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[contains(@class,&quot;algo-sr&quot;)]&#39;</span><span class="p">):</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//h3/a/@href&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">url</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">parse_url</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+
+ <span class="n">title</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//h3//a/@aria-label&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">title</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">eval_xpath_getindex</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;compText&quot;)]&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">content</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">allow_none</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+
+ <span class="c1"># append result</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="n">url</span><span class="p">,</span> <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="n">content</span><span class="p">})</span>
+
+ <span class="k">for</span> <span class="n">suggestion</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[contains(@class, &quot;AlsoTry&quot;)]//table//a&#39;</span><span class="p">):</span>
+ <span class="c1"># append suggestion</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;suggestion&#39;</span><span class="p">:</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">suggestion</span><span class="p">)})</span>
+
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/yahoo.html#searx.engines.yahoo.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages from yahoo&quot;&quot;&quot;</span>
+
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+ <span class="kn">import</span> <span class="nn">babel</span>
+ <span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">network</span>
+ <span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="s1">&#39;any&#39;</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="s1">&#39;https://search.yahoo.com/preferences/languages&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: response from yahoo is not OK.&quot;</span><span class="p">)</span>
+
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">offset</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="s1">&#39;lang_&#39;</span><span class="p">)</span>
+
+ <span class="n">eng2sxng</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;zh_chs&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_Hans&#39;</span><span class="p">,</span> <span class="s1">&#39;zh_cht&#39;</span><span class="p">:</span> <span class="s1">&#39;zh_Hant&#39;</span><span class="p">}</span>
+
+ <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s1">&#39;//div[contains(@class, &quot;lang-item&quot;)]/input/@value&#39;</span><span class="p">):</span>
+ <span class="n">eng_tag</span> <span class="o">=</span> <span class="n">val</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">language_tag</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">parse</span><span class="p">(</span><span class="n">eng2sxng</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">eng_tag</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">)))</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="nb">print</span><span class="p">(</span><span class="s1">&#39;ERROR: unknown language --&gt; </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">eng_tag</span><span class="p">)</span>
+ <span class="k">continue</span>
+
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_tag</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_tag</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_tag</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_tag</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/engines/zlibrary.html b/_modules/searx/engines/zlibrary.html
new file mode 100644
index 000000000..b502489d9
--- /dev/null
+++ b/_modules/searx/engines/zlibrary.html
@@ -0,0 +1,340 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.engines.zlibrary &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../engines.html" accesskey="U">searx.engines</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.engines.zlibrary</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.engines.zlibrary</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;`Z-Library`_ (abbreviated as z-lib, formerly BookFinder) is a shadow library</span>
+<span class="sd">project for file-sharing access to scholarly journal articles, academic texts</span>
+<span class="sd">and general-interest books. It began as a mirror of Library Genesis, from which</span>
+<span class="sd">most of its books originate.</span>
+
+<span class="sd">.. _Z-Library: https://zlibrary-global.se/</span>
+
+<span class="sd">Configuration</span>
+<span class="sd">=============</span>
+
+<span class="sd">The engine has the following additional settings:</span>
+
+<span class="sd">- :py:obj:`zlib_year_from`</span>
+<span class="sd">- :py:obj:`zlib_year_to`</span>
+<span class="sd">- :py:obj:`zlib_ext`</span>
+
+<span class="sd">With this options a SearXNG maintainer is able to configure **additional**</span>
+<span class="sd">engines for specific searches in Z-Library. For example a engine to search</span>
+<span class="sd">only for EPUB from 2010 to 2020.</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> - name: z-library 2010s epub</span>
+<span class="sd"> engine: zlibrary</span>
+<span class="sd"> shortcut: zlib2010s</span>
+<span class="sd"> zlib_year_from: &#39;2010&#39;</span>
+<span class="sd"> zlib_year_to: &#39;2020&#39;</span>
+<span class="sd"> zlib_ext: &#39;EPUB&#39;</span>
+
+<span class="sd">Implementations</span>
+<span class="sd">===============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Optional</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">quote</span>
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+<span class="kn">from</span> <span class="nn">flask_babel</span> <span class="kn">import</span> <span class="n">gettext</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">eval_xpath</span><span class="p">,</span> <span class="n">eval_xpath_list</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraits</span>
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">ENGINE_TRAITS</span>
+
+<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">httpx</span>
+ <span class="kn">import</span> <span class="nn">logging</span>
+
+ <span class="n">logger</span><span class="p">:</span> <span class="n">logging</span><span class="o">.</span><span class="n">Logger</span>
+
+<span class="c1"># about</span>
+<span class="n">about</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;website&quot;</span><span class="p">:</span> <span class="s2">&quot;https://zlibrary-global.se&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;wikidata_id&quot;</span><span class="p">:</span> <span class="s2">&quot;Q104863992&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;official_api_documentation&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="s2">&quot;use_official_api&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;require_api_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="s2">&quot;HTML&quot;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">categories</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;files&quot;</span><span class="p">]</span>
+<span class="n">paging</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">base_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;https://zlibrary-global.se&quot;</span>
+
+<span class="n">zlib_year_from</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+<span class="sd">&quot;&quot;&quot;Filter z-library&#39;s results by year from. E.g &#39;2010&#39;.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">zlib_year_to</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+<span class="sd">&quot;&quot;&quot;Filter z-library&#39;s results by year to. E.g. &#39;2010&#39;.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">zlib_ext</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+<span class="sd">&quot;&quot;&quot;Filter z-library&#39;s results by a file ending. Common filters for example are</span>
+<span class="sd">``PDF`` and ``EPUB``.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="init">
+<a class="viewcode-back" href="../../../dev/engines/online/zlibrary.html#searx.engines.zlibrary.init">[docs]</a>
+<span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="n">engine_settings</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># pylint: disable=unused-argument</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Check of engine&#39;s settings.&quot;&quot;&quot;</span>
+ <span class="n">traits</span><span class="p">:</span> <span class="n">EngineTraits</span> <span class="o">=</span> <span class="n">EngineTraits</span><span class="p">(</span><span class="o">**</span><span class="n">ENGINE_TRAITS</span><span class="p">[</span><span class="s2">&quot;z-library&quot;</span><span class="p">])</span>
+
+ <span class="k">if</span> <span class="n">zlib_ext</span> <span class="ow">and</span> <span class="n">zlib_ext</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;ext&quot;</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 setting ext: </span><span class="si">{</span><span class="n">zlib_ext</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">zlib_year_from</span> <span class="ow">and</span> <span class="n">zlib_year_from</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;year_from&quot;</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 setting year_from: </span><span class="si">{</span><span class="n">zlib_year_from</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">zlib_year_to</span> <span class="ow">and</span> <span class="n">zlib_year_to</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;year_to&quot;</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 setting year_to: </span><span class="si">{</span><span class="n">zlib_year_to</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">params</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
+ <span class="n">lang</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;language&quot;</span><span class="p">],</span> <span class="n">traits</span><span class="o">.</span><span class="n">all_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="n">search_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">base_url</span>
+ <span class="o">+</span> <span class="s2">&quot;/s/</span><span class="si">{search_query}</span><span class="s2">/?page=</span><span class="si">{pageno}</span><span class="s2">&quot;</span>
+ <span class="o">+</span> <span class="s2">&quot;&amp;yearFrom=</span><span class="si">{zlib_year_from}</span><span class="s2">&quot;</span>
+ <span class="o">+</span> <span class="s2">&quot;&amp;yearTo=</span><span class="si">{zlib_year_to}</span><span class="s2">&quot;</span>
+ <span class="o">+</span> <span class="s2">&quot;&amp;languages[]=</span><span class="si">{lang}</span><span class="s2">&quot;</span>
+ <span class="o">+</span> <span class="s2">&quot;&amp;extensions[]=</span><span class="si">{zlib_ext}</span><span class="s2">&quot;</span>
+ <span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">search_query</span><span class="o">=</span><span class="n">quote</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
+ <span class="n">pageno</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;pageno&quot;</span><span class="p">],</span>
+ <span class="n">lang</span><span class="o">=</span><span class="n">lang</span><span class="p">,</span>
+ <span class="n">zlib_year_from</span><span class="o">=</span><span class="n">zlib_year_from</span><span class="p">,</span>
+ <span class="n">zlib_year_to</span><span class="o">=</span><span class="n">zlib_year_to</span><span class="p">,</span>
+ <span class="n">zlib_ext</span><span class="o">=</span><span class="n">zlib_ext</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">params</span>
+
+
+<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">resp</span><span class="p">:</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Response</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
+ <span class="n">results</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dom</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;//div[@id=&quot;searchResultBox&quot;]//div[contains(@class, &quot;resItemBox&quot;)]&#39;</span><span class="p">):</span>
+ <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_parse_result</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
+
+ <span class="k">return</span> <span class="n">results</span>
+
+
+<span class="k">def</span> <span class="nf">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">selector</span><span class="p">:</span> <span class="nb">str</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="k">return</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">eval_xpath</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">selector</span><span class="p">))</span>
+
+
+<span class="n">i18n_language</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Language&quot;</span><span class="p">)</span>
+<span class="n">i18n_book_rating</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Book rating&quot;</span><span class="p">)</span>
+<span class="n">i18n_file_quality</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;File quality&quot;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">_parse_result</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
+
+ <span class="n">author_elements</span> <span class="o">=</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//div[@class=&quot;authors&quot;]//a[@itemprop=&quot;author&quot;]&#39;</span><span class="p">)</span>
+
+ <span class="n">result</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;template&quot;</span><span class="p">:</span> <span class="s2">&quot;paper.html&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">base_url</span> <span class="o">+</span> <span class="n">item</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;(.//a[starts-with(@href, &quot;/book/&quot;)])[1]/@href&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span>
+ <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//*[@itemprop=&quot;name&quot;]&#39;</span><span class="p">),</span>
+ <span class="s2">&quot;authors&quot;</span><span class="p">:</span> <span class="p">[</span><span class="n">extract_text</span><span class="p">(</span><span class="n">author</span><span class="p">)</span> <span class="k">for</span> <span class="n">author</span> <span class="ow">in</span> <span class="n">author_elements</span><span class="p">],</span>
+ <span class="s2">&quot;publisher&quot;</span><span class="p">:</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//a[@title=&quot;Publisher&quot;]&#39;</span><span class="p">),</span>
+ <span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;property__file&quot;)]//div[contains(@class, &quot;property_value&quot;)]&#39;</span><span class="p">),</span>
+ <span class="s2">&quot;img_src&quot;</span><span class="p">:</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//img[contains(@class, &quot;cover&quot;)]/@data-src&#39;</span><span class="p">),</span>
+ <span class="p">}</span>
+
+ <span class="n">year</span> <span class="o">=</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;property_year&quot;)]//div[contains(@class, &quot;property_value&quot;)]&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">year</span><span class="p">:</span>
+ <span class="n">result</span><span class="p">[</span><span class="s2">&quot;publishedDate&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="s1">&#39;%Y&#39;</span><span class="p">)</span>
+
+ <span class="n">content</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">language</span> <span class="o">=</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//div[contains(@class, &quot;property_language&quot;)]//div[contains(@class, &quot;property_value&quot;)]&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">language</span><span class="p">:</span>
+ <span class="n">content</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">i18n_language</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">language</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="n">book_rating</span> <span class="o">=</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//span[contains(@class, &quot;book-rating-interest-score&quot;)]&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">book_rating</span> <span class="ow">and</span> <span class="nb">float</span><span class="p">(</span><span class="n">book_rating</span><span class="p">):</span>
+ <span class="n">content</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">i18n_book_rating</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">book_rating</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="n">file_quality</span> <span class="o">=</span> <span class="n">_text</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s1">&#39;.//span[contains(@class, &quot;book-rating-quality-score&quot;)]&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">file_quality</span> <span class="ow">and</span> <span class="nb">float</span><span class="p">(</span><span class="n">file_quality</span><span class="p">):</span>
+ <span class="n">content</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">i18n_file_quality</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">file_quality</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="n">result</span><span class="p">[</span><span class="s2">&quot;content&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot; | &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">result</span>
+
+
+<div class="viewcode-block" id="fetch_traits">
+<a class="viewcode-back" href="../../../dev/engines/online/zlibrary.html#searx.engines.zlibrary.fetch_traits">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits</span><span class="p">(</span><span class="n">engine_traits</span><span class="p">:</span> <span class="n">EngineTraits</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetch languages and other search arguments from zlibrary&#39;s search form.&quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=import-outside-toplevel</span>
+
+ <span class="kn">import</span> <span class="nn">babel</span>
+ <span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get</span> <span class="c1"># see https://github.com/searxng/searxng/issues/762</span>
+ <span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">language_tag</span>
+
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">all_locale</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;ext&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;year_from&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;year_to&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="n">base_url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">resp</span><span class="o">.</span><span class="n">ok</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Response from zlibrary&#39;s search page is not OK.&quot;</span><span class="p">)</span>
+ <span class="n">dom</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+
+ <span class="k">for</span> <span class="n">year</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//div[@id=&#39;advSearch-noJS&#39;]//select[@id=&#39;sf_yearFrom&#39;]/option&quot;</span><span class="p">):</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;year_from&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">year</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">))</span>
+
+ <span class="k">for</span> <span class="n">year</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//div[@id=&#39;advSearch-noJS&#39;]//select[@id=&#39;sf_yearTo&#39;]/option&quot;</span><span class="p">):</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;year_to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">year</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">))</span>
+
+ <span class="k">for</span> <span class="n">ext</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//div[@id=&#39;advSearch-noJS&#39;]//select[@id=&#39;sf_extensions&#39;]/option&quot;</span><span class="p">):</span>
+ <span class="n">value</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="n">ext</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s2">&quot;ext&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="c1"># Handle languages</span>
+ <span class="c1"># Z-library uses English names for languages, so we need to map them to their respective locales</span>
+ <span class="n">language_name_locale_map</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">locale</span> <span class="ow">in</span> <span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">localedata</span><span class="o">.</span><span class="n">locale_identifiers</span><span class="p">():</span> <span class="c1"># type: ignore</span>
+ <span class="c1"># Create a Locale object for the current locale</span>
+ <span class="n">loc</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">locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">loc</span><span class="o">.</span><span class="n">english_name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">language_name_locale_map</span><span class="p">[</span><span class="n">loc</span><span class="o">.</span><span class="n">english_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">loc</span> <span class="c1"># type: ignore</span>
+
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">dom</span><span class="p">,</span> <span class="s2">&quot;//div[@id=&#39;advSearch-noJS&#39;]//select[@id=&#39;sf_languages&#39;]/option&quot;</span><span class="p">):</span>
+ <span class="n">eng_lang</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;value&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">eng_lang</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">language_name_locale_map</span><span class="p">[</span><span class="n">eng_lang</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="c1"># silently ignore unknown languages</span>
+ <span class="c1"># print(&quot;ERROR: %s is unknown by babel&quot; % (eng_lang))</span>
+ <span class="k">continue</span>
+ <span class="n">sxng_lang</span> <span class="o">=</span> <span class="n">language_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)</span>
+ <span class="n">conflict</span> <span class="o">=</span> <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_lang</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">conflict</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">conflict</span> <span class="o">!=</span> <span class="n">eng_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;CONFLICT: babel </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sxng_lang</span><span class="p">,</span> <span class="n">conflict</span><span class="p">,</span> <span class="n">eng_lang</span><span class="p">))</span>
+ <span class="k">continue</span>
+ <span class="n">engine_traits</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="n">sxng_lang</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_lang</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../engines.html">searx.engines</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/exceptions.html b/_modules/searx/exceptions.html
new file mode 100644
index 000000000..becaa93b4
--- /dev/null
+++ b/_modules/searx/exceptions.html
@@ -0,0 +1,257 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.exceptions &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.exceptions</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.exceptions</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;Exception types raised by SearXNG modules.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span>
+
+
+<div class="viewcode-block" id="SearxException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Base SearXNG exception.&quot;&quot;&quot;</span></div>
+
+
+
+<div class="viewcode-block" id="SearxParameterException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxParameterException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxParameterException</span><span class="p">(</span><span class="n">SearxException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Raised when query miss a required parameter&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span> <span class="ow">or</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">message</span> <span class="o">=</span> <span class="s1">&#39;Empty &#39;</span> <span class="o">+</span> <span class="n">name</span> <span class="o">+</span> <span class="s1">&#39; parameter&#39;</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">message</span> <span class="o">=</span> <span class="s1">&#39;Invalid value &quot;&#39;</span> <span class="o">+</span> <span class="n">value</span> <span class="o">+</span> <span class="s1">&#39;&quot; for parameter &#39;</span> <span class="o">+</span> <span class="n">name</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">parameter_name</span> <span class="o">=</span> <span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">parameter_value</span> <span class="o">=</span> <span class="n">value</span></div>
+
+
+
+<div class="viewcode-block" id="SearxSettingsException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxSettingsException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxSettingsException</span><span class="p">(</span><span class="n">SearxException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Error while loading the settings&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">],</span> <span class="n">filename</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span></div>
+
+
+
+<div class="viewcode-block" id="SearxEngineException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxEngineException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxEngineException</span><span class="p">(</span><span class="n">SearxException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Error inside an engine&quot;&quot;&quot;</span></div>
+
+
+
+<div class="viewcode-block" id="SearxXPathSyntaxException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxXPathSyntaxException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxXPathSyntaxException</span><span class="p">(</span><span class="n">SearxEngineException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Syntax error in a XPATH&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xpath_spec</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">message</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
+ <span class="c1"># str(xpath_spec) to deal with str and XPath instance</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">xpath_str</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="SearxEngineResponseException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxEngineResponseException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxEngineResponseException</span><span class="p">(</span><span class="n">SearxEngineException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Impossible to parse the result of an engine&quot;&quot;&quot;</span></div>
+
+
+
+<div class="viewcode-block" id="SearxEngineAPIException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxEngineAPIException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxEngineAPIException</span><span class="p">(</span><span class="n">SearxEngineResponseException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;The website has returned an application error&quot;&quot;&quot;</span></div>
+
+
+
+<div class="viewcode-block" id="SearxEngineAccessDeniedException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxEngineAccessDeniedException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxEngineAccessDeniedException</span><span class="p">(</span><span class="n">SearxEngineResponseException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;The website is blocking the access&quot;&quot;&quot;</span>
+
+ <span class="n">SUSPEND_TIME_SETTING</span> <span class="o">=</span> <span class="s2">&quot;search.suspended_times.SearxEngineAccessDenied&quot;</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;This settings contains the default suspended time (default 86400 sec / 1</span>
+<span class="sd"> day).&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">suspended_time</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;Access denied&#39;</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic exception to raise when an engine denies access to the results.</span>
+
+<span class="sd"> :param suspended_time: How long the engine is going to be suspended in</span>
+<span class="sd"> second. Defaults to None.</span>
+<span class="sd"> :type suspended_time: int, None</span>
+<span class="sd"> :param message: Internal message. Defaults to ``Access denied``</span>
+<span class="sd"> :type message: str</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">suspended_time</span> <span class="o">=</span> <span class="n">suspended_time</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_suspended_time</span><span class="p">()</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">message</span> <span class="o">+</span> <span class="s1">&#39;, suspended_time=&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">suspended_time</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspended_time</span> <span class="o">=</span> <span class="n">suspended_time</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
+
+ <span class="k">def</span> <span class="nf">_get_default_suspended_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">get_setting</span> <span class="c1"># pylint: disable=C0415</span>
+
+ <span class="k">return</span> <span class="n">get_setting</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">SUSPEND_TIME_SETTING</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="SearxEngineCaptchaException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxEngineCaptchaException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxEngineCaptchaException</span><span class="p">(</span><span class="n">SearxEngineAccessDeniedException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;The website has returned a CAPTCHA.&quot;&quot;&quot;</span>
+
+ <span class="n">SUSPEND_TIME_SETTING</span> <span class="o">=</span> <span class="s2">&quot;search.suspended_times.SearxEngineCaptcha&quot;</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;This settings contains the default suspended time (default 86400 sec / 1</span>
+<span class="sd"> day).&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">suspended_time</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">&#39;CAPTCHA&#39;</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span> <span class="n">suspended_time</span><span class="o">=</span><span class="n">suspended_time</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="SearxEngineTooManyRequestsException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxEngineTooManyRequestsException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxEngineTooManyRequestsException</span><span class="p">(</span><span class="n">SearxEngineAccessDeniedException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;The website has returned a Too Many Request status code</span>
+
+<span class="sd"> By default, searx stops sending requests to this engine for 1 hour.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">SUSPEND_TIME_SETTING</span> <span class="o">=</span> <span class="s2">&quot;search.suspended_times.SearxEngineTooManyRequests&quot;</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;This settings contains the default suspended time (default 3660 sec / 1</span>
+<span class="sd"> hour).&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">suspended_time</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">&#39;Too many request&#39;</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">,</span> <span class="n">suspended_time</span><span class="o">=</span><span class="n">suspended_time</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="SearxEngineXPathException">
+<a class="viewcode-back" href="../../src/searx.exceptions.html#searx.exceptions.SearxEngineXPathException">[docs]</a>
+<span class="k">class</span> <span class="nc">SearxEngineXPathException</span><span class="p">(</span><span class="n">SearxEngineResponseException</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Error while getting the result of an XPath expression&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xpath_spec</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">message</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
+ <span class="c1"># str(xpath_spec) to deal with str and XPath instance</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">xpath_str</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">)</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/infopage.html b/_modules/searx/infopage.html
new file mode 100644
index 000000000..627ee79a5
--- /dev/null
+++ b/_modules/searx/infopage.html
@@ -0,0 +1,308 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.infopage &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.infopage</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.infopage</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;Render SearXNG instance documentation.</span>
+
+<span class="sd">Usage in a Flask app route:</span>
+
+<span class="sd">.. code:: python</span>
+
+<span class="sd"> from searx import infopage</span>
+
+<span class="sd"> _INFO_PAGES = infopage.InfoPageSet(infopage.MistletoePage)</span>
+
+<span class="sd"> @app.route(&#39;/info/&lt;pagename&gt;&#39;, methods=[&#39;GET&#39;])</span>
+<span class="sd"> def info(pagename):</span>
+
+<span class="sd"> locale = request.preferences.get_value(&#39;locale&#39;)</span>
+<span class="sd"> page = _INFO_PAGES.get_page(pagename, locale)</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;InfoPage&#39;</span><span class="p">,</span> <span class="s1">&#39;InfoPageSet&#39;</span><span class="p">]</span>
+
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="kn">import</span> <span class="nn">os.path</span>
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">typing</span>
+
+<span class="kn">import</span> <span class="nn">urllib.parse</span>
+<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">cached_property</span>
+<span class="kn">import</span> <span class="nn">jinja2</span>
+<span class="kn">from</span> <span class="nn">flask.helpers</span> <span class="kn">import</span> <span class="n">url_for</span>
+<span class="kn">from</span> <span class="nn">markdown_it</span> <span class="kn">import</span> <span class="n">MarkdownIt</span>
+
+<span class="kn">from</span> <span class="nn">..</span> <span class="kn">import</span> <span class="n">get_setting</span>
+<span class="kn">from</span> <span class="nn">..version</span> <span class="kn">import</span> <span class="n">GIT_URL</span>
+<span class="kn">from</span> <span class="nn">..locales</span> <span class="kn">import</span> <span class="n">LOCALE_NAMES</span>
+
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;searx.infopage&#39;</span><span class="p">)</span>
+<span class="n">_INFO_FOLDER</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))</span>
+
+
+<div class="viewcode-block" id="InfoPage">
+<a class="viewcode-back" href="../../src/searx.infopage.html#searx.infopage.InfoPage">[docs]</a>
+<span class="k">class</span> <span class="nc">InfoPage</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;A page of the :py:obj:`online documentation &lt;InfoPageSet&gt;`.&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fname</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fname</span> <span class="o">=</span> <span class="n">fname</span>
+
+ <span class="nd">@cached_property</span>
+ <span class="k">def</span> <span class="nf">raw_content</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Raw content of the page (without any jinja rendering)&quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fname</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+ <span class="nd">@cached_property</span>
+ <span class="k">def</span> <span class="nf">content</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Content of the page (rendered in a Jinja context)&quot;&quot;&quot;</span>
+ <span class="n">ctx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_ctx</span><span class="p">()</span>
+ <span class="n">template</span> <span class="o">=</span> <span class="n">jinja2</span><span class="o">.</span><span class="n">Environment</span><span class="p">()</span><span class="o">.</span><span class="n">from_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">raw_content</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">ctx</span><span class="p">)</span>
+
+ <span class="nd">@cached_property</span>
+ <span class="k">def</span> <span class="nf">title</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Title of the content (without any markup)&quot;&quot;&quot;</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_content</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">l</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;# &#39;</span><span class="p">):</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;# &#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">t</span>
+
+ <span class="nd">@cached_property</span>
+ <span class="k">def</span> <span class="nf">html</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Render Markdown (CommonMark_) to HTML by using markdown-it-py_.</span>
+
+<span class="sd"> .. _CommonMark: https://commonmark.org/</span>
+<span class="sd"> .. _markdown-it-py: https://github.com/executablebooks/markdown-it-py</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="p">(</span>
+ <span class="n">MarkdownIt</span><span class="p">(</span><span class="s2">&quot;commonmark&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;typographer&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span><span class="o">.</span><span class="n">enable</span><span class="p">([</span><span class="s2">&quot;replacements&quot;</span><span class="p">,</span> <span class="s2">&quot;smartquotes&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
+ <span class="p">)</span>
+
+<div class="viewcode-block" id="InfoPage.get_ctx">
+<a class="viewcode-back" href="../../src/searx.infopage.html#searx.infopage.InfoPage.get_ctx">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_ctx</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Jinja context to render :py:obj:`InfoPage.content`&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">_md_link</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">url_for</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">_external</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="k">return</span> <span class="s2">&quot;[</span><span class="si">%s</span><span class="s2">](</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_md_search</span><span class="p">(</span><span class="n">query</span><span class="p">):</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">?q=</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s1">&#39;search&#39;</span><span class="p">,</span> <span class="n">_external</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">quote</span><span class="p">(</span><span class="n">query</span><span class="p">))</span>
+ <span class="k">return</span> <span class="s1">&#39;[</span><span class="si">%s</span><span class="s1">](</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+
+ <span class="n">ctx</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">ctx</span><span class="p">[</span><span class="s1">&#39;GIT_URL&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">GIT_URL</span>
+ <span class="n">ctx</span><span class="p">[</span><span class="s1">&#39;get_setting&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_setting</span>
+ <span class="n">ctx</span><span class="p">[</span><span class="s1">&#39;link&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_md_link</span>
+ <span class="n">ctx</span><span class="p">[</span><span class="s1">&#39;search&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_md_search</span>
+
+ <span class="k">return</span> <span class="n">ctx</span></div>
+
+
+ <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="sa">f</span><span class="s1">&#39;&lt;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1"> fname=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">fname</span><span class="si">!r}</span><span class="s1">&gt;&#39;</span></div>
+
+
+
+<div class="viewcode-block" id="InfoPageSet">
+<a class="viewcode-back" href="../../src/searx.infopage.html#searx.infopage.InfoPageSet">[docs]</a>
+<span class="k">class</span> <span class="nc">InfoPageSet</span><span class="p">:</span> <span class="c1"># pylint: disable=too-few-public-methods</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Cached rendering of the online documentation a SearXNG instance has.</span>
+
+<span class="sd"> :param page_class: render online documentation by :py:obj:`InfoPage` parser.</span>
+<span class="sd"> :type page_class: :py:obj:`InfoPage`</span>
+
+<span class="sd"> :param info_folder: information directory</span>
+<span class="sd"> :type info_folder: str</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
+ <span class="bp">self</span><span class="p">,</span> <span class="n">page_class</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">typing</span><span class="o">.</span><span class="n">Type</span><span class="p">[</span><span class="n">InfoPage</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">info_folder</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">page_class</span> <span class="o">=</span> <span class="n">page_class</span> <span class="ow">or</span> <span class="n">InfoPage</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">folder</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">info_folder</span> <span class="ow">or</span> <span class="n">_INFO_FOLDER</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;location of the Markdown files&quot;&quot;&quot;</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">CACHE</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">tuple</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">InfoPage</span><span class="p">]]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">locale_default</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;en&#39;</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;default language&quot;&quot;&quot;</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">locales</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="n">locale</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">locale</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">_INFO_FOLDER</span><span class="p">)</span> <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">LOCALE_NAMES</span>
+ <span class="p">]</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;list of supported languages (aka locales)&quot;&quot;&quot;</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">toc</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="s1">&#39;search-syntax&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;about&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;donate&#39;</span><span class="p">,</span>
+ <span class="p">]</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;list of articles in the online documentation&quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="InfoPageSet.get_page">
+<a class="viewcode-back" href="../../src/searx.infopage.html#searx.infopage.InfoPageSet.get_page">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_page</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pagename</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">locale</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return ``pagename`` instance of :py:obj:`InfoPage`</span>
+
+<span class="sd"> :param pagename: name of the page, a value from :py:obj:`InfoPageSet.toc`</span>
+<span class="sd"> :type pagename: str</span>
+
+<span class="sd"> :param locale: language of the page, e.g. ``en``, ``zh_Hans_CN``</span>
+<span class="sd"> (default: :py:obj:`InfoPageSet.i18n_origin`)</span>
+<span class="sd"> :type locale: str</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">locale_default</span>
+
+ <span class="k">if</span> <span class="n">pagename</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">toc</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="n">locale</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">locales</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">cache_key</span> <span class="o">=</span> <span class="p">(</span><span class="n">pagename</span><span class="p">,</span> <span class="n">locale</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">cache_key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">CACHE</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">CACHE</span><span class="p">[</span><span class="n">cache_key</span><span class="p">]</span>
+
+ <span class="c1"># not yet instantiated</span>
+
+ <span class="n">fname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">folder</span><span class="p">,</span> <span class="n">locale</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">),</span> <span class="n">pagename</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;.md&#39;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">fname</span><span class="p">):</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;file </span><span class="si">%s</span><span class="s1"> does not exists&#39;</span><span class="p">,</span> <span class="n">fname</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">CACHE</span><span class="p">[</span><span class="n">cache_key</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">page</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">page_class</span><span class="p">(</span><span class="n">fname</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">CACHE</span><span class="p">[</span><span class="n">cache_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">page</span>
+ <span class="k">return</span> <span class="n">page</span></div>
+
+
+<div class="viewcode-block" id="InfoPageSet.iter_pages">
+<a class="viewcode-back" href="../../src/searx.infopage.html#searx.infopage.InfoPageSet.iter_pages">[docs]</a>
+ <span class="k">def</span> <span class="nf">iter_pages</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">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">fallback_to_default</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Iterate over all pages of the TOC&quot;&quot;&quot;</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">locale_default</span>
+ <span class="k">for</span> <span class="n">page_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">toc</span><span class="p">:</span>
+ <span class="n">page_locale</span> <span class="o">=</span> <span class="n">locale</span>
+ <span class="n">page</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_page</span><span class="p">(</span><span class="n">page_name</span><span class="p">,</span> <span class="n">locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">fallback_to_default</span> <span class="ow">and</span> <span class="n">page</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">page_locale</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">locale_default</span>
+ <span class="n">page</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_page</span><span class="p">(</span><span class="n">page_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">locale_default</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">page</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># page is None if the page was deleted by the administrator</span>
+ <span class="k">yield</span> <span class="n">page_name</span><span class="p">,</span> <span class="n">page_locale</span><span class="p">,</span> <span class="n">page</span></div>
+</div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/limiter.html b/_modules/searx/limiter.html
new file mode 100644
index 000000000..ef3e5dba2
--- /dev/null
+++ b/_modules/searx/limiter.html
@@ -0,0 +1,363 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.limiter &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.limiter</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.limiter</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;Bot protection / IP rate limitation. The intention of rate limitation is to</span>
+<span class="sd">limit suspicious requests from an IP. The motivation behind this is the fact</span>
+<span class="sd">that SearXNG passes through requests from bots and is thus classified as a bot</span>
+<span class="sd">itself. As a result, the SearXNG engine then receives a CAPTCHA or is blocked</span>
+<span class="sd">by the search engine (the origin) in some other way.</span>
+
+<span class="sd">To avoid blocking, the requests from bots to SearXNG must also be blocked, this</span>
+<span class="sd">is the task of the limiter. To perform this task, the limiter uses the methods</span>
+<span class="sd">from the :ref:`botdetection`:</span>
+
+<span class="sd">- Analysis of the HTTP header in the request / :ref:`botdetection probe headers`</span>
+<span class="sd"> can be easily bypassed.</span>
+
+<span class="sd">- Block and pass lists in which IPs are listed / :ref:`botdetection ip_lists`</span>
+<span class="sd"> are hard to maintain, since the IPs of bots are not all known and change over</span>
+<span class="sd"> the time.</span>
+
+<span class="sd">- Detection &amp; dynamically :ref:`botdetection rate limit` of bots based on the</span>
+<span class="sd"> behavior of the requests. For dynamically changeable IP lists a Redis</span>
+<span class="sd"> database is needed.</span>
+
+<span class="sd">The prerequisite for IP based methods is the correct determination of the IP of</span>
+<span class="sd">the client. The IP of the client is determined via the X-Forwarded-For_ HTTP</span>
+<span class="sd">header.</span>
+
+<span class="sd">.. attention::</span>
+
+<span class="sd"> A correct setup of the HTTP request headers ``X-Forwarded-For`` and</span>
+<span class="sd"> ``X-Real-IP`` is essential to be able to assign a request to an IP correctly:</span>
+
+<span class="sd"> - `NGINX RequestHeader`_</span>
+<span class="sd"> - `Apache RequestHeader`_</span>
+
+<span class="sd">.. _X-Forwarded-For:</span>
+<span class="sd"> https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For</span>
+<span class="sd">.. _NGINX RequestHeader:</span>
+<span class="sd"> https://docs.searxng.org/admin/installation-nginx.html#nginx-s-searxng-site</span>
+<span class="sd">.. _Apache RequestHeader:</span>
+<span class="sd"> https://docs.searxng.org/admin/installation-apache.html#apache-s-searxng-site</span>
+
+<span class="sd">Enable Limiter</span>
+<span class="sd">==============</span>
+
+<span class="sd">To enable the limiter activate:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> server:</span>
+<span class="sd"> ...</span>
+<span class="sd"> limiter: true # rate limit the number of request on the instance, block some bots</span>
+
+<span class="sd">and set the redis-url connection. Check the value, it depends on your redis DB</span>
+<span class="sd">(see :ref:`settings redis`), by example:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> redis:</span>
+<span class="sd"> url: unix:///usr/local/searxng-redis/run/redis.sock?db=0</span>
+
+
+<span class="sd">Configure Limiter</span>
+<span class="sd">=================</span>
+
+<span class="sd">The methods of :ref:`botdetection` the limiter uses are configured in a local</span>
+<span class="sd">file ``/etc/searxng/limiter.toml``. The defaults are shown in limiter.toml_ /</span>
+<span class="sd">Don&#39;t copy all values to your local configuration, just enable what you need by</span>
+<span class="sd">overwriting the defaults. For instance to activate the ``link_token`` method in</span>
+<span class="sd">the :ref:`botdetection.ip_limit` you only need to set this option to ``true``:</span>
+
+<span class="sd">.. code:: toml</span>
+
+<span class="sd"> [botdetection.ip_limit]</span>
+<span class="sd"> link_token = true</span>
+
+<span class="sd">.. _limiter.toml:</span>
+
+<span class="sd">``limiter.toml``</span>
+<span class="sd">================</span>
+
+<span class="sd">In this file the limiter finds the configuration of the :ref:`botdetection`:</span>
+
+<span class="sd">- :ref:`botdetection ip_lists`</span>
+<span class="sd">- :ref:`botdetection rate limit`</span>
+<span class="sd">- :ref:`botdetection probe headers`</span>
+
+<span class="sd">.. kernel-include:: $SOURCEDIR/limiter.toml</span>
+<span class="sd"> :code: toml</span>
+
+<span class="sd">Implementation</span>
+<span class="sd">==============</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+<span class="kn">import</span> <span class="nn">sys</span>
+
+<span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">from</span> <span class="nn">ipaddress</span> <span class="kn">import</span> <span class="n">ip_address</span>
+<span class="kn">import</span> <span class="nn">flask</span>
+<span class="kn">import</span> <span class="nn">werkzeug</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">logger</span><span class="p">,</span>
+ <span class="n">redisdb</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">botdetection</span>
+<span class="kn">from</span> <span class="nn">searx.botdetection</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">config</span><span class="p">,</span>
+ <span class="n">http_accept</span><span class="p">,</span>
+ <span class="n">http_accept_encoding</span><span class="p">,</span>
+ <span class="n">http_accept_language</span><span class="p">,</span>
+ <span class="n">http_user_agent</span><span class="p">,</span>
+ <span class="n">ip_limit</span><span class="p">,</span>
+ <span class="n">ip_lists</span><span class="p">,</span>
+ <span class="n">get_network</span><span class="p">,</span>
+ <span class="n">get_real_ip</span><span class="p">,</span>
+ <span class="n">dump_request</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="c1"># the configuration are limiter.toml and &quot;limiter&quot; in settings.yml so, for</span>
+<span class="c1"># coherency, the logger is &quot;limiter&quot;</span>
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;limiter&#39;</span><span class="p">)</span>
+
+<span class="n">CFG</span><span class="p">:</span> <span class="n">config</span><span class="o">.</span><span class="n">Config</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># type: ignore</span>
+<span class="n">_INSTALLED</span> <span class="o">=</span> <span class="kc">False</span>
+
+<span class="n">LIMITER_CFG_SCHEMA</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&quot;limiter.toml&quot;</span>
+<span class="sd">&quot;&quot;&quot;Base configuration (schema) of the botdetection.&quot;&quot;&quot;</span>
+
+<span class="n">LIMITER_CFG</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="s1">&#39;/etc/searxng/limiter.toml&#39;</span><span class="p">)</span>
+<span class="sd">&quot;&quot;&quot;Local Limiter configuration.&quot;&quot;&quot;</span>
+
+<span class="n">CFG_DEPRECATED</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="c1"># &quot;dummy.old.foo&quot;: &quot;config &#39;dummy.old.foo&#39; exists only for tests. Don&#39;t use it in your real project config.&quot;</span>
+<span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">get_cfg</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">config</span><span class="o">.</span><span class="n">Config</span><span class="p">:</span>
+ <span class="k">global</span> <span class="n">CFG</span> <span class="c1"># pylint: disable=global-statement</span>
+ <span class="k">if</span> <span class="n">CFG</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">CFG</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">Config</span><span class="o">.</span><span class="n">from_toml</span><span class="p">(</span><span class="n">LIMITER_CFG_SCHEMA</span><span class="p">,</span> <span class="n">LIMITER_CFG</span><span class="p">,</span> <span class="n">CFG_DEPRECATED</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">CFG</span>
+
+
+<span class="k">def</span> <span class="nf">filter_request</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Request</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">werkzeug</span><span class="o">.</span><span class="n">Response</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># pylint: disable=too-many-return-statements</span>
+
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">get_cfg</span><span class="p">()</span>
+ <span class="n">real_ip</span> <span class="o">=</span> <span class="n">ip_address</span><span class="p">(</span><span class="n">get_real_ip</span><span class="p">(</span><span class="n">request</span><span class="p">))</span>
+ <span class="n">network</span> <span class="o">=</span> <span class="n">get_network</span><span class="p">(</span><span class="n">real_ip</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/healthz&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="c1"># link-local</span>
+
+ <span class="k">if</span> <span class="n">network</span><span class="o">.</span><span class="n">is_link_local</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="c1"># block- &amp; pass- lists</span>
+ <span class="c1">#</span>
+ <span class="c1"># 1. The IP of the request is first checked against the pass-list; if the IP</span>
+ <span class="c1"># matches an entry in the list, the request is not blocked.</span>
+ <span class="c1"># 2. If no matching entry is found in the pass-list, then a check is made against</span>
+ <span class="c1"># the block list; if the IP matches an entry in the list, the request is</span>
+ <span class="c1"># blocked.</span>
+ <span class="c1"># 3. If the IP is not in either list, the request is not blocked.</span>
+
+ <span class="n">match</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">ip_lists</span><span class="o">.</span><span class="n">pass_ip</span><span class="p">(</span><span class="n">real_ip</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;PASS </span><span class="si">%s</span><span class="s2">: matched PASSLIST - </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">network</span><span class="o">.</span><span class="n">compressed</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">match</span><span class="p">,</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">ip_lists</span><span class="o">.</span><span class="n">block_ip</span><span class="p">(</span><span class="n">real_ip</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;BLOCK </span><span class="si">%s</span><span class="s2">: matched BLOCKLIST - </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">network</span><span class="o">.</span><span class="n">compressed</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">flask</span><span class="o">.</span><span class="n">make_response</span><span class="p">((</span><span class="s1">&#39;IP is on BLOCKLIST - </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">msg</span><span class="p">,</span> <span class="mi">429</span><span class="p">))</span>
+
+ <span class="c1"># methods applied on /</span>
+
+ <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="n">http_user_agent</span><span class="p">,</span>
+ <span class="p">]:</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="n">filter_request</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">val</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">val</span>
+
+ <span class="c1"># methods applied on /search</span>
+
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="s1">&#39;/search&#39;</span><span class="p">:</span>
+
+ <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="p">[</span>
+ <span class="n">http_accept</span><span class="p">,</span>
+ <span class="n">http_accept_encoding</span><span class="p">,</span>
+ <span class="n">http_accept_language</span><span class="p">,</span>
+ <span class="n">http_user_agent</span><span class="p">,</span>
+ <span class="n">ip_limit</span><span class="p">,</span>
+ <span class="p">]:</span>
+ <span class="n">val</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="n">filter_request</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">val</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">val</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;OK </span><span class="si">{</span><span class="n">network</span><span class="si">}</span><span class="s2">: %s&quot;</span><span class="p">,</span> <span class="n">dump_request</span><span class="p">(</span><span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="p">))</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<div class="viewcode-block" id="pre_request">
+<a class="viewcode-back" href="../../admin/searx.limiter.html#searx.limiter.pre_request">[docs]</a>
+<span class="k">def</span> <span class="nf">pre_request</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;See :py:obj:`flask.Flask.before_request`&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">filter_request</span><span class="p">(</span><span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="is_installed">
+<a class="viewcode-back" href="../../admin/searx.limiter.html#searx.limiter.is_installed">[docs]</a>
+<span class="k">def</span> <span class="nf">is_installed</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns ``True`` if limiter is active and a redis DB is available.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">_INSTALLED</span></div>
+
+
+
+<div class="viewcode-block" id="initialize">
+<a class="viewcode-back" href="../../admin/searx.limiter.html#searx.limiter.initialize">[docs]</a>
+<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">app</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Flask</span><span class="p">,</span> <span class="n">settings</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Install the limiter&quot;&quot;&quot;</span>
+ <span class="k">global</span> <span class="n">_INSTALLED</span> <span class="c1"># pylint: disable=global-statement</span>
+
+ <span class="c1"># even if the limiter is not activated, the botdetection must be activated</span>
+ <span class="c1"># (e.g. the self_info plugin uses the botdetection to get client IP)</span>
+
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">get_cfg</span><span class="p">()</span>
+ <span class="n">redis_client</span> <span class="o">=</span> <span class="n">redisdb</span><span class="o">.</span><span class="n">client</span><span class="p">()</span>
+ <span class="n">botdetection</span><span class="o">.</span><span class="n">init</span><span class="p">(</span><span class="n">cfg</span><span class="p">,</span> <span class="n">redis_client</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">settings</span><span class="p">[</span><span class="s1">&#39;server&#39;</span><span class="p">][</span><span class="s1">&#39;limiter&#39;</span><span class="p">]</span> <span class="ow">or</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;server&#39;</span><span class="p">][</span><span class="s1">&#39;public_instance&#39;</span><span class="p">]):</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">redis_client</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
+ <span class="s2">&quot;The limiter requires Redis, please consult the documentation: &quot;</span>
+ <span class="s2">&quot;https://docs.searxng.org/admin/searx.limiter.html&quot;</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;server&#39;</span><span class="p">][</span><span class="s1">&#39;public_instance&#39;</span><span class="p">]:</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="k">return</span>
+
+ <span class="n">_INSTALLED</span> <span class="o">=</span> <span class="kc">True</span>
+
+ <span class="k">if</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;server&#39;</span><span class="p">][</span><span class="s1">&#39;public_instance&#39;</span><span class="p">]:</span>
+ <span class="c1"># overwrite limiter.toml setting</span>
+ <span class="n">cfg</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;botdetection.ip_limit.link_token&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
+
+ <span class="n">app</span><span class="o">.</span><span class="n">before_request</span><span class="p">(</span><span class="n">pre_request</span><span class="p">)</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/locales.html b/_modules/searx/locales.html
new file mode 100644
index 000000000..da91c10ee
--- /dev/null
+++ b/_modules/searx/locales.html
@@ -0,0 +1,598 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.locales &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.locales</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.locales</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;</span>
+<span class="sd">SearXNG’s locale data</span>
+<span class="sd">=====================</span>
+
+<span class="sd">The variables :py:obj:`RTL_LOCALES` and :py:obj:`LOCALE_NAMES` are loaded from</span>
+<span class="sd">:origin:`searx/data/locales.json` / see :py:obj:`locales_initialize` and</span>
+<span class="sd">:ref:`update_locales.py`.</span>
+
+<span class="sd">.. hint::</span>
+
+<span class="sd"> Whenever the value of :py:obj:`ADDITIONAL_TRANSLATIONS` or</span>
+<span class="sd"> :py:obj:`LOCALE_BEST_MATCH` is modified, the</span>
+<span class="sd"> :origin:`searx/data/locales.json` needs to be rebuild::</span>
+
+<span class="sd"> ./manage data.locales</span>
+
+<span class="sd">SearXNG&#39;s locale codes</span>
+<span class="sd">======================</span>
+
+<span class="sd">.. automodule:: searx.sxng_locales</span>
+<span class="sd"> :members:</span>
+
+
+<span class="sd">SearXNG’s locale implementations</span>
+<span class="sd">================================</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+
+<span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
+
+<span class="kn">import</span> <span class="nn">babel</span>
+<span class="kn">from</span> <span class="nn">babel.support</span> <span class="kn">import</span> <span class="n">Translations</span>
+<span class="kn">import</span> <span class="nn">babel.languages</span>
+<span class="kn">import</span> <span class="nn">babel.core</span>
+<span class="kn">import</span> <span class="nn">flask_babel</span>
+<span class="kn">import</span> <span class="nn">flask</span>
+<span class="kn">from</span> <span class="nn">flask.ctx</span> <span class="kn">import</span> <span class="n">has_request_context</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">data</span><span class="p">,</span>
+ <span class="n">logger</span><span class="p">,</span>
+ <span class="n">searx_dir</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;locales&#39;</span><span class="p">)</span>
+
+
+<span class="c1"># safe before monkey patching flask_babel.get_translations</span>
+<span class="n">_flask_babel_get_translations</span> <span class="o">=</span> <span class="n">flask_babel</span><span class="o">.</span><span class="n">get_translations</span>
+
+<span class="n">LOCALE_NAMES</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="sd">&quot;&quot;&quot;Mapping of locales and their description. Locales e.g. &#39;fr&#39; or &#39;pt-BR&#39; (see</span>
+<span class="sd">:py:obj:`locales_initialize`).</span>
+
+<span class="sd">:meta hide-value:</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">RTL_LOCALES</span><span class="p">:</span> <span class="nb">set</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+<span class="sd">&quot;&quot;&quot;List of *Right-To-Left* locales e.g. &#39;he&#39; or &#39;fa-IR&#39; (see</span>
+<span class="sd">:py:obj:`locales_initialize`).&quot;&quot;&quot;</span>
+
+<span class="n">ADDITIONAL_TRANSLATIONS</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;dv&quot;</span><span class="p">:</span> <span class="s2">&quot;ދިވެހި (Dhivehi)&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;oc&quot;</span><span class="p">:</span> <span class="s2">&quot;Occitan&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;szl&quot;</span><span class="p">:</span> <span class="s2">&quot;Ślōnski (Silesian)&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;pap&quot;</span><span class="p">:</span> <span class="s2">&quot;Papiamento&quot;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;Additional languages SearXNG has translations for but not supported by</span>
+<span class="sd">python-babel (see :py:obj:`locales_initialize`).&quot;&quot;&quot;</span>
+
+<span class="n">LOCALE_BEST_MATCH</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;dv&quot;</span><span class="p">:</span> <span class="s2">&quot;si&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;oc&quot;</span><span class="p">:</span> <span class="s1">&#39;fr-FR&#39;</span><span class="p">,</span>
+ <span class="s2">&quot;szl&quot;</span><span class="p">:</span> <span class="s2">&quot;pl&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;nl-BE&quot;</span><span class="p">:</span> <span class="s2">&quot;nl&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh-HK&quot;</span><span class="p">:</span> <span class="s2">&quot;zh-Hant-TW&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;pap&quot;</span><span class="p">:</span> <span class="s2">&quot;pt-BR&quot;</span><span class="p">,</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;Map a locale we do not have a translations for to a locale we have a</span>
+<span class="sd">translation for. By example: use Taiwan version of the translation for Hong</span>
+<span class="sd">Kong.&quot;&quot;&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">localeselector</span><span class="p">():</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="s1">&#39;en&#39;</span>
+ <span class="k">if</span> <span class="n">has_request_context</span><span class="p">():</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">preferences</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="s1">&#39;locale&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">value</span><span class="p">:</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="c1"># first, set the language that is not supported by babel</span>
+ <span class="k">if</span> <span class="n">locale</span> <span class="ow">in</span> <span class="n">ADDITIONAL_TRANSLATIONS</span><span class="p">:</span>
+ <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">&#39;use-translation&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">locale</span>
+
+ <span class="c1"># second, map locale to a value python-babel supports</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">LOCALE_BEST_MATCH</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">locale</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">locale</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="c1"># if there is an error loading the preferences</span>
+ <span class="c1"># the locale is going to be &#39;&#39;</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="s1">&#39;en&#39;</span>
+
+ <span class="c1"># babel uses underscore instead of hyphen.</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">locale</span>
+
+
+<div class="viewcode-block" id="get_translations">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.get_translations">[docs]</a>
+<span class="k">def</span> <span class="nf">get_translations</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Monkey patch of :py:obj:`flask_babel.get_translations`&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">has_request_context</span><span class="p">():</span>
+ <span class="n">use_translation</span> <span class="o">=</span> <span class="n">flask</span><span class="o">.</span><span class="n">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="s1">&#39;use-translation&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">use_translation</span> <span class="ow">in</span> <span class="n">ADDITIONAL_TRANSLATIONS</span><span class="p">:</span>
+ <span class="n">babel_ext</span> <span class="o">=</span> <span class="n">flask_babel</span><span class="o">.</span><span class="n">current_app</span><span class="o">.</span><span class="n">extensions</span><span class="p">[</span><span class="s1">&#39;babel&#39;</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">Translations</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">babel_ext</span><span class="o">.</span><span class="n">translation_directories</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">use_translation</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">_flask_babel_get_translations</span><span class="p">()</span></div>
+
+
+
+<span class="n">_TR_LOCALES</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+
+
+<div class="viewcode-block" id="get_translation_locales">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.get_translation_locales">[docs]</a>
+<span class="k">def</span> <span class="nf">get_translation_locales</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the list of transaltion locales (*underscore*). The list is</span>
+<span class="sd"> generated from the translation folders in :origin:`searx/translations`&quot;&quot;&quot;</span>
+
+ <span class="k">global</span> <span class="n">_TR_LOCALES</span> <span class="c1"># pylint:disable=global-statement</span>
+ <span class="k">if</span> <span class="n">_TR_LOCALES</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">_TR_LOCALES</span>
+
+ <span class="n">tr_locales</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">folder</span> <span class="ow">in</span> <span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">searx_dir</span><span class="p">)</span> <span class="o">/</span> <span class="s1">&#39;translations&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">iterdir</span><span class="p">():</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">folder</span><span class="o">.</span><span class="n">is_dir</span><span class="p">():</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">folder</span> <span class="o">/</span> <span class="s1">&#39;LC_MESSAGES&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">is_dir</span><span class="p">():</span>
+ <span class="k">continue</span>
+ <span class="n">tr_locales</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">folder</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">_TR_LOCALES</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">tr_locales</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">_TR_LOCALES</span></div>
+
+
+
+<div class="viewcode-block" id="locales_initialize">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.locales_initialize">[docs]</a>
+<span class="k">def</span> <span class="nf">locales_initialize</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initialize locales environment of the SearXNG session.</span>
+
+<span class="sd"> - monkey patch :py:obj:`flask_babel.get_translations` by :py:obj:`get_translations`</span>
+<span class="sd"> - init global names :py:obj:`LOCALE_NAMES`, :py:obj:`RTL_LOCALES`</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">flask_babel</span><span class="o">.</span><span class="n">get_translations</span> <span class="o">=</span> <span class="n">get_translations</span>
+ <span class="n">LOCALE_NAMES</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">LOCALES</span><span class="p">[</span><span class="s2">&quot;LOCALE_NAMES&quot;</span><span class="p">])</span>
+ <span class="n">RTL_LOCALES</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">LOCALES</span><span class="p">[</span><span class="s2">&quot;RTL_LOCALES&quot;</span><span class="p">])</span></div>
+
+
+
+<div class="viewcode-block" id="region_tag">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.region_tag">[docs]</a>
+<span class="k">def</span> <span class="nf">region_tag</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="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;Returns SearXNG&#39;s region tag from the locale (e.g. zh-TW , en-US).&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> missed a territory&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">locale</span><span class="o">.</span><span class="n">language</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span></div>
+
+
+
+<div class="viewcode-block" id="language_tag">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.language_tag">[docs]</a>
+<span class="k">def</span> <span class="nf">language_tag</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="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;Returns SearXNG&#39;s language tag from the locale and if exits, the tag</span>
+<span class="sd"> includes the script name (e.g. en, zh_Hant).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">sxng_lang</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">language</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">script</span><span class="p">:</span>
+ <span class="n">sxng_lang</span> <span class="o">+=</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="n">locale</span><span class="o">.</span><span class="n">script</span>
+ <span class="k">return</span> <span class="n">sxng_lang</span></div>
+
+
+
+<div class="viewcode-block" id="get_locale">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.get_locale">[docs]</a>
+<span class="k">def</span> <span class="nf">get_locale</span><span class="p">(</span><span class="n">locale_tag</span><span class="p">:</span> <span class="nb">str</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="o">|</span> <span class="kc">None</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a :py:obj:`babel.Locale` object parsed from argument</span>
+<span class="sd"> ``locale_tag``&quot;&quot;&quot;</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="n">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="k">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span></div>
+
+
+
+<div class="viewcode-block" id="get_official_locales">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.get_official_locales">[docs]</a>
+<span class="k">def</span> <span class="nf">get_official_locales</span><span class="p">(</span>
+ <span class="n">territory</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">languages</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">regional</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">de_facto</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">set</span><span class="p">[</span><span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a list of :py:obj:`babel.Locale` with languages from</span>
+<span class="sd"> :py:obj:`babel.languages.get_official_languages`.</span>
+
+<span class="sd"> :param territory: The territory (country or region) code.</span>
+
+<span class="sd"> :param languages: A list of language codes the languages from</span>
+<span class="sd"> :py:obj:`babel.languages.get_official_languages` should be in</span>
+<span class="sd"> (intersection). If this argument is ``None``, all official languages in</span>
+<span class="sd"> this territory are used.</span>
+
+<span class="sd"> :param regional: If the regional flag is set, then languages which are</span>
+<span class="sd"> regionally official are also returned.</span>
+
+<span class="sd"> :param de_facto: If the de_facto flag is set to `False`, then languages</span>
+<span class="sd"> which are “de facto” official are not returned.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ret_val</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+ <span class="n">o_languages</span> <span class="o">=</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="n">territory</span><span class="p">,</span> <span class="n">regional</span><span class="o">=</span><span class="n">regional</span><span class="p">,</span> <span class="n">de_facto</span><span class="o">=</span><span class="n">de_facto</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">languages</span><span class="p">:</span>
+ <span class="n">languages</span> <span class="o">=</span> <span class="p">[</span><span class="n">l</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">languages</span><span class="p">]</span>
+ <span class="n">o_languages</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">l</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">o_languages</span> <span class="k">if</span> <span class="n">l</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="n">languages</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">o_languages</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="n">lang</span> <span class="o">+</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="n">territory</span><span class="p">)</span>
+ <span class="n">ret_val</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">locale</span><span class="p">)</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="k">return</span> <span class="n">ret_val</span></div>
+
+
+
+<div class="viewcode-block" id="get_engine_locale">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.get_engine_locale">[docs]</a>
+<span class="k">def</span> <span class="nf">get_engine_locale</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">,</span> <span class="n">engine_locales</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return engine&#39;s language (aka locale) string that best fits to argument</span>
+<span class="sd"> ``searxng_locale``.</span>
+
+<span class="sd"> Argument ``engine_locales`` is a python dict that maps *SearXNG locales* to</span>
+<span class="sd"> corresponding *engine locales*::</span>
+
+<span class="sd"> &lt;engine&gt;: {</span>
+<span class="sd"> # SearXNG string : engine-string</span>
+<span class="sd"> &#39;ca-ES&#39; : &#39;ca_ES&#39;,</span>
+<span class="sd"> &#39;fr-BE&#39; : &#39;fr_BE&#39;,</span>
+<span class="sd"> &#39;fr-CA&#39; : &#39;fr_CA&#39;,</span>
+<span class="sd"> &#39;fr-CH&#39; : &#39;fr_CH&#39;,</span>
+<span class="sd"> &#39;fr&#39; : &#39;fr_FR&#39;,</span>
+<span class="sd"> ...</span>
+<span class="sd"> &#39;pl-PL&#39; : &#39;pl_PL&#39;,</span>
+<span class="sd"> &#39;pt-PT&#39; : &#39;pt_PT&#39;</span>
+<span class="sd"> ..</span>
+<span class="sd"> &#39;zh&#39; : &#39;zh&#39;</span>
+<span class="sd"> &#39;zh_Hans&#39; : &#39;zh&#39;</span>
+<span class="sd"> &#39;zh_Hant&#39; : &#39;zh_TW&#39;</span>
+<span class="sd"> }</span>
+
+<span class="sd"> .. hint::</span>
+
+<span class="sd"> The *SearXNG locale* string has to be known by babel!</span>
+
+<span class="sd"> If there is no direct 1:1 mapping, this functions tries to narrow down</span>
+<span class="sd"> engine&#39;s language (locale). If no value can be determined by these</span>
+<span class="sd"> approximation attempts the ``default`` value is returned.</span>
+
+<span class="sd"> Assumptions:</span>
+
+<span class="sd"> A. When user select a language the results should be optimized according to</span>
+<span class="sd"> the selected language.</span>
+
+<span class="sd"> B. When user select a language and a territory the results should be</span>
+<span class="sd"> optimized with first priority on territory and second on language.</span>
+
+<span class="sd"> First approximation rule (*by territory*):</span>
+
+<span class="sd"> When the user selects a locale with territory (and a language), the</span>
+<span class="sd"> territory has priority over the language. If any of the official languages</span>
+<span class="sd"> in the territory is supported by the engine (``engine_locales``) it will</span>
+<span class="sd"> be used.</span>
+
+<span class="sd"> Second approximation rule (*by language*):</span>
+
+<span class="sd"> If &quot;First approximation rule&quot; brings no result or the user selects only a</span>
+<span class="sd"> language without a territory. Check in which territories the language</span>
+<span class="sd"> has an official status and if one of these territories is supported by the</span>
+<span class="sd"> engine.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># pylint: disable=too-many-branches, too-many-return-statements</span>
+
+ <span class="n">engine_locale</span> <span class="o">=</span> <span class="n">engine_locales</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">engine_locale</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># There was a 1:1 mapping (e.g. a region &quot;fr-BE --&gt; fr_BE&quot; or a language</span>
+ <span class="c1"># &quot;zh --&gt; zh&quot;), no need to narrow language-script nor territory.</span>
+ <span class="k">return</span> <span class="n">engine_locale</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="n">searxng_locale</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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">UnknownLocaleError</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="n">searxng_locale</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="k">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">default</span>
+
+ <span class="n">searxng_lang</span> <span class="o">=</span> <span class="n">language_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)</span>
+ <span class="n">engine_locale</span> <span class="o">=</span> <span class="n">engine_locales</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_lang</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">engine_locale</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># There was a 1:1 mapping (e.g. &quot;zh-HK --&gt; zh_Hant&quot; or &quot;zh-CN --&gt; zh_Hans&quot;)</span>
+ <span class="k">return</span> <span class="n">engine_locale</span>
+
+ <span class="c1"># SearXNG&#39;s selected locale is not supported by the engine ..</span>
+
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">:</span>
+ <span class="c1"># Try to narrow by *official* languages in the territory (??-XX).</span>
+
+ <span class="k">for</span> <span class="n">official_language</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="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">,</span> <span class="n">de_facto</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="n">searxng_locale</span> <span class="o">=</span> <span class="n">official_language</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span>
+ <span class="n">engine_locale</span> <span class="o">=</span> <span class="n">engine_locales</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">engine_locale</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">engine_locale</span>
+
+ <span class="c1"># Engine does not support one of the official languages in the territory or</span>
+ <span class="c1"># there is only a language selected without a territory.</span>
+
+ <span class="c1"># Now lets have a look if the searxng_lang (the language selected by the</span>
+ <span class="c1"># user) is a official language in other territories. If so, check if</span>
+ <span class="c1"># engine does support the searxng_lang in this other territory.</span>
+
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">language</span><span class="p">:</span>
+
+ <span class="n">terr_lang_dict</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">territory</span><span class="p">,</span> <span class="n">langs</span> <span class="ow">in</span> <span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">get_global</span><span class="p">(</span><span class="s2">&quot;territory_languages&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">langs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_lang</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;official_status&#39;</span><span class="p">):</span>
+ <span class="k">continue</span>
+ <span class="n">terr_lang_dict</span><span class="p">[</span><span class="n">territory</span><span class="p">]</span> <span class="o">=</span> <span class="n">langs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_lang</span><span class="p">)</span>
+
+ <span class="c1"># first: check fr-FR, de-DE .. is supported by the engine</span>
+ <span class="c1"># exception: &#39;en&#39; --&gt; &#39;en-US&#39;</span>
+
+ <span class="n">territory</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">language</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">territory</span> <span class="o">==</span> <span class="s1">&#39;EN&#39;</span><span class="p">:</span>
+ <span class="n">territory</span> <span class="o">=</span> <span class="s1">&#39;US&#39;</span>
+
+ <span class="k">if</span> <span class="n">terr_lang_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">territory</span><span class="p">):</span>
+ <span class="n">searxng_locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">language</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">territory</span>
+ <span class="n">engine_locale</span> <span class="o">=</span> <span class="n">engine_locales</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">engine_locale</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">engine_locale</span>
+
+ <span class="c1"># second: sort by population_percent and take first match</span>
+
+ <span class="c1"># drawback of &quot;population percent&quot;: if there is a territory with a</span>
+ <span class="c1"># small number of people (e.g 100) but the majority speaks the</span>
+ <span class="c1"># language, then the percentage might be 100% (--&gt; 100 people) but in</span>
+ <span class="c1"># a different territory with more people (e.g. 10.000) where only 10%</span>
+ <span class="c1"># speak the language the total amount of speaker is higher (--&gt; 200</span>
+ <span class="c1"># people).</span>
+ <span class="c1">#</span>
+ <span class="c1"># By example: The population of Saint-Martin is 33.000, of which 100%</span>
+ <span class="c1"># speak French, but this is less than the 30% of the approximately 2.5</span>
+ <span class="c1"># million Belgian citizens</span>
+ <span class="c1">#</span>
+ <span class="c1"># - &#39;fr-MF&#39;, &#39;population_percent&#39;: 100.0, &#39;official_status&#39;: &#39;official&#39;</span>
+ <span class="c1"># - &#39;fr-BE&#39;, &#39;population_percent&#39;: 38.0, &#39;official_status&#39;: &#39;official&#39;</span>
+
+ <span class="n">terr_lang_list</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">terr_lang_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">terr_lang_list</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">))</span>
+
+ <span class="k">for</span> <span class="n">territory</span><span class="p">,</span> <span class="n">_lang</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">terr_lang_list</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">item</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;population_percent&#39;</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="n">searxng_locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">language</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">territory</span>
+ <span class="n">engine_locale</span> <span class="o">=</span> <span class="n">engine_locales</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">engine_locale</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">engine_locale</span>
+
+ <span class="c1"># No luck: narrow by &quot;language from territory&quot; and &quot;territory from language&quot;</span>
+ <span class="c1"># does not fit to a locale supported by the engine.</span>
+
+ <span class="k">if</span> <span class="n">engine_locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">engine_locale</span> <span class="o">=</span> <span class="n">default</span>
+
+ <span class="k">return</span> <span class="n">default</span></div>
+
+
+
+<div class="viewcode-block" id="match_locale">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.match_locale">[docs]</a>
+<span class="k">def</span> <span class="nf">match_locale</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">locale_tag_list</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">fallback</span><span class="p">:</span> <span class="nb">str</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="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;Return tag from ``locale_tag_list`` that best fits to ``searxng_locale``.</span>
+
+<span class="sd"> :param str searxng_locale: SearXNG&#39;s internal representation of locale (de,</span>
+<span class="sd"> de-DE, fr-BE, zh, zh-CN, zh-TW ..).</span>
+
+<span class="sd"> :param list locale_tag_list: The list of locale tags to select from</span>
+
+<span class="sd"> :param str fallback: fallback locale tag (if unset --&gt; ``None``)</span>
+
+<span class="sd"> The rules to find a match are implemented in :py:obj:`get_engine_locale`,</span>
+<span class="sd"> the ``engine_locales`` is build up by :py:obj:`build_engine_locales`.</span>
+
+<span class="sd"> .. hint::</span>
+
+<span class="sd"> The *SearXNG locale* string and the members of ``locale_tag_list`` has to</span>
+<span class="sd"> be known by babel! The :py:obj:`ADDITIONAL_TRANSLATIONS` are used in the</span>
+<span class="sd"> UI and are not known by babel --&gt; will be ignored.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="c1"># searxng_locale = &#39;es&#39;</span>
+ <span class="c1"># locale_tag_list = [&#39;es-AR&#39;, &#39;es-ES&#39;, &#39;es-MX&#39;]</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">searxng_locale</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">fallback</span>
+
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">get_locale</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">fallback</span>
+
+ <span class="c1"># normalize to a SearXNG locale that can be passed to get_engine_locale</span>
+
+ <span class="n">searxng_locale</span> <span class="o">=</span> <span class="n">language_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">:</span>
+ <span class="n">searxng_locale</span> <span class="o">=</span> <span class="n">region_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)</span>
+
+ <span class="c1"># clean up locale_tag_list</span>
+
+ <span class="n">tag_list</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">locale_tag_list</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">tag</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;all&#39;</span><span class="p">,</span> <span class="s1">&#39;auto&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">ADDITIONAL_TRANSLATIONS</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">tag_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+
+ <span class="c1"># emulate fetch_traits</span>
+ <span class="n">engine_locales</span> <span class="o">=</span> <span class="n">build_engine_locales</span><span class="p">(</span><span class="n">tag_list</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">get_engine_locale</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">,</span> <span class="n">engine_locales</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">fallback</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="build_engine_locales">
+<a class="viewcode-back" href="../../src/searx.locales.html#searx.locales.build_engine_locales">[docs]</a>
+<span class="k">def</span> <span class="nf">build_engine_locales</span><span class="p">(</span><span class="n">tag_list</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;From a list of locale tags a dictionary is build that can be passed by</span>
+<span class="sd"> argument ``engine_locales`` to :py:obj:`get_engine_locale`. This function</span>
+<span class="sd"> is mainly used by :py:obj:`match_locale` and is similar to what the</span>
+<span class="sd"> ``fetch_traits(..)`` function of engines do.</span>
+
+<span class="sd"> If there are territory codes in the ``tag_list`` that have a *script code*</span>
+<span class="sd"> additional keys are added to the returned dictionary.</span>
+
+<span class="sd"> .. code:: python</span>
+
+<span class="sd"> &gt;&gt;&gt; import locales</span>
+<span class="sd"> &gt;&gt;&gt; engine_locales = locales.build_engine_locales([&#39;en&#39;, &#39;en-US&#39;, &#39;zh&#39;, &#39;zh-CN&#39;, &#39;zh-TW&#39;])</span>
+<span class="sd"> &gt;&gt;&gt; engine_locales</span>
+<span class="sd"> {</span>
+<span class="sd"> &#39;en&#39;: &#39;en&#39;, &#39;en-US&#39;: &#39;en-US&#39;,</span>
+<span class="sd"> &#39;zh&#39;: &#39;zh&#39;, &#39;zh-CN&#39;: &#39;zh-CN&#39;, &#39;zh_Hans&#39;: &#39;zh-CN&#39;,</span>
+<span class="sd"> &#39;zh-TW&#39;: &#39;zh-TW&#39;, &#39;zh_Hant&#39;: &#39;zh-TW&#39;</span>
+<span class="sd"> }</span>
+<span class="sd"> &gt;&gt;&gt; get_engine_locale(&#39;zh-Hans&#39;, engine_locales)</span>
+<span class="sd"> &#39;zh-CN&#39;</span>
+
+<span class="sd"> This function is a good example to understand the language/region model</span>
+<span class="sd"> of SearXNG:</span>
+
+<span class="sd"> SearXNG only distinguishes between **search languages** and **search</span>
+<span class="sd"> regions**, by adding the *script-tags*, languages with *script-tags* can</span>
+<span class="sd"> be assigned to the **regions** that SearXNG supports.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">engine_locales</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">tag_list</span><span class="p">:</span>
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">get_locale</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;build_engine_locales: skip locale tag </span><span class="si">%s</span><span class="s2"> / unknown by babel&quot;</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">:</span>
+ <span class="n">engine_locales</span><span class="p">[</span><span class="n">region_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)]</span> <span class="o">=</span> <span class="n">tag</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">script</span><span class="p">:</span>
+ <span class="n">engine_locales</span><span class="p">[</span><span class="n">language_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)]</span> <span class="o">=</span> <span class="n">tag</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">engine_locales</span><span class="p">[</span><span class="n">language_tag</span><span class="p">(</span><span class="n">locale</span><span class="p">)]</span> <span class="o">=</span> <span class="n">tag</span>
+ <span class="k">return</span> <span class="n">engine_locales</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/plugins/unit_converter.html b/_modules/searx/plugins/unit_converter.html
new file mode 100644
index 000000000..6c7b746ad
--- /dev/null
+++ b/_modules/searx/plugins/unit_converter.html
@@ -0,0 +1,374 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.plugins.unit_converter &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.plugins.unit_converter</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.plugins.unit_converter</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;A plugin for converting measured values from one unit to another unit (a</span>
+<span class="sd">unit converter).</span>
+
+<span class="sd">The plugin looks up the symbols (given in the query term) in a list of</span>
+<span class="sd">converters, each converter is one item in the list (compare</span>
+<span class="sd">:py:obj:`ADDITIONAL_UNITS`). If the symbols are ambiguous, the matching units</span>
+<span class="sd">of measurement are evaluated. The weighting in the evaluation results from the</span>
+<span class="sd">sorting of the :py:obj:`list of unit converters&lt;symbol_to_si&gt;`.</span>
+
+<span class="sd">Enable in ``settings.yml``:</span>
+
+<span class="sd">.. code:: yaml</span>
+
+<span class="sd"> enabled_plugins:</span>
+<span class="sd"> ..</span>
+<span class="sd"> - &#39;Unit converter plugin&#39;</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">babel.numbers</span>
+<span class="kn">from</span> <span class="nn">flask_babel</span> <span class="kn">import</span> <span class="n">gettext</span><span class="p">,</span> <span class="n">get_locale</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">data</span>
+
+
+<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;Unit converter plugin&quot;</span>
+<span class="n">description</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Convert between units&quot;</span><span class="p">)</span>
+<span class="n">default_on</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">plugin_id</span> <span class="o">=</span> <span class="s2">&quot;unit_converter&quot;</span>
+<span class="n">preference_section</span> <span class="o">=</span> <span class="s2">&quot;general&quot;</span>
+
+<span class="n">CONVERT_KEYWORDS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;in&quot;</span><span class="p">,</span> <span class="s2">&quot;to&quot;</span><span class="p">,</span> <span class="s2">&quot;as&quot;</span><span class="p">]</span>
+
+<span class="c1"># inspired from https://stackoverflow.com/a/42475086</span>
+<span class="n">RE_MEASURE</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;&#39;&#39;</span>
+<span class="s1">(?P&lt;sign&gt;[-+]?) # +/- or nothing for positive</span>
+<span class="s1">(\s*) # separator: white space or nothing</span>
+<span class="s1">(?P&lt;number&gt;[\d\.,]*) # number: 1,000.00 (en) or 1.000,00 (de)</span>
+<span class="s1">(?P&lt;E&gt;[eE][-+]?\d+)? # scientific notation: e(+/-)2 (*10^2)</span>
+<span class="s1">(\s*) # separator: white space or nothing</span>
+<span class="s1">(?P&lt;unit&gt;\S+) # unit of measure</span>
+<span class="s1">&#39;&#39;&#39;</span>
+
+
+<span class="n">ADDITIONAL_UNITS</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;si_name&quot;</span><span class="p">:</span> <span class="s2">&quot;Q11579&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;symbol&quot;</span><span class="p">:</span> <span class="s2">&quot;°C&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;to_si&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span> <span class="o">+</span> <span class="mf">273.15</span><span class="p">,</span>
+ <span class="s2">&quot;from_si&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">,</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;si_name&quot;</span><span class="p">:</span> <span class="s2">&quot;Q11579&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;symbol&quot;</span><span class="p">:</span> <span class="s2">&quot;°F&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;to_si&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">val</span><span class="p">:</span> <span class="p">(</span><span class="n">val</span> <span class="o">+</span> <span class="mf">459.67</span><span class="p">)</span> <span class="o">*</span> <span class="mi">5</span> <span class="o">/</span> <span class="mi">9</span><span class="p">,</span>
+ <span class="s2">&quot;from_si&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">val</span><span class="p">:</span> <span class="p">(</span><span class="n">val</span> <span class="o">*</span> <span class="mi">9</span> <span class="o">/</span> <span class="mi">5</span><span class="p">)</span> <span class="o">-</span> <span class="mf">459.67</span><span class="p">,</span>
+ <span class="p">},</span>
+<span class="p">]</span>
+<span class="sd">&quot;&quot;&quot;Additional items to convert from a measure unit to a SI unit (vice versa).</span>
+
+<span class="sd">.. code:: python</span>
+
+<span class="sd"> {</span>
+<span class="sd"> &quot;si_name&quot;: &quot;Q11579&quot;, # Wikidata item ID of the SI unit (Kelvin)</span>
+<span class="sd"> &quot;symbol&quot;: &quot;°C&quot;, # symbol of the measure unit</span>
+<span class="sd"> &quot;to_si&quot;: lambda val: val + 273.15, # convert measure value (val) to SI unit</span>
+<span class="sd"> &quot;from_si&quot;: lambda val: val - 273.15, # convert SI value (val) measure unit</span>
+<span class="sd"> },</span>
+<span class="sd"> {</span>
+<span class="sd"> &quot;si_name&quot;: &quot;Q11573&quot;,</span>
+<span class="sd"> &quot;symbol&quot;: &quot;mi&quot;,</span>
+<span class="sd"> &quot;to_si&quot;: 1609.344, # convert measure value (val) to SI unit</span>
+<span class="sd"> &quot;from_si&quot;: 1 / 1609.344 # convert SI value (val) measure unit</span>
+<span class="sd"> },</span>
+
+<span class="sd">The values of ``to_si`` and ``from_si`` can be of :py:obj:`float` (a multiplier)</span>
+<span class="sd">or a callable_ (val in / converted value returned).</span>
+
+<span class="sd">.. _callable: https://docs.python.org/3/glossary.html#term-callable</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+
+<span class="n">ALIAS_SYMBOLS</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;°C&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;C&#39;</span><span class="p">,),</span>
+ <span class="s1">&#39;°F&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;F&#39;</span><span class="p">,),</span>
+ <span class="s1">&#39;mi&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;L&#39;</span><span class="p">,),</span>
+<span class="p">}</span>
+<span class="sd">&quot;&quot;&quot;Alias symbols for known unit of measure symbols / by example::</span>
+
+<span class="sd"> &#39;°C&#39;: (&#39;C&#39;, ...), # list of alias symbols for °C (Q69362731)</span>
+<span class="sd"> &#39;°F&#39;: (&#39;F&#39;, ...), # list of alias symbols for °F (Q99490479)</span>
+<span class="sd"> &#39;mi&#39;: (&#39;L&#39;,), # list of alias symbols for mi (Q253276)</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+
+<span class="n">SYMBOL_TO_SI</span> <span class="o">=</span> <span class="p">[]</span>
+
+
+<div class="viewcode-block" id="symbol_to_si">
+<a class="viewcode-back" href="../../../src/searx.plugins.unit_converter.html#searx.plugins.unit_converter.symbol_to_si">[docs]</a>
+<span class="k">def</span> <span class="nf">symbol_to_si</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates a list of tuples, each tuple is a measure unit and the fields</span>
+<span class="sd"> in the tuple are:</span>
+
+<span class="sd"> 0. Symbol of the measure unit (e.g. &#39;mi&#39; for measure unit &#39;miles&#39; Q253276)</span>
+
+<span class="sd"> 1. SI name of the measure unit (e.g. Q11573 for SI unit &#39;metre&#39;)</span>
+
+<span class="sd"> 2. Factor to get SI value from measure unit (e.g. 1mi is equal to SI 1m</span>
+<span class="sd"> multiplied by 1609.344)</span>
+
+<span class="sd"> 3. Factor to get measure value from from SI value (e.g. SI 100m is equal to</span>
+<span class="sd"> 100mi divided by 1609.344)</span>
+
+<span class="sd"> The returned list is sorted, the first items are created from</span>
+<span class="sd"> ``WIKIDATA_UNITS``, the second group of items is build from</span>
+<span class="sd"> :py:obj:`ADDITIONAL_UNITS` and items created from :py:obj:`ALIAS_SYMBOLS`.</span>
+
+<span class="sd"> If you search this list for a symbol, then a match with a symbol from</span>
+<span class="sd"> Wikidata has the highest weighting (first hit in the list), followed by the</span>
+<span class="sd"> symbols from the :py:obj:`ADDITIONAL_UNITS` and the lowest weighting is</span>
+<span class="sd"> given to the symbols resulting from the aliases :py:obj:`ALIAS_SYMBOLS`.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">global</span> <span class="n">SYMBOL_TO_SI</span> <span class="c1"># pylint: disable=global-statement</span>
+ <span class="k">if</span> <span class="n">SYMBOL_TO_SI</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">SYMBOL_TO_SI</span>
+
+ <span class="c1"># filter out units which can&#39;t be normalized to a SI unit and filter out</span>
+ <span class="c1"># units without a symbol / arcsecond does not have a symbol</span>
+ <span class="c1"># https://www.wikidata.org/wiki/Q829073</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">WIKIDATA_UNITS</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;to_si_factor&#39;</span><span class="p">]</span> <span class="ow">and</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;symbol&#39;</span><span class="p">]:</span>
+ <span class="n">SYMBOL_TO_SI</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">(</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;symbol&#39;</span><span class="p">],</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;si_name&#39;</span><span class="p">],</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;to_si_factor&#39;</span><span class="p">],</span> <span class="c1"># from_si</span>
+ <span class="mi">1</span> <span class="o">/</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;to_si_factor&#39;</span><span class="p">],</span> <span class="c1"># to_si</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;symbol&#39;</span><span class="p">],</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">ADDITIONAL_UNITS</span><span class="p">:</span>
+ <span class="n">SYMBOL_TO_SI</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">(</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;symbol&#39;</span><span class="p">],</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;si_name&#39;</span><span class="p">],</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;from_si&#39;</span><span class="p">],</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;to_si&#39;</span><span class="p">],</span>
+ <span class="n">item</span><span class="p">[</span><span class="s1">&#39;symbol&#39;</span><span class="p">],</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="n">alias_items</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">SYMBOL_TO_SI</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">ALIAS_SYMBOLS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">()):</span>
+ <span class="n">alias_items</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="p">(</span>
+ <span class="n">alias</span><span class="p">,</span>
+ <span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
+ <span class="n">item</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="c1"># from_si</span>
+ <span class="n">item</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="c1"># to_si</span>
+ <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="c1"># origin unit</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+ <span class="n">SYMBOL_TO_SI</span> <span class="o">=</span> <span class="n">SYMBOL_TO_SI</span> <span class="o">+</span> <span class="n">alias_items</span>
+ <span class="k">return</span> <span class="n">SYMBOL_TO_SI</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">_parse_text_and_convert</span><span class="p">(</span><span class="n">search</span><span class="p">,</span> <span class="n">from_query</span><span class="p">,</span> <span class="n">to_query</span><span class="p">):</span>
+
+ <span class="c1"># pylint: disable=too-many-branches, too-many-locals</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">from_query</span> <span class="ow">and</span> <span class="n">to_query</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="n">measured</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">RE_MEASURE</span><span class="p">,</span> <span class="n">from_query</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">measured</span> <span class="ow">and</span> <span class="n">measured</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;number&#39;</span><span class="p">),</span> <span class="n">measured</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;unit&#39;</span><span class="p">)):</span>
+ <span class="k">return</span>
+
+ <span class="c1"># Symbols are not unique, if there are several hits for the from-unit, then</span>
+ <span class="c1"># the correct one must be determined by comparing it with the to-unit</span>
+ <span class="c1"># https://github.com/searxng/searxng/pull/3378#issuecomment-2080974863</span>
+
+ <span class="c1"># first: collecting possible units</span>
+
+ <span class="n">source_list</span><span class="p">,</span> <span class="n">target_list</span> <span class="o">=</span> <span class="p">[],</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">symbol</span><span class="p">,</span> <span class="n">si_name</span><span class="p">,</span> <span class="n">from_si</span><span class="p">,</span> <span class="n">to_si</span><span class="p">,</span> <span class="n">orig_symbol</span> <span class="ow">in</span> <span class="n">symbol_to_si</span><span class="p">():</span>
+
+ <span class="k">if</span> <span class="n">symbol</span> <span class="o">==</span> <span class="n">measured</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;unit&#39;</span><span class="p">):</span>
+ <span class="n">source_list</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">si_name</span><span class="p">,</span> <span class="n">to_si</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">symbol</span> <span class="o">==</span> <span class="n">to_query</span><span class="p">:</span>
+ <span class="n">target_list</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">si_name</span><span class="p">,</span> <span class="n">from_si</span><span class="p">,</span> <span class="n">orig_symbol</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">source_list</span> <span class="ow">and</span> <span class="n">target_list</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="n">source_to_si</span> <span class="o">=</span> <span class="n">target_from_si</span> <span class="o">=</span> <span class="n">target_symbol</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="c1"># second: find the right unit by comparing list of from-units with list of to-units</span>
+
+ <span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">source_list</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">target</span> <span class="ow">in</span> <span class="n">target_list</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">source</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">target</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> <span class="c1"># compare si_name</span>
+ <span class="n">source_to_si</span> <span class="o">=</span> <span class="n">source</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">target_from_si</span> <span class="o">=</span> <span class="n">target</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">target_symbol</span> <span class="o">=</span> <span class="n">target</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">source_to_si</span> <span class="ow">and</span> <span class="n">target_from_si</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="n">_locale</span> <span class="o">=</span> <span class="n">get_locale</span><span class="p">()</span> <span class="ow">or</span> <span class="s1">&#39;en_US&#39;</span>
+
+ <span class="n">value</span> <span class="o">=</span> <span class="n">measured</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;sign&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">measured</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;number&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">measured</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;E&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">value</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">parse_decimal</span><span class="p">(</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="c1"># convert value to SI unit</span>
+
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source_to_si</span><span class="p">,</span> <span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">)):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">*</span> <span class="n">source_to_si</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">source_to_si</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+
+ <span class="c1"># convert value from SI unit to target unit</span>
+
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">target_from_si</span><span class="p">,</span> <span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">)):</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">*</span> <span class="n">target_from_si</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">value</span> <span class="o">=</span> <span class="n">target_from_si</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="n">measured</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;E&#39;</span><span class="p">):</span>
+ <span class="c1"># when incomming notation is scientific, outgoing notation is scientific</span>
+ <span class="n">result</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_scientific</span><span class="p">(</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="k">else</span><span class="p">:</span>
+ <span class="n">result</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="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="s1">&#39;#,##0.##########;-#&#39;</span><span class="p">)</span>
+
+ <span class="n">search</span><span class="o">.</span><span class="n">result_container</span><span class="o">.</span><span class="n">answers</span><span class="p">[</span><span class="s1">&#39;conversion&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;answer&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">target_symbol</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">post_search</span><span class="p">(</span><span class="n">_request</span><span class="p">,</span> <span class="n">search</span><span class="p">):</span>
+ <span class="c1"># only convert between units on the first page</span>
+ <span class="k">if</span> <span class="n">search</span><span class="o">.</span><span class="n">search_query</span><span class="o">.</span><span class="n">pageno</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="n">query</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_query</span><span class="o">.</span><span class="n">query</span>
+ <span class="n">query_parts</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">query_parts</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="k">for</span> <span class="n">query_part</span> <span class="ow">in</span> <span class="n">query_parts</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">keyword</span> <span class="ow">in</span> <span class="n">CONVERT_KEYWORDS</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">query_part</span> <span class="o">==</span> <span class="n">keyword</span><span class="p">:</span>
+ <span class="n">from_query</span><span class="p">,</span> <span class="n">to_query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">keyword</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="n">_parse_text_and_convert</span><span class="p">(</span><span class="n">search</span><span class="p">,</span> <span class="n">from_query</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">to_query</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="k">return</span> <span class="kc">True</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/redislib.html b/_modules/searx/redislib.html
new file mode 100644
index 000000000..c00a81e44
--- /dev/null
+++ b/_modules/searx/redislib.html
@@ -0,0 +1,366 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.redislib &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.redislib</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.redislib</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;A collection of convenient functions and redis/lua scripts.</span>
+
+<span class="sd">This code was partial inspired by the `Bullet-Proofing Lua Scripts in RedisPy`_</span>
+<span class="sd">article.</span>
+
+<span class="sd">.. _Bullet-Proofing Lua Scripts in RedisPy:</span>
+<span class="sd"> https://redis.com/blog/bullet-proofing-lua-scripts-in-redispy/</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">hmac</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">get_setting</span>
+
+<span class="n">LUA_SCRIPT_STORAGE</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="sd">&quot;&quot;&quot;A global dictionary to cache client&#39;s ``Script`` objects, used by</span>
+<span class="sd">:py:obj:`lua_script_storage`&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="lua_script_storage">
+<a class="viewcode-back" href="../../src/searx.redislib.html#searx.redislib.lua_script_storage">[docs]</a>
+<span class="k">def</span> <span class="nf">lua_script_storage</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">script</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a redis :py:obj:`Script</span>
+<span class="sd"> &lt;redis.commands.core.CoreCommands.register_script&gt;` instance.</span>
+
+<span class="sd"> Due to performance reason the ``Script`` object is instantiated only once</span>
+<span class="sd"> for a client (``client.register_script(..)``) and is cached in</span>
+<span class="sd"> :py:obj:`LUA_SCRIPT_STORAGE`.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="c1"># redis connection can be closed, lets use the id() of the redis connector</span>
+ <span class="c1"># as key in the script-storage:</span>
+ <span class="n">client_id</span> <span class="o">=</span> <span class="nb">id</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">LUA_SCRIPT_STORAGE</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">client_id</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">LUA_SCRIPT_STORAGE</span><span class="p">[</span><span class="n">client_id</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">if</span> <span class="n">LUA_SCRIPT_STORAGE</span><span class="p">[</span><span class="n">client_id</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">script</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">LUA_SCRIPT_STORAGE</span><span class="p">[</span><span class="n">client_id</span><span class="p">][</span><span class="n">script</span><span class="p">]</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">register_script</span><span class="p">(</span><span class="n">script</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">LUA_SCRIPT_STORAGE</span><span class="p">[</span><span class="n">client_id</span><span class="p">][</span><span class="n">script</span><span class="p">]</span></div>
+
+
+
+<span class="n">PURGE_BY_PREFIX</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">local prefix = tostring(ARGV[1])</span>
+<span class="s2">for i, name in ipairs(redis.call(&#39;KEYS&#39;, prefix .. &#39;*&#39;)) do</span>
+<span class="s2"> redis.call(&#39;EXPIRE&#39;, name, 0)</span>
+<span class="s2">end</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="purge_by_prefix">
+<a class="viewcode-back" href="../../src/searx.redislib.html#searx.redislib.purge_by_prefix">[docs]</a>
+<span class="k">def</span> <span class="nf">purge_by_prefix</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">prefix</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;SearXNG_&quot;</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Purge all keys with ``prefix`` from database.</span>
+
+<span class="sd"> Queries all keys in the database by the given prefix and set expire time to</span>
+<span class="sd"> zero. The default prefix will drop all keys which has been set by SearXNG</span>
+<span class="sd"> (drops SearXNG schema entirely from database).</span>
+
+<span class="sd"> The implementation is the lua script from string :py:obj:`PURGE_BY_PREFIX`.</span>
+<span class="sd"> The lua script uses EXPIRE_ instead of DEL_: if there are a lot keys to</span>
+<span class="sd"> delete and/or their values are big, `DEL` could take more time and blocks</span>
+<span class="sd"> the command loop while `EXPIRE` turns back immediate.</span>
+
+<span class="sd"> :param prefix: prefix of the key to delete (default: ``SearXNG_``)</span>
+<span class="sd"> :type name: str</span>
+
+<span class="sd"> .. _EXPIRE: https://redis.io/commands/expire/</span>
+<span class="sd"> .. _DEL: https://redis.io/commands/del/</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">script</span> <span class="o">=</span> <span class="n">lua_script_storage</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">PURGE_BY_PREFIX</span><span class="p">)</span>
+ <span class="n">script</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="p">[</span><span class="n">prefix</span><span class="p">])</span></div>
+
+
+
+<div class="viewcode-block" id="secret_hash">
+<a class="viewcode-back" href="../../src/searx.redislib.html#searx.redislib.secret_hash">[docs]</a>
+<span class="k">def</span> <span class="nf">secret_hash</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Creates a hash of the ``name``.</span>
+
+<span class="sd"> Combines argument ``name`` with the ``secret_key`` from :ref:`settings</span>
+<span class="sd"> server`. This function can be used to get a more anonymized name of a Redis</span>
+<span class="sd"> KEY.</span>
+
+<span class="sd"> :param name: the name to create a secret hash for</span>
+<span class="sd"> :type name: str</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m</span> <span class="o">=</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">bytes</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">),</span> <span class="n">digestmod</span><span class="o">=</span><span class="s1">&#39;sha256&#39;</span><span class="p">)</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">bytes</span><span class="p">(</span><span class="n">get_setting</span><span class="p">(</span><span class="s1">&#39;server.secret_key&#39;</span><span class="p">),</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">m</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span></div>
+
+
+
+<span class="n">INCR_COUNTER</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">local limit = tonumber(ARGV[1])</span>
+<span class="s2">local expire = tonumber(ARGV[2])</span>
+<span class="s2">local c_name = KEYS[1]</span>
+
+<span class="s2">local c = redis.call(&#39;GET&#39;, c_name)</span>
+
+<span class="s2">if not c then</span>
+<span class="s2"> c = redis.call(&#39;INCR&#39;, c_name)</span>
+<span class="s2"> if expire &gt; 0 then</span>
+<span class="s2"> redis.call(&#39;EXPIRE&#39;, c_name, expire)</span>
+<span class="s2"> end</span>
+<span class="s2">else</span>
+<span class="s2"> c = tonumber(c)</span>
+<span class="s2"> if limit == 0 or c &lt; limit then</span>
+<span class="s2"> c = redis.call(&#39;INCR&#39;, c_name)</span>
+<span class="s2"> end</span>
+<span class="s2">end</span>
+<span class="s2">return c</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="incr_counter">
+<a class="viewcode-back" href="../../src/searx.redislib.html#searx.redislib.incr_counter">[docs]</a>
+<span class="k">def</span> <span class="nf">incr_counter</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">limit</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">expire</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Increment a counter and return the new value.</span>
+
+<span class="sd"> If counter with redis key ``SearXNG_counter_&lt;name&gt;`` does not exists it is</span>
+<span class="sd"> created with initial value 1 returned. The replacement ``&lt;name&gt;`` is a</span>
+<span class="sd"> *secret hash* of the value from argument ``name`` (see</span>
+<span class="sd"> :py:func:`secret_hash`).</span>
+
+<span class="sd"> The implementation of the redis counter is the lua script from string</span>
+<span class="sd"> :py:obj:`INCR_COUNTER`.</span>
+
+<span class="sd"> :param name: name of the counter</span>
+<span class="sd"> :type name: str</span>
+
+<span class="sd"> :param expire: live-time of the counter in seconds (default ``None`` means</span>
+<span class="sd"> infinite).</span>
+<span class="sd"> :type expire: int / see EXPIRE_</span>
+
+<span class="sd"> :param limit: limit where the counter stops to increment (default ``None``)</span>
+<span class="sd"> :type limit: int / limit is 2^64 see INCR_</span>
+
+<span class="sd"> :return: value of the incremented counter</span>
+<span class="sd"> :type return: int</span>
+
+<span class="sd"> .. _EXPIRE: https://redis.io/commands/expire/</span>
+<span class="sd"> .. _INCR: https://redis.io/commands/incr/</span>
+
+<span class="sd"> A simple demo of a counter with expire time and limit::</span>
+
+<span class="sd"> &gt;&gt;&gt; for i in range(6):</span>
+<span class="sd"> ... i, incr_counter(client, &quot;foo&quot;, 3, 5) # max 3, duration 5 sec</span>
+<span class="sd"> ... time.sleep(1) # from the third call on max has been reached</span>
+<span class="sd"> ...</span>
+<span class="sd"> (0, 1)</span>
+<span class="sd"> (1, 2)</span>
+<span class="sd"> (2, 3)</span>
+<span class="sd"> (3, 3)</span>
+<span class="sd"> (4, 3)</span>
+<span class="sd"> (5, 1)</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">script</span> <span class="o">=</span> <span class="n">lua_script_storage</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">INCR_COUNTER</span><span class="p">)</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;SearXNG_counter_&quot;</span> <span class="o">+</span> <span class="n">secret_hash</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">script</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="p">[</span><span class="n">limit</span><span class="p">,</span> <span class="n">expire</span><span class="p">],</span> <span class="n">keys</span><span class="o">=</span><span class="p">[</span><span class="n">name</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">c</span></div>
+
+
+
+<div class="viewcode-block" id="drop_counter">
+<a class="viewcode-back" href="../../src/searx.redislib.html#searx.redislib.drop_counter">[docs]</a>
+<span class="k">def</span> <span class="nf">drop_counter</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Drop counter with redis key ``SearXNG_counter_&lt;name&gt;``</span>
+
+<span class="sd"> The replacement ``&lt;name&gt;`` is a *secret hash* of the value from argument</span>
+<span class="sd"> ``name`` (see :py:func:`incr_counter` and :py:func:`incr_sliding_window`).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;SearXNG_counter_&quot;</span> <span class="o">+</span> <span class="n">secret_hash</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">client</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></div>
+
+
+
+<span class="n">INCR_SLIDING_WINDOW</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">local expire = tonumber(ARGV[1])</span>
+<span class="s2">local name = KEYS[1]</span>
+<span class="s2">local current_time = redis.call(&#39;TIME&#39;)</span>
+
+<span class="s2">redis.call(&#39;ZREMRANGEBYSCORE&#39;, name, 0, current_time[1] - expire)</span>
+<span class="s2">redis.call(&#39;ZADD&#39;, name, current_time[1], current_time[1] .. current_time[2])</span>
+<span class="s2">local result = redis.call(&#39;ZCOUNT&#39;, name, 0, current_time[1] + 1)</span>
+<span class="s2">redis.call(&#39;EXPIRE&#39;, name, expire)</span>
+<span class="s2">return result</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="incr_sliding_window">
+<a class="viewcode-back" href="../../src/searx.redislib.html#searx.redislib.incr_sliding_window">[docs]</a>
+<span class="k">def</span> <span class="nf">incr_sliding_window</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">duration</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Increment a sliding-window counter and return the new value.</span>
+
+<span class="sd"> If counter with redis key ``SearXNG_counter_&lt;name&gt;`` does not exists it is</span>
+<span class="sd"> created with initial value 1 returned. The replacement ``&lt;name&gt;`` is a</span>
+<span class="sd"> *secret hash* of the value from argument ``name`` (see</span>
+<span class="sd"> :py:func:`secret_hash`).</span>
+
+<span class="sd"> :param name: name of the counter</span>
+<span class="sd"> :type name: str</span>
+
+<span class="sd"> :param duration: live-time of the sliding window in seconds</span>
+<span class="sd"> :typeduration: int</span>
+
+<span class="sd"> :return: value of the incremented counter</span>
+<span class="sd"> :type return: int</span>
+
+<span class="sd"> The implementation of the redis counter is the lua script from string</span>
+<span class="sd"> :py:obj:`INCR_SLIDING_WINDOW`. The lua script uses `sorted sets in Redis`_</span>
+<span class="sd"> to implement a sliding window for the redis key ``SearXNG_counter_&lt;name&gt;``</span>
+<span class="sd"> (ZADD_). The current TIME_ is used to score the items in the sorted set and</span>
+<span class="sd"> the time window is moved by removing items with a score lower current time</span>
+<span class="sd"> minus *duration* time (ZREMRANGEBYSCORE_).</span>
+
+<span class="sd"> The EXPIRE_ time (the duration of the sliding window) is refreshed on each</span>
+<span class="sd"> call (increment) and if there is no call in this duration, the sorted</span>
+<span class="sd"> set expires from the redis DB.</span>
+
+<span class="sd"> The return value is the amount of items in the sorted set (ZCOUNT_), what</span>
+<span class="sd"> means the number of calls in the sliding window.</span>
+
+<span class="sd"> .. _Sorted sets in Redis:</span>
+<span class="sd"> https://redis.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-5-sorted-sets-in-redis/</span>
+<span class="sd"> .. _TIME: https://redis.io/commands/time/</span>
+<span class="sd"> .. _ZADD: https://redis.io/commands/zadd/</span>
+<span class="sd"> .. _EXPIRE: https://redis.io/commands/expire/</span>
+<span class="sd"> .. _ZREMRANGEBYSCORE: https://redis.io/commands/zremrangebyscore/</span>
+<span class="sd"> .. _ZCOUNT: https://redis.io/commands/zcount/</span>
+
+<span class="sd"> A simple demo of the sliding window::</span>
+
+<span class="sd"> &gt;&gt;&gt; for i in range(5):</span>
+<span class="sd"> ... incr_sliding_window(client, &quot;foo&quot;, 3) # duration 3 sec</span>
+<span class="sd"> ... time.sleep(1) # from the third call (second) on the window is moved</span>
+<span class="sd"> ...</span>
+<span class="sd"> 1</span>
+<span class="sd"> 2</span>
+<span class="sd"> 3</span>
+<span class="sd"> 3</span>
+<span class="sd"> 3</span>
+<span class="sd"> &gt;&gt;&gt; time.sleep(3) # wait until expire</span>
+<span class="sd"> &gt;&gt;&gt; incr_sliding_window(client, &quot;foo&quot;, 3)</span>
+<span class="sd"> 1</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">script</span> <span class="o">=</span> <span class="n">lua_script_storage</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">INCR_SLIDING_WINDOW</span><span class="p">)</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;SearXNG_counter_&quot;</span> <span class="o">+</span> <span class="n">secret_hash</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">script</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="p">[</span><span class="n">duration</span><span class="p">],</span> <span class="n">keys</span><span class="o">=</span><span class="p">[</span><span class="n">name</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">c</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search.html b/_modules/searx/search.html
new file mode 100644
index 000000000..53fe5f572
--- /dev/null
+++ b/_modules/searx/search.html
@@ -0,0 +1,333 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search</h1><div class="highlight"><pre>
+<span></span><span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="c1"># pylint: disable=missing-module-docstring, too-few-public-methods</span>
+
+<span class="kn">import</span> <span class="nn">threading</span>
+<span class="kn">from</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="n">copy</span>
+<span class="kn">from</span> <span class="nn">timeit</span> <span class="kn">import</span> <span class="n">default_timer</span>
+<span class="kn">from</span> <span class="nn">uuid</span> <span class="kn">import</span> <span class="n">uuid4</span>
+
+<span class="kn">import</span> <span class="nn">flask</span>
+<span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">copy_current_request_context</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">settings</span>
+<span class="kn">from</span> <span class="nn">searx.answerers</span> <span class="kn">import</span> <span class="n">ask</span>
+<span class="kn">from</span> <span class="nn">searx.external_bang</span> <span class="kn">import</span> <span class="n">get_bang_url</span>
+<span class="kn">from</span> <span class="nn">searx.results</span> <span class="kn">import</span> <span class="n">ResultContainer</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">logger</span>
+<span class="kn">from</span> <span class="nn">searx.plugins</span> <span class="kn">import</span> <span class="n">plugins</span>
+<span class="kn">from</span> <span class="nn">searx.search.models</span> <span class="kn">import</span> <span class="n">EngineRef</span><span class="p">,</span> <span class="n">SearchQuery</span>
+<span class="kn">from</span> <span class="nn">searx.engines</span> <span class="kn">import</span> <span class="n">load_engines</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">initialize</span> <span class="k">as</span> <span class="n">initialize_network</span><span class="p">,</span> <span class="n">check_network_configuration</span>
+<span class="kn">from</span> <span class="nn">searx.metrics</span> <span class="kn">import</span> <span class="n">initialize</span> <span class="k">as</span> <span class="n">initialize_metrics</span><span class="p">,</span> <span class="n">counter_inc</span><span class="p">,</span> <span class="n">histogram_observe_time</span>
+<span class="kn">from</span> <span class="nn">searx.search.processors</span> <span class="kn">import</span> <span class="n">PROCESSORS</span><span class="p">,</span> <span class="n">initialize</span> <span class="k">as</span> <span class="n">initialize_processors</span>
+<span class="kn">from</span> <span class="nn">searx.search.checker</span> <span class="kn">import</span> <span class="n">initialize</span> <span class="k">as</span> <span class="n">initialize_checker</span>
+
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;search&#39;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">settings_engines</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">enable_checker</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">check_network</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">enable_metrics</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="n">settings_engines</span> <span class="o">=</span> <span class="n">settings_engines</span> <span class="ow">or</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;engines&#39;</span><span class="p">]</span>
+ <span class="n">load_engines</span><span class="p">(</span><span class="n">settings_engines</span><span class="p">)</span>
+ <span class="n">initialize_network</span><span class="p">(</span><span class="n">settings_engines</span><span class="p">,</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;outgoing&#39;</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">check_network</span><span class="p">:</span>
+ <span class="n">check_network_configuration</span><span class="p">()</span>
+ <span class="n">initialize_metrics</span><span class="p">([</span><span class="n">engine</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">engine</span> <span class="ow">in</span> <span class="n">settings_engines</span><span class="p">],</span> <span class="n">enable_metrics</span><span class="p">)</span>
+ <span class="n">initialize_processors</span><span class="p">(</span><span class="n">settings_engines</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">enable_checker</span><span class="p">:</span>
+ <span class="n">initialize_checker</span><span class="p">()</span>
+
+
+<div class="viewcode-block" id="Search">
+<a class="viewcode-back" href="../../src/searx.search.html#searx.search.Search">[docs]</a>
+<span class="k">class</span> <span class="nc">Search</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Search information container&quot;&quot;&quot;</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="s2">&quot;search_query&quot;</span><span class="p">,</span> <span class="s2">&quot;result_container&quot;</span><span class="p">,</span> <span class="s2">&quot;start_time&quot;</span><span class="p">,</span> <span class="s2">&quot;actual_timeout&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_query</span><span class="p">:</span> <span class="n">SearchQuery</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initialize the Search&quot;&quot;&quot;</span>
+ <span class="c1"># init vars</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">search_query</span> <span class="o">=</span> <span class="n">search_query</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span> <span class="o">=</span> <span class="n">ResultContainer</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">start_time</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">actual_timeout</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">def</span> <span class="nf">search_external_bang</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Check if there is a external bang.</span>
+<span class="sd"> If yes, update self.result_container and return True</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_query</span><span class="o">.</span><span class="n">external_bang</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span><span class="o">.</span><span class="n">redirect_url</span> <span class="o">=</span> <span class="n">get_bang_url</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">search_query</span><span class="p">)</span>
+
+ <span class="c1"># This means there was a valid bang and the</span>
+ <span class="c1"># rest of the search does not need to be continued</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">result_container</span><span class="o">.</span><span class="n">redirect_url</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">True</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="k">def</span> <span class="nf">search_answerers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Check if an answer return a result.</span>
+<span class="sd"> If yes, update self.result_container and return True</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">answerers_results</span> <span class="o">=</span> <span class="n">ask</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">search_query</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">answerers_results</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">results</span> <span class="ow">in</span> <span class="n">answerers_results</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="s1">&#39;answer&#39;</span><span class="p">,</span> <span class="n">results</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">True</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+ <span class="c1"># do search-request</span>
+ <span class="k">def</span> <span class="nf">_get_requests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># init vars</span>
+ <span class="n">requests</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="c1"># max of all selected engine timeout</span>
+ <span class="n">default_timeout</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="c1"># start search-request for all selected engines</span>
+ <span class="k">for</span> <span class="n">engineref</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_query</span><span class="o">.</span><span class="n">engineref_list</span><span class="p">:</span>
+ <span class="n">processor</span> <span class="o">=</span> <span class="n">PROCESSORS</span><span class="p">[</span><span class="n">engineref</span><span class="o">.</span><span class="n">name</span><span class="p">]</span>
+
+ <span class="c1"># stop the request now if the engine is suspend</span>
+ <span class="k">if</span> <span class="n">processor</span><span class="o">.</span><span class="n">extend_container_if_suspended</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">result_container</span><span class="p">):</span>
+ <span class="k">continue</span>
+
+ <span class="c1"># set default request parameters</span>
+ <span class="n">request_params</span> <span class="o">=</span> <span class="n">processor</span><span class="o">.</span><span class="n">get_params</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">search_query</span><span class="p">,</span> <span class="n">engineref</span><span class="o">.</span><span class="n">category</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">request_params</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">counter_inc</span><span class="p">(</span><span class="s1">&#39;engine&#39;</span><span class="p">,</span> <span class="n">engineref</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;search&#39;</span><span class="p">,</span> <span class="s1">&#39;count&#39;</span><span class="p">,</span> <span class="s1">&#39;sent&#39;</span><span class="p">)</span>
+
+ <span class="c1"># append request to list</span>
+ <span class="n">requests</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">engineref</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_query</span><span class="o">.</span><span class="n">query</span><span class="p">,</span> <span class="n">request_params</span><span class="p">))</span>
+
+ <span class="c1"># update default_timeout</span>
+ <span class="n">default_timeout</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">default_timeout</span><span class="p">,</span> <span class="n">processor</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+
+ <span class="c1"># adjust timeout</span>
+ <span class="n">max_request_timeout</span> <span class="o">=</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;outgoing&#39;</span><span class="p">][</span><span class="s1">&#39;max_request_timeout&#39;</span><span class="p">]</span>
+ <span class="n">actual_timeout</span> <span class="o">=</span> <span class="n">default_timeout</span>
+ <span class="n">query_timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_query</span><span class="o">.</span><span class="n">timeout_limit</span>
+
+ <span class="k">if</span> <span class="n">max_request_timeout</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">query_timeout</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># No max, no user query: default_timeout</span>
+ <span class="k">pass</span>
+ <span class="k">elif</span> <span class="n">max_request_timeout</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">query_timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># No max, but user query: From user query except if above default</span>
+ <span class="n">actual_timeout</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">default_timeout</span><span class="p">,</span> <span class="n">query_timeout</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">max_request_timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">query_timeout</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># Max, no user query: Default except if above max</span>
+ <span class="n">actual_timeout</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">default_timeout</span><span class="p">,</span> <span class="n">max_request_timeout</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">max_request_timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">query_timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># Max &amp; user query: From user query except if above max</span>
+ <span class="n">actual_timeout</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">query_timeout</span><span class="p">,</span> <span class="n">max_request_timeout</span><span class="p">)</span>
+
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
+ <span class="s2">&quot;actual_timeout=</span><span class="si">{0}</span><span class="s2"> (default_timeout=</span><span class="si">{1}</span><span class="s2">, ?timeout_limit=</span><span class="si">{2}</span><span class="s2">, max_request_timeout=</span><span class="si">{3}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">actual_timeout</span><span class="p">,</span> <span class="n">default_timeout</span><span class="p">,</span> <span class="n">query_timeout</span><span class="p">,</span> <span class="n">max_request_timeout</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">requests</span><span class="p">,</span> <span class="n">actual_timeout</span>
+
+ <span class="k">def</span> <span class="nf">search_multiple_requests</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">requests</span><span class="p">):</span>
+ <span class="c1"># pylint: disable=protected-access</span>
+ <span class="n">search_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid4</span><span class="p">())</span>
+
+ <span class="k">for</span> <span class="n">engine_name</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">request_params</span> <span class="ow">in</span> <span class="n">requests</span><span class="p">:</span>
+ <span class="n">_search</span> <span class="o">=</span> <span class="n">copy_current_request_context</span><span class="p">(</span><span class="n">PROCESSORS</span><span class="p">[</span><span class="n">engine_name</span><span class="p">]</span><span class="o">.</span><span class="n">search</span><span class="p">)</span>
+ <span class="n">th</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span> <span class="c1"># pylint: disable=invalid-name</span>
+ <span class="n">target</span><span class="o">=</span><span class="n">_search</span><span class="p">,</span>
+ <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">request_params</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_time</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">actual_timeout</span><span class="p">),</span>
+ <span class="n">name</span><span class="o">=</span><span class="n">search_id</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="n">th</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="n">th</span><span class="o">.</span><span class="n">_engine_name</span> <span class="o">=</span> <span class="n">engine_name</span>
+ <span class="n">th</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
+
+ <span class="k">for</span> <span class="n">th</span> <span class="ow">in</span> <span class="n">threading</span><span class="o">.</span><span class="n">enumerate</span><span class="p">():</span> <span class="c1"># pylint: disable=invalid-name</span>
+ <span class="k">if</span> <span class="n">th</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">search_id</span><span class="p">:</span>
+ <span class="n">remaining_time</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">actual_timeout</span> <span class="o">-</span> <span class="p">(</span><span class="n">default_timer</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_time</span><span class="p">))</span>
+ <span class="n">th</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">remaining_time</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">th</span><span class="o">.</span><span class="n">is_alive</span><span class="p">():</span>
+ <span class="n">th</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="kc">True</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span><span class="o">.</span><span class="n">add_unresponsive_engine</span><span class="p">(</span><span class="n">th</span><span class="o">.</span><span class="n">_engine_name</span><span class="p">,</span> <span class="s1">&#39;timeout&#39;</span><span class="p">)</span>
+ <span class="n">PROCESSORS</span><span class="p">[</span><span class="n">th</span><span class="o">.</span><span class="n">_engine_name</span><span class="p">]</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;engine timeout&#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">search_standard</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Update self.result_container, self.actual_timeout</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">requests</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">actual_timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_requests</span><span class="p">()</span>
+
+ <span class="c1"># send all search-request</span>
+ <span class="k">if</span> <span class="n">requests</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">search_multiple_requests</span><span class="p">(</span><span class="n">requests</span><span class="p">)</span>
+
+ <span class="c1"># return results, suggestions, answers and infoboxes</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="c1"># do search-request</span>
+<div class="viewcode-block" id="Search.search">
+<a class="viewcode-back" href="../../src/searx.search.html#searx.search.Search.search">[docs]</a>
+ <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">ResultContainer</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">start_time</span> <span class="o">=</span> <span class="n">default_timer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_external_bang</span><span class="p">():</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_answerers</span><span class="p">():</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">search_standard</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span></div>
+</div>
+
+
+
+<div class="viewcode-block" id="SearchWithPlugins">
+<a class="viewcode-back" href="../../src/searx.search.html#searx.search.SearchWithPlugins">[docs]</a>
+<span class="k">class</span> <span class="nc">SearchWithPlugins</span><span class="p">(</span><span class="n">Search</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Inherit from the Search class, add calls to the plugins.&quot;&quot;&quot;</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="s1">&#39;ordered_plugin_list&#39;</span><span class="p">,</span> <span class="s1">&#39;request&#39;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_query</span><span class="p">:</span> <span class="n">SearchQuery</span><span class="p">,</span> <span class="n">ordered_plugin_list</span><span class="p">,</span> <span class="n">request</span><span class="p">:</span> <span class="n">flask</span><span class="o">.</span><span class="n">Request</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">search_query</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ordered_plugin_list</span> <span class="o">=</span> <span class="n">ordered_plugin_list</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span><span class="o">.</span><span class="n">on_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_on_result</span>
+ <span class="c1"># pylint: disable=line-too-long</span>
+ <span class="c1"># get the &quot;real&quot; request to use it outside the Flask context.</span>
+ <span class="c1"># see</span>
+ <span class="c1"># * https://github.com/pallets/flask/blob/d01d26e5210e3ee4cbbdef12f05c886e08e92852/src/flask/globals.py#L55</span>
+ <span class="c1"># * https://github.com/pallets/werkzeug/blob/3c5d3c9bd0d9ce64590f0af8997a38f3823b368d/src/werkzeug/local.py#L548-L559</span>
+ <span class="c1"># * https://werkzeug.palletsprojects.com/en/2.0.x/local/#werkzeug.local.LocalProxy._get_current_object</span>
+ <span class="c1"># pylint: enable=line-too-long</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">_get_current_object</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">_on_result</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">plugins</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ordered_plugin_list</span><span class="p">,</span> <span class="s1">&#39;on_result&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
+
+<div class="viewcode-block" id="SearchWithPlugins.search">
+<a class="viewcode-back" href="../../src/searx.search.html#searx.search.SearchWithPlugins.search">[docs]</a>
+ <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">ResultContainer</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">plugins</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ordered_plugin_list</span><span class="p">,</span> <span class="s1">&#39;pre_search&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">search</span><span class="p">()</span>
+
+ <span class="n">plugins</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ordered_plugin_list</span><span class="p">,</span> <span class="s1">&#39;post_search&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">result_container</span></div>
+</div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search/models.html b/_modules/searx/search/models.html
new file mode 100644
index 000000000..9c6249c4e
--- /dev/null
+++ b/_modules/searx/search/models.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search.models &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../search.html" accesskey="U">searx.search</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search.models</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search.models</h1><div class="highlight"><pre>
+<span></span><span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="c1"># pylint: disable=missing-module-docstring</span>
+
+<span class="kn">import</span> <span class="nn">typing</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+
+<div class="viewcode-block" id="EngineRef">
+<a class="viewcode-back" href="../../../src/searx.search.html#searx.search.EngineRef">[docs]</a>
+<span class="k">class</span> <span class="nc">EngineRef</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Reference by names to an engine and category&quot;&quot;&quot;</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="s1">&#39;category&#39;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">category</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">category</span> <span class="o">=</span> <span class="n">category</span>
+
+ <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;EngineRef(</span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">category</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</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="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">category</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">category</span>
+
+ <span class="k">def</span> <span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">category</span><span class="p">))</span></div>
+
+
+
+<div class="viewcode-block" id="SearchQuery">
+<a class="viewcode-back" href="../../../src/searx.search.html#searx.search.SearchQuery">[docs]</a>
+<span class="k">class</span> <span class="nc">SearchQuery</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;container for all the search parameters (query, language, etc...)&quot;&quot;&quot;</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="s1">&#39;query&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;engineref_list&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;lang&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;locale&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;safesearch&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;pageno&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;time_range&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;timeout_limit&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;external_bang&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;engine_data&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;redirect_to_first_result&#39;</span><span class="p">,</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
+ <span class="bp">self</span><span class="p">,</span>
+ <span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
+ <span class="n">engineref_list</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">EngineRef</span><span class="p">],</span>
+ <span class="n">lang</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;all&#39;</span><span class="p">,</span>
+ <span class="n">safesearch</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
+ <span class="n">pageno</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="n">time_range</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">timeout_limit</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">external_bang</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">engine_data</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">typing</span><span class="o">.</span><span class="n">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="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">redirect_to_first_result</span><span class="p">:</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="p">):</span> <span class="c1"># pylint:disable=too-many-arguments</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">query</span> <span class="o">=</span> <span class="n">query</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engineref_list</span> <span class="o">=</span> <span class="n">engineref_list</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">lang</span> <span class="o">=</span> <span class="n">lang</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">safesearch</span> <span class="o">=</span> <span class="n">safesearch</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pageno</span> <span class="o">=</span> <span class="n">pageno</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">time_range</span> <span class="o">=</span> <span class="n">time_range</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout_limit</span> <span class="o">=</span> <span class="n">timeout_limit</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">external_bang</span> <span class="o">=</span> <span class="n">external_bang</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine_data</span> <span class="o">=</span> <span class="n">engine_data</span> <span class="ow">or</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">redirect_to_first_result</span> <span class="o">=</span> <span class="n">redirect_to_first_result</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">locale</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lang</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</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="bp">self</span><span class="o">.</span><span class="n">lang</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">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">categories</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">engineref</span><span class="p">:</span> <span class="n">engineref</span><span class="o">.</span><span class="n">category</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">engineref_list</span><span class="p">)))</span>
+
+ <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;SearchQuery(</span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">, </span><span class="si">{!r}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engineref_list</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">lang</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">safesearch</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pageno</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">time_range</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout_limit</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">external_bang</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">redirect_to_first_result</span><span class="p">,</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">query</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">query</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">engineref_list</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">engineref_list</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">lang</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">lang</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">safesearch</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">safesearch</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">pageno</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">pageno</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">time_range</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">time_range</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout_limit</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">timeout_limit</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">external_bang</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">external_bang</span>
+ <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">redirect_to_first_result</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">redirect_to_first_result</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">hash</span><span class="p">(</span>
+ <span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">,</span>
+ <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engineref_list</span><span class="p">),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">lang</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">safesearch</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pageno</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">time_range</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout_limit</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">external_bang</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">redirect_to_first_result</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">SearchQuery</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engineref_list</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">lang</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">safesearch</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pageno</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">time_range</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout_limit</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">external_bang</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine_data</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">redirect_to_first_result</span><span class="p">,</span>
+ <span class="p">)</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+ <ul>
+ <li><a href="../search.html">searx.search</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search/processors/abstract.html b/_modules/searx/search/processors/abstract.html
new file mode 100644
index 000000000..136624bfe
--- /dev/null
+++ b/_modules/searx/search/processors/abstract.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search.processors.abstract &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../../search.html" accesskey="U">searx.search</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search.processors.abstract</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search.processors.abstract</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;Abstract base classes for engine request processors.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">threading</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span><span class="p">,</span> <span class="n">ABC</span>
+<span class="kn">from</span> <span class="nn">timeit</span> <span class="kn">import</span> <span class="n">default_timer</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Union</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">settings</span><span class="p">,</span> <span class="n">logger</span>
+<span class="kn">from</span> <span class="nn">searx.engines</span> <span class="kn">import</span> <span class="n">engines</span>
+<span class="kn">from</span> <span class="nn">searx.network</span> <span class="kn">import</span> <span class="n">get_time_for_thread</span><span class="p">,</span> <span class="n">get_network</span>
+<span class="kn">from</span> <span class="nn">searx.metrics</span> <span class="kn">import</span> <span class="n">histogram_observe</span><span class="p">,</span> <span class="n">counter_inc</span><span class="p">,</span> <span class="n">count_exception</span><span class="p">,</span> <span class="n">count_error</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxEngineAccessDeniedException</span><span class="p">,</span> <span class="n">SearxEngineResponseException</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">get_engine_from_settings</span>
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;searx.search.processor&#39;</span><span class="p">)</span>
+<span class="n">SUSPENDED_STATUS</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">],</span> <span class="s1">&#39;SuspendedStatus&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+
+
+<div class="viewcode-block" id="SuspendedStatus">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.abstract.SuspendedStatus">[docs]</a>
+<span class="k">class</span> <span class="nc">SuspendedStatus</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class to handle suspend state.&quot;&quot;&quot;</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="s1">&#39;suspend_end_time&#39;</span><span class="p">,</span> <span class="s1">&#39;suspend_reason&#39;</span><span class="p">,</span> <span class="s1">&#39;continuous_errors&#39;</span><span class="p">,</span> <span class="s1">&#39;lock&#39;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">continuous_errors</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspend_end_time</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspend_reason</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">is_suspended</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">suspend_end_time</span> <span class="o">&gt;=</span> <span class="n">default_timer</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">suspend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">suspended_time</span><span class="p">,</span> <span class="n">suspend_reason</span><span class="p">):</span>
+ <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
+ <span class="c1"># update continuous_errors / suspend_end_time</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">continuous_errors</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">suspended_time</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">suspended_time</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span>
+ <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;search&#39;</span><span class="p">][</span><span class="s1">&#39;max_ban_time_on_fail&#39;</span><span class="p">],</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">continuous_errors</span> <span class="o">*</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;search&#39;</span><span class="p">][</span><span class="s1">&#39;ban_time_on_fail&#39;</span><span class="p">],</span>
+ <span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspend_end_time</span> <span class="o">=</span> <span class="n">default_timer</span><span class="p">()</span> <span class="o">+</span> <span class="n">suspended_time</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspend_reason</span> <span class="o">=</span> <span class="n">suspend_reason</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;Suspend for </span><span class="si">%i</span><span class="s1"> seconds&#39;</span><span class="p">,</span> <span class="n">suspended_time</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">resume</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
+ <span class="c1"># reset the suspend variables</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">continuous_errors</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspend_end_time</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspend_reason</span> <span class="o">=</span> <span class="kc">None</span></div>
+
+
+
+<div class="viewcode-block" id="EngineProcessor">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.abstract.EngineProcessor">[docs]</a>
+<span class="k">class</span> <span class="nc">EngineProcessor</span><span class="p">(</span><span class="n">ABC</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Base classes used for all types of request processors.&quot;&quot;&quot;</span>
+
+ <span class="vm">__slots__</span> <span class="o">=</span> <span class="s1">&#39;engine&#39;</span><span class="p">,</span> <span class="s1">&#39;engine_name&#39;</span><span class="p">,</span> <span class="s1">&#39;lock&#39;</span><span class="p">,</span> <span class="s1">&#39;suspended_status&#39;</span><span class="p">,</span> <span class="s1">&#39;logger&#39;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">engine</span><span class="p">,</span> <span class="n">engine_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine</span> <span class="o">=</span> <span class="n">engine</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span> <span class="o">=</span> <span class="n">engine_name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">engines</span><span class="p">[</span><span class="n">engine_name</span><span class="p">]</span><span class="o">.</span><span class="n">logger</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">get_network</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">)</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="nb">id</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">if</span> <span class="n">key</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspended_status</span> <span class="o">=</span> <span class="n">SUSPENDED_STATUS</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">SuspendedStatus</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">init</span><span class="p">(</span><span class="n">get_engine_from_settings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">))</span>
+ <span class="k">except</span> <span class="n">SearxEngineResponseException</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;Fail to initialize // </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;Fail to initialize&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;Initialized&#39;</span><span class="p">)</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">has_initialize_function</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;init&#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">handle_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result_container</span><span class="p">,</span> <span class="n">exception_or_message</span><span class="p">,</span> <span class="n">suspend</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+ <span class="c1"># update result_container</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exception_or_message</span><span class="p">,</span> <span class="ne">BaseException</span><span class="p">):</span>
+ <span class="n">exception_class</span> <span class="o">=</span> <span class="n">exception_or_message</span><span class="o">.</span><span class="vm">__class__</span>
+ <span class="n">module_name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">exception_class</span><span class="p">,</span> <span class="s1">&#39;__module__&#39;</span><span class="p">,</span> <span class="s1">&#39;builtins&#39;</span><span class="p">)</span>
+ <span class="n">module_name</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span> <span class="k">if</span> <span class="n">module_name</span> <span class="o">==</span> <span class="s1">&#39;builtins&#39;</span> <span class="k">else</span> <span class="n">module_name</span> <span class="o">+</span> <span class="s1">&#39;.&#39;</span>
+ <span class="n">error_message</span> <span class="o">=</span> <span class="n">module_name</span> <span class="o">+</span> <span class="n">exception_class</span><span class="o">.</span><span class="vm">__qualname__</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">error_message</span> <span class="o">=</span> <span class="n">exception_or_message</span>
+ <span class="n">result_container</span><span class="o">.</span><span class="n">add_unresponsive_engine</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">error_message</span><span class="p">)</span>
+ <span class="c1"># metrics</span>
+ <span class="n">counter_inc</span><span class="p">(</span><span class="s1">&#39;engine&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="s1">&#39;search&#39;</span><span class="p">,</span> <span class="s1">&#39;count&#39;</span><span class="p">,</span> <span class="s1">&#39;error&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exception_or_message</span><span class="p">,</span> <span class="ne">BaseException</span><span class="p">):</span>
+ <span class="n">count_exception</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">exception_or_message</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">count_error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">exception_or_message</span><span class="p">)</span>
+ <span class="c1"># suspend the engine ?</span>
+ <span class="k">if</span> <span class="n">suspend</span><span class="p">:</span>
+ <span class="n">suspended_time</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exception_or_message</span><span class="p">,</span> <span class="n">SearxEngineAccessDeniedException</span><span class="p">):</span>
+ <span class="n">suspended_time</span> <span class="o">=</span> <span class="n">exception_or_message</span><span class="o">.</span><span class="n">suspended_time</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspended_status</span><span class="o">.</span><span class="n">suspend</span><span class="p">(</span><span class="n">suspended_time</span><span class="p">,</span> <span class="n">error_message</span><span class="p">)</span> <span class="c1"># pylint: disable=no-member</span>
+
+ <span class="k">def</span> <span class="nf">_extend_container_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">search_results</span><span class="p">):</span>
+ <span class="c1"># update result_container</span>
+ <span class="n">result_container</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">search_results</span><span class="p">)</span>
+ <span class="n">engine_time</span> <span class="o">=</span> <span class="n">default_timer</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span>
+ <span class="n">page_load_time</span> <span class="o">=</span> <span class="n">get_time_for_thread</span><span class="p">()</span>
+ <span class="n">result_container</span><span class="o">.</span><span class="n">add_timing</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">engine_time</span><span class="p">,</span> <span class="n">page_load_time</span><span class="p">)</span>
+ <span class="c1"># metrics</span>
+ <span class="n">counter_inc</span><span class="p">(</span><span class="s1">&#39;engine&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="s1">&#39;search&#39;</span><span class="p">,</span> <span class="s1">&#39;count&#39;</span><span class="p">,</span> <span class="s1">&#39;successful&#39;</span><span class="p">)</span>
+ <span class="n">histogram_observe</span><span class="p">(</span><span class="n">engine_time</span><span class="p">,</span> <span class="s1">&#39;engine&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="s1">&#39;time&#39;</span><span class="p">,</span> <span class="s1">&#39;total&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">page_load_time</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">histogram_observe</span><span class="p">(</span><span class="n">page_load_time</span><span class="p">,</span> <span class="s1">&#39;engine&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="s1">&#39;time&#39;</span><span class="p">,</span> <span class="s1">&#39;http&#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">extend_container</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">search_results</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">(),</span> <span class="s1">&#39;_timeout&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
+ <span class="c1"># the main thread is not waiting anymore</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="s1">&#39;timeout&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># check if the engine accepted the request</span>
+ <span class="k">if</span> <span class="n">search_results</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_extend_container_basic</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">search_results</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">suspended_status</span><span class="o">.</span><span class="n">resume</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">extend_container_if_suspended</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result_container</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">suspended_status</span><span class="o">.</span><span class="n">is_suspended</span><span class="p">:</span>
+ <span class="n">result_container</span><span class="o">.</span><span class="n">add_unresponsive_engine</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">suspended_status</span><span class="o">.</span><span class="n">suspend_reason</span><span class="p">,</span> <span class="n">suspended</span><span class="o">=</span><span class="kc">True</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="kc">True</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+<div class="viewcode-block" id="EngineProcessor.get_params">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.abstract.EngineProcessor.get_params">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a set of (see :ref:`request params &lt;engine request arguments&gt;`) or</span>
+<span class="sd"> ``None`` if request is not supported.</span>
+
+<span class="sd"> Not supported conditions (``None`` is returned):</span>
+
+<span class="sd"> - A page-number &gt; 1 when engine does not support paging.</span>
+<span class="sd"> - A time range when the engine does not support time range.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># if paging is not supported, skip</span>
+ <span class="k">if</span> <span class="n">search_query</span><span class="o">.</span><span class="n">pageno</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">paging</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="c1"># if max page is reached, skip</span>
+ <span class="n">max_page</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">max_page</span> <span class="ow">or</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;search&#39;</span><span class="p">][</span><span class="s1">&#39;max_page&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">max_page</span> <span class="ow">and</span> <span class="n">max_page</span> <span class="o">&lt;</span> <span class="n">search_query</span><span class="o">.</span><span class="n">pageno</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="c1"># if time_range is not supported, skip</span>
+ <span class="k">if</span> <span class="n">search_query</span><span class="o">.</span><span class="n">time_range</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">time_range_support</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;category&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine_category</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pageno&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_query</span><span class="o">.</span><span class="n">pageno</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_query</span><span class="o">.</span><span class="n">safesearch</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_query</span><span class="o">.</span><span class="n">time_range</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;engine_data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_query</span><span class="o">.</span><span class="n">engine_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="p">{})</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;searxng_locale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_query</span><span class="o">.</span><span class="n">lang</span>
+
+ <span class="c1"># deprecated / vintage --&gt; use params[&#39;searxng_locale&#39;]</span>
+ <span class="c1">#</span>
+ <span class="c1"># Conditions related to engine&#39;s traits are implemented in engine.traits</span>
+ <span class="c1"># module. Don&#39;t do &#39;locale&#39; decisions here in the abstract layer of the</span>
+ <span class="c1"># search processor, just pass the value from user&#39;s choice unchanged to</span>
+ <span class="c1"># the engine request.</span>
+
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;language&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">language</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">language</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_query</span><span class="o">.</span><span class="n">lang</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+ <span class="nd">@abstractmethod</span>
+ <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">timeout_limit</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+ <span class="k">def</span> <span class="nf">get_tests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">tests</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;tests&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">tests</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">tests</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;additional_tests&#39;</span><span class="p">,</span> <span class="p">{})</span>
+ <span class="n">tests</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_default_tests</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">tests</span>
+
+ <span class="k">def</span> <span class="nf">get_default_tests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">{}</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../../index.html">
+ <img class="logo" src="../../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../../index.html">Module code</a>
+ <ul>
+ <li><a href="../../search.html">searx.search</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search/processors/offline.html b/_modules/searx/search/processors/offline.html
new file mode 100644
index 000000000..3c4394a91
--- /dev/null
+++ b/_modules/searx/search/processors/offline.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search.processors.offline &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../../search.html" accesskey="U">searx.search</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search.processors.offline</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search.processors.offline</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;Processors for engine-type: ``offline``</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">.abstract</span> <span class="kn">import</span> <span class="n">EngineProcessor</span>
+
+
+<div class="viewcode-block" id="OfflineProcessor">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.offline.OfflineProcessor">[docs]</a>
+<span class="k">class</span> <span class="nc">OfflineProcessor</span><span class="p">(</span><span class="n">EngineProcessor</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processor class used by ``offline`` engines&quot;&quot;&quot;</span>
+
+ <span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;offline&#39;</span>
+
+ <span class="k">def</span> <span class="nf">_search_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">timeout_limit</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">search_results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_basic</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">extend_container</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">search_results</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># do not record the error</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;engine </span><span class="si">{0}</span><span class="s1"> : invalid input : </span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">e</span><span class="p">))</span>
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;engine </span><span class="si">{0}</span><span class="s1"> : exception : </span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">e</span><span class="p">))</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../../index.html">
+ <img class="logo" src="../../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../../index.html">Module code</a>
+ <ul>
+ <li><a href="../../search.html">searx.search</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search/processors/online.html b/_modules/searx/search/processors/online.html
new file mode 100644
index 000000000..f2480b098
--- /dev/null
+++ b/_modules/searx/search/processors/online.html
@@ -0,0 +1,357 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search.processors.online &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../../search.html" accesskey="U">searx.search</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search.processors.online</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search.processors.online</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;Processors for engine-type: ``online``</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=use-dict-literal</span>
+
+<span class="kn">from</span> <span class="nn">timeit</span> <span class="kn">import</span> <span class="n">default_timer</span>
+<span class="kn">import</span> <span class="nn">asyncio</span>
+<span class="kn">import</span> <span class="nn">ssl</span>
+<span class="kn">import</span> <span class="nn">httpx</span>
+
+<span class="kn">import</span> <span class="nn">searx.network</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">gen_useragent</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">SearxEngineAccessDeniedException</span><span class="p">,</span>
+ <span class="n">SearxEngineCaptchaException</span><span class="p">,</span>
+ <span class="n">SearxEngineTooManyRequestsException</span><span class="p">,</span>
+<span class="p">)</span>
+<span class="kn">from</span> <span class="nn">searx.metrics.error_recorder</span> <span class="kn">import</span> <span class="n">count_error</span>
+<span class="kn">from</span> <span class="nn">.abstract</span> <span class="kn">import</span> <span class="n">EngineProcessor</span>
+
+
+<div class="viewcode-block" id="default_request_params">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online.default_request_params">[docs]</a>
+<span class="k">def</span> <span class="nf">default_request_params</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Default request parameters for ``online`` engines.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="p">{</span>
+ <span class="c1"># fmt: off</span>
+ <span class="s1">&#39;method&#39;</span><span class="p">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;headers&#39;</span><span class="p">:</span> <span class="p">{},</span>
+ <span class="s1">&#39;data&#39;</span><span class="p">:</span> <span class="p">{},</span>
+ <span class="s1">&#39;url&#39;</span><span class="p">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;cookies&#39;</span><span class="p">:</span> <span class="p">{},</span>
+ <span class="s1">&#39;auth&#39;</span><span class="p">:</span> <span class="kc">None</span>
+ <span class="c1"># fmt: on</span>
+ <span class="p">}</span></div>
+
+
+
+<div class="viewcode-block" id="OnlineProcessor">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online.OnlineProcessor">[docs]</a>
+<span class="k">class</span> <span class="nc">OnlineProcessor</span><span class="p">(</span><span class="n">EngineProcessor</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processor class for ``online`` engines.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;online&#39;</span>
+
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># set timeout for all HTTP requests</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">set_timeout_for_thread</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">timeout</span><span class="p">,</span> <span class="n">start_time</span><span class="o">=</span><span class="n">default_timer</span><span class="p">())</span>
+ <span class="c1"># reset the HTTP total time</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">reset_time_for_thread</span><span class="p">()</span>
+ <span class="c1"># set the network</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">set_context_network_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">)</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+
+<div class="viewcode-block" id="OnlineProcessor.get_params">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online.OnlineProcessor.get_params">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a set of :ref:`request params &lt;engine request online&gt;` or ``None``</span>
+<span class="sd"> if request is not supported.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">params</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_params</span><span class="p">(</span><span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">params</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="c1"># add default params</span>
+ <span class="n">params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">default_request_params</span><span class="p">())</span>
+
+ <span class="c1"># add an user agent</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;User-Agent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">gen_useragent</span><span class="p">()</span>
+
+ <span class="c1"># add Accept-Language header</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">send_accept_language_header</span> <span class="ow">and</span> <span class="n">search_query</span><span class="o">.</span><span class="n">locale</span><span class="p">:</span>
+ <span class="n">ac_lang</span> <span class="o">=</span> <span class="n">search_query</span><span class="o">.</span><span class="n">locale</span><span class="o">.</span><span class="n">language</span>
+ <span class="k">if</span> <span class="n">search_query</span><span class="o">.</span><span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">:</span>
+ <span class="n">ac_lang</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">,</span><span class="si">%s</span><span class="s2">;q=0.9,*;q=0.5&quot;</span> <span class="o">%</span> <span class="p">(</span>
+ <span class="n">search_query</span><span class="o">.</span><span class="n">locale</span><span class="o">.</span><span class="n">language</span><span class="p">,</span>
+ <span class="n">search_query</span><span class="o">.</span><span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">,</span>
+ <span class="n">search_query</span><span class="o">.</span><span class="n">locale</span><span class="o">.</span><span class="n">language</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">][</span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ac_lang</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;HTTP Accept-Language: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+ <span class="k">def</span> <span class="nf">_send_http_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="c1"># create dictionary which contain all</span>
+ <span class="c1"># information about the request</span>
+ <span class="n">request_args</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">headers</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;headers&#39;</span><span class="p">],</span> <span class="n">cookies</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">],</span> <span class="n">auth</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;auth&#39;</span><span class="p">])</span>
+
+ <span class="c1"># verify</span>
+ <span class="c1"># if not None, it overrides the verify value defined in the network.</span>
+ <span class="c1"># use False to accept any server certificate</span>
+ <span class="c1"># use a path to file to specify a server certificate</span>
+ <span class="n">verify</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;verify&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">verify</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">request_args</span><span class="p">[</span><span class="s1">&#39;verify&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;verify&#39;</span><span class="p">]</span>
+
+ <span class="c1"># max_redirects</span>
+ <span class="n">max_redirects</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;max_redirects&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">max_redirects</span><span class="p">:</span>
+ <span class="n">request_args</span><span class="p">[</span><span class="s1">&#39;max_redirects&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">max_redirects</span>
+
+ <span class="c1"># allow_redirects</span>
+ <span class="k">if</span> <span class="s1">&#39;allow_redirects&#39;</span> <span class="ow">in</span> <span class="n">params</span><span class="p">:</span>
+ <span class="n">request_args</span><span class="p">[</span><span class="s1">&#39;allow_redirects&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;allow_redirects&#39;</span><span class="p">]</span>
+
+ <span class="c1"># soft_max_redirects</span>
+ <span class="n">soft_max_redirects</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;soft_max_redirects&#39;</span><span class="p">,</span> <span class="n">max_redirects</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">)</span>
+
+ <span class="c1"># raise_for_status</span>
+ <span class="n">request_args</span><span class="p">[</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;raise_for_httperror&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
+
+ <span class="c1"># specific type of request (GET or POST)</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;method&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;GET&#39;</span><span class="p">:</span>
+ <span class="n">req</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">get</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">req</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">post</span>
+
+ <span class="n">request_args</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span>
+
+ <span class="c1"># send the request</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="n">req</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">],</span> <span class="o">**</span><span class="n">request_args</span><span class="p">)</span>
+
+ <span class="c1"># check soft limit of the redirect count</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">history</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">soft_max_redirects</span><span class="p">:</span>
+ <span class="c1"># unexpected redirect : record an error</span>
+ <span class="c1"># but the engine might still return valid results.</span>
+ <span class="n">status_code</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">reason</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">reason_phrase</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span>
+ <span class="n">hostname</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">host</span>
+ <span class="n">count_error</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">,</span>
+ <span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> redirects, maximum: </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">history</span><span class="p">),</span> <span class="n">soft_max_redirects</span><span class="p">),</span>
+ <span class="p">(</span><span class="n">status_code</span><span class="p">,</span> <span class="n">reason</span><span class="p">,</span> <span class="n">hostname</span><span class="p">),</span>
+ <span class="n">secondary</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
+ <span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">response</span>
+
+ <span class="k">def</span> <span class="nf">_search_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
+ <span class="c1"># update request parameters dependent on</span>
+ <span class="c1"># search-engine (contained in engines folder)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
+
+ <span class="c1"># ignoring empty urls</span>
+ <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</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="k">if</span> <span class="ow">not</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="c1"># send request</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_http_request</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
+
+ <span class="c1"># parse the response</span>
+ <span class="n">response</span><span class="o">.</span><span class="n">search_params</span> <span class="o">=</span> <span class="n">params</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">response</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">timeout_limit</span><span class="p">):</span>
+ <span class="c1"># set timeout for all HTTP requests</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">set_timeout_for_thread</span><span class="p">(</span><span class="n">timeout_limit</span><span class="p">,</span> <span class="n">start_time</span><span class="o">=</span><span class="n">start_time</span><span class="p">)</span>
+ <span class="c1"># reset the HTTP total time</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">reset_time_for_thread</span><span class="p">()</span>
+ <span class="c1"># set the network</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">set_context_network_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="c1"># send requests and parse the results</span>
+ <span class="n">search_results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_basic</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">extend_container</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">search_results</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">ssl</span><span class="o">.</span><span class="n">SSLError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># requests timeout (connect or read)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">suspend</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;SSLError </span><span class="si">{}</span><span class="s2">, verify=</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">get_network</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine_name</span><span class="p">)</span><span class="o">.</span><span class="n">verify</span><span class="p">))</span>
+ <span class="k">except</span> <span class="p">(</span><span class="n">httpx</span><span class="o">.</span><span class="n">TimeoutException</span><span class="p">,</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">TimeoutError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># requests timeout (connect or read)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">suspend</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
+ <span class="s2">&quot;HTTP requests timeout (search duration : </span><span class="si">{0}</span><span class="s2"> s, timeout: </span><span class="si">{1}</span><span class="s2"> s) : </span><span class="si">{2}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">default_timer</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">timeout_limit</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+ <span class="k">except</span> <span class="p">(</span><span class="n">httpx</span><span class="o">.</span><span class="n">HTTPError</span><span class="p">,</span> <span class="n">httpx</span><span class="o">.</span><span class="n">StreamError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># other requests exception</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">suspend</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span>
+ <span class="s2">&quot;requests exception (search duration : </span><span class="si">{0}</span><span class="s2"> s, timeout: </span><span class="si">{1}</span><span class="s2"> s) : </span><span class="si">{2}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">default_timer</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">timeout_limit</span><span class="p">,</span> <span class="n">e</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+ <span class="k">except</span> <span class="n">SearxEngineCaptchaException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">suspend</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;CAPTCHA&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">SearxEngineTooManyRequestsException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">suspend</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;Too many requests&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">SearxEngineAccessDeniedException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">suspend</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;SearXNG is blocked&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">result_container</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s1">&#39;exception : </span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">get_default_tests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">tests</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;simple&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;life&#39;</span><span class="p">,</span> <span class="s1">&#39;computer&#39;</span><span class="p">)},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;not_empty&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;paging&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;paging&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;time&#39;</span><span class="p">,</span> <span class="s1">&#39;pageno&#39;</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;not_empty&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;test&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;unique_results&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="k">if</span> <span class="s1">&#39;general&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="o">.</span><span class="n">categories</span><span class="p">:</span>
+ <span class="c1"># avoid documentation about HTML tags (&lt;time&gt; and &lt;input type=&quot;time&quot;&gt;)</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;paging&#39;</span><span class="p">][</span><span class="s1">&#39;matrix&#39;</span><span class="p">][</span><span class="s1">&#39;query&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;news&#39;</span>
+
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;time_range&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;time_range&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;news&#39;</span><span class="p">,</span> <span class="s1">&#39;time_range&#39;</span><span class="p">:</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="s1">&#39;day&#39;</span><span class="p">)},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;not_empty&#39;</span><span class="p">],</span>
+ <span class="s1">&#39;test&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;unique_results&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;traits&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;lang_fr&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;paris&#39;</span><span class="p">,</span> <span class="s1">&#39;lang&#39;</span><span class="p">:</span> <span class="s1">&#39;fr&#39;</span><span class="p">},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;not_empty&#39;</span><span class="p">,</span> <span class="p">(</span><span class="s1">&#39;has_language&#39;</span><span class="p">,</span> <span class="s1">&#39;fr&#39;</span><span class="p">)],</span>
+ <span class="p">}</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;lang_en&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;paris&#39;</span><span class="p">,</span> <span class="s1">&#39;lang&#39;</span><span class="p">:</span> <span class="s1">&#39;en&#39;</span><span class="p">},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;not_empty&#39;</span><span class="p">,</span> <span class="p">(</span><span class="s1">&#39;has_language&#39;</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">)],</span>
+ <span class="p">}</span>
+
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;safesearch&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;porn&#39;</span><span class="p">,</span> <span class="s1">&#39;safesearch&#39;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)},</span> <span class="s1">&#39;test&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;unique_results&#39;</span><span class="p">]}</span>
+
+ <span class="k">return</span> <span class="n">tests</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../../index.html">
+ <img class="logo" src="../../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../../index.html">Module code</a>
+ <ul>
+ <li><a href="../../search.html">searx.search</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search/processors/online_currency.html b/_modules/searx/search/processors/online_currency.html
new file mode 100644
index 000000000..530dbd9ab
--- /dev/null
+++ b/_modules/searx/search/processors/online_currency.html
@@ -0,0 +1,191 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search.processors.online_currency &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../../search.html" accesskey="U">searx.search</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search.processors.online_currency</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search.processors.online_currency</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;Processors for engine-type: ``online_currency``</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">unicodedata</span>
+<span class="kn">import</span> <span class="nn">re</span>
+
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">CURRENCIES</span>
+<span class="kn">from</span> <span class="nn">.online</span> <span class="kn">import</span> <span class="n">OnlineProcessor</span>
+
+<span class="n">parser_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;.*?(</span><span class="se">\\</span><span class="s1">d+(?:</span><span class="se">\\</span><span class="s1">.</span><span class="se">\\</span><span class="s1">d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">normalize_name</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s1">&#39;s&#39;</span><span class="p">)</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s1">&#39; +&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">unicodedata</span><span class="o">.</span><span class="n">normalize</span><span class="p">(</span><span class="s1">&#39;NFKD&#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+
+
+<span class="k">def</span> <span class="nf">name_to_iso4217</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">normalize_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">currency</span> <span class="o">=</span> <span class="n">CURRENCIES</span><span class="p">[</span><span class="s1">&#39;names&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="p">[</span><span class="n">name</span><span class="p">])</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">currency</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">currency</span>
+ <span class="k">return</span> <span class="n">currency</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+
+
+<span class="k">def</span> <span class="nf">iso4217_to_name</span><span class="p">(</span><span class="n">iso4217</span><span class="p">,</span> <span class="n">language</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">CURRENCIES</span><span class="p">[</span><span class="s1">&#39;iso4217&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">iso4217</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">language</span><span class="p">,</span> <span class="n">iso4217</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="OnlineCurrencyProcessor">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online_currency.OnlineCurrencyProcessor">[docs]</a>
+<span class="k">class</span> <span class="nc">OnlineCurrencyProcessor</span><span class="p">(</span><span class="n">OnlineProcessor</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processor class used by ``online_currency`` engines.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;online_currency&#39;</span>
+
+<div class="viewcode-block" id="OnlineCurrencyProcessor.get_params">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a set of :ref:`request params &lt;engine request online_currency&gt;`</span>
+<span class="sd"> or ``None`` if search query does not match to :py:obj:`parser_re`.&quot;&quot;&quot;</span>
+
+ <span class="n">params</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_params</span><span class="p">(</span><span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">params</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">m</span> <span class="o">=</span> <span class="n">parser_re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">search_query</span><span class="o">.</span><span class="n">query</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">m</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">amount_str</span><span class="p">,</span> <span class="n">from_currency</span><span class="p">,</span> <span class="n">to_currency</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">amount</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">amount_str</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">from_currency</span> <span class="o">=</span> <span class="n">name_to_iso4217</span><span class="p">(</span><span class="n">from_currency</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
+ <span class="n">to_currency</span> <span class="o">=</span> <span class="n">name_to_iso4217</span><span class="p">(</span><span class="n">to_currency</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;amount&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">amount</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;from&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">from_currency</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;to&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">to_currency</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;from_name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">iso4217_to_name</span><span class="p">(</span><span class="n">from_currency</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;to_name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">iso4217_to_name</span><span class="p">(</span><span class="n">to_currency</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+ <span class="k">def</span> <span class="nf">get_default_tests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">tests</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;currency&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;1337 usd in rmb&#39;</span><span class="p">},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;has_answer&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+
+ <span class="k">return</span> <span class="n">tests</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../../index.html">
+ <img class="logo" src="../../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../../index.html">Module code</a>
+ <ul>
+ <li><a href="../../search.html">searx.search</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search/processors/online_dictionary.html b/_modules/searx/search/processors/online_dictionary.html
new file mode 100644
index 000000000..52479a832
--- /dev/null
+++ b/_modules/searx/search/processors/online_dictionary.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search.processors.online_dictionary &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../../search.html" accesskey="U">searx.search</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search.processors.online_dictionary</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search.processors.online_dictionary</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;Processors for engine-type: ``online_dictionary``</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">is_valid_lang</span>
+<span class="kn">from</span> <span class="nn">.online</span> <span class="kn">import</span> <span class="n">OnlineProcessor</span>
+
+<span class="n">parser_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;.*?([a-z]+)-([a-z]+) (.+)$&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="OnlineDictionaryProcessor">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online_dictionary.OnlineDictionaryProcessor">[docs]</a>
+<span class="k">class</span> <span class="nc">OnlineDictionaryProcessor</span><span class="p">(</span><span class="n">OnlineProcessor</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processor class used by ``online_dictionary`` engines.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;online_dictionary&#39;</span>
+
+<div class="viewcode-block" id="OnlineDictionaryProcessor.get_params">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a set of :ref:`request params &lt;engine request online_dictionary&gt;` or</span>
+<span class="sd"> ``None`` if search query does not match to :py:obj:`parser_re`.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">params</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_params</span><span class="p">(</span><span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">params</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">m</span> <span class="o">=</span> <span class="n">parser_re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">search_query</span><span class="o">.</span><span class="n">query</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">m</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">from_lang</span><span class="p">,</span> <span class="n">to_lang</span><span class="p">,</span> <span class="n">query</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
+
+ <span class="n">from_lang</span> <span class="o">=</span> <span class="n">is_valid_lang</span><span class="p">(</span><span class="n">from_lang</span><span class="p">)</span>
+ <span class="n">to_lang</span> <span class="o">=</span> <span class="n">is_valid_lang</span><span class="p">(</span><span class="n">to_lang</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">from_lang</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">to_lang</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;from_lang&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">from_lang</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;to_lang&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">to_lang</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;query&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">query</span>
+
+ <span class="k">return</span> <span class="n">params</span></div>
+
+
+ <span class="k">def</span> <span class="nf">get_default_tests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">tests</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">engine</span><span class="p">,</span> <span class="s1">&#39;paging&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;translation_paging&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;en-es house&#39;</span><span class="p">,</span> <span class="s1">&#39;pageno&#39;</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;not_empty&#39;</span><span class="p">,</span> <span class="p">(</span><span class="s1">&#39;one_title_contains&#39;</span><span class="p">,</span> <span class="s1">&#39;house&#39;</span><span class="p">)],</span>
+ <span class="s1">&#39;test&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;unique_results&#39;</span><span class="p">],</span>
+ <span class="p">}</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">tests</span><span class="p">[</span><span class="s1">&#39;translation&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;matrix&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;query&#39;</span><span class="p">:</span> <span class="s1">&#39;en-es house&#39;</span><span class="p">},</span>
+ <span class="s1">&#39;result_container&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;not_empty&#39;</span><span class="p">,</span> <span class="p">(</span><span class="s1">&#39;one_title_contains&#39;</span><span class="p">,</span> <span class="s1">&#39;house&#39;</span><span class="p">)],</span>
+ <span class="p">}</span>
+
+ <span class="k">return</span> <span class="n">tests</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../../index.html">
+ <img class="logo" src="../../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../../index.html">Module code</a>
+ <ul>
+ <li><a href="../../search.html">searx.search</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/search/processors/online_url_search.html b/_modules/searx/search/processors/online_url_search.html
new file mode 100644
index 000000000..1a22e1830
--- /dev/null
+++ b/_modules/searx/search/processors/online_url_search.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.search.processors.online_url_search &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../../search.html" accesskey="U">searx.search</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.search.processors.online_url_search</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.search.processors.online_url_search</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;Processors for engine-type: ``online_url_search``</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">from</span> <span class="nn">.online</span> <span class="kn">import</span> <span class="n">OnlineProcessor</span>
+
+<span class="n">re_search_urls</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;http&#39;</span><span class="p">:</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;https?:\/\/[^ ]*&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;ftp&#39;</span><span class="p">:</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;ftps?:\/\/[^ ]*&#39;</span><span class="p">),</span>
+ <span class="s1">&#39;data:image&#39;</span><span class="p">:</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;data:image/[^; ]*;base64,[^ ]*&#39;</span><span class="p">),</span>
+<span class="p">}</span>
+
+
+<div class="viewcode-block" id="OnlineUrlSearchProcessor">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online_url_search.OnlineUrlSearchProcessor">[docs]</a>
+<span class="k">class</span> <span class="nc">OnlineUrlSearchProcessor</span><span class="p">(</span><span class="n">OnlineProcessor</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processor class used by ``online_url_search`` engines.&quot;&quot;&quot;</span>
+
+ <span class="n">engine_type</span> <span class="o">=</span> <span class="s1">&#39;online_url_search&#39;</span>
+
+<div class="viewcode-block" id="OnlineUrlSearchProcessor.get_params">
+<a class="viewcode-back" href="../../../../src/searx.search.processors.html#searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params">[docs]</a>
+ <span class="k">def</span> <span class="nf">get_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a set of :ref:`request params &lt;engine request online&gt;` or ``None`` if</span>
+<span class="sd"> search query does not match to :py:obj:`re_search_urls`.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">params</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_params</span><span class="p">(</span><span class="n">search_query</span><span class="p">,</span> <span class="n">engine_category</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">params</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">url_match</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="n">search_urls</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">re_search_urls</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">m</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">search_query</span><span class="o">.</span><span class="n">query</span><span class="p">)</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="n">m</span><span class="p">:</span>
+ <span class="n">url_match</span> <span class="o">=</span> <span class="kc">True</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">search_urls</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">url_match</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">params</span><span class="p">[</span><span class="s1">&#39;search_urls&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">search_urls</span>
+ <span class="k">return</span> <span class="n">params</span></div>
+</div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../../index.html">
+ <img class="logo" src="../../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../../index.html">Module code</a>
+ <ul>
+ <li><a href="../../search.html">searx.search</a>
+
+
+ </ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searx/utils.html b/_modules/searx/utils.html
new file mode 100644
index 000000000..f5fa08362
--- /dev/null
+++ b/_modules/searx/utils.html
@@ -0,0 +1,919 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searx.utils &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searx.utils</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searx.utils</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;Utility functions for the engines</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">importlib</span>
+<span class="kn">import</span> <span class="nn">importlib.util</span>
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">import</span> <span class="nn">types</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Set</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">MutableMapping</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Callable</span>
+<span class="kn">from</span> <span class="nn">numbers</span> <span class="kn">import</span> <span class="n">Number</span>
+<span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">splitext</span><span class="p">,</span> <span class="n">join</span>
+<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">choice</span>
+<span class="kn">from</span> <span class="nn">html.parser</span> <span class="kn">import</span> <span class="n">HTMLParser</span>
+<span class="kn">from</span> <span class="nn">html</span> <span class="kn">import</span> <span class="n">escape</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urljoin</span><span class="p">,</span> <span class="n">urlparse</span>
+<span class="kn">from</span> <span class="nn">markdown_it</span> <span class="kn">import</span> <span class="n">MarkdownIt</span>
+
+<span class="kn">from</span> <span class="nn">lxml</span> <span class="kn">import</span> <span class="n">html</span>
+<span class="kn">from</span> <span class="nn">lxml.etree</span> <span class="kn">import</span> <span class="n">ElementBase</span><span class="p">,</span> <span class="n">XPath</span><span class="p">,</span> <span class="n">XPathError</span><span class="p">,</span> <span class="n">XPathSyntaxError</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">settings</span>
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">USER_AGENTS</span><span class="p">,</span> <span class="n">data_dir</span>
+<span class="kn">from</span> <span class="nn">searx.version</span> <span class="kn">import</span> <span class="n">VERSION_TAG</span>
+<span class="kn">from</span> <span class="nn">searx.sxng_locales</span> <span class="kn">import</span> <span class="n">sxng_locales</span>
+<span class="kn">from</span> <span class="nn">searx.exceptions</span> <span class="kn">import</span> <span class="n">SearxXPathSyntaxException</span><span class="p">,</span> <span class="n">SearxEngineXPathException</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">logger</span>
+
+
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span><span class="o">.</span><span class="n">getChild</span><span class="p">(</span><span class="s1">&#39;utils&#39;</span><span class="p">)</span>
+
+<span class="n">XPathSpecType</span> <span class="o">=</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">XPath</span><span class="p">]</span>
+
+<span class="n">_BLOCKED_TAGS</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;script&#39;</span><span class="p">,</span> <span class="s1">&#39;style&#39;</span><span class="p">)</span>
+
+<span class="n">_ECMA_UNESCAPE4_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;</span><span class="si">%u</span><span class="s1">([0-9a-fA-F]</span><span class="si">{4}</span><span class="s1">)&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">UNICODE</span><span class="p">)</span>
+<span class="n">_ECMA_UNESCAPE2_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;%([0-9a-fA-F]</span><span class="si">{2}</span><span class="s1">)&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">UNICODE</span><span class="p">)</span>
+
+<span class="n">_JS_QUOTE_KEYS_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;([\{\s,])(\w+)(:)&#39;</span><span class="p">)</span>
+<span class="n">_JS_VOID_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;void\s+[0-9]+|void\s*\([0-9]+\)&#39;</span><span class="p">)</span>
+<span class="n">_JS_DECIMAL_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;:\s*\.&quot;</span><span class="p">)</span>
+
+<span class="n">_STORAGE_UNIT_VALUE</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;TB&#39;</span><span class="p">:</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">,</span>
+ <span class="s1">&#39;GB&#39;</span><span class="p">:</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">,</span>
+ <span class="s1">&#39;MB&#39;</span><span class="p">:</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">,</span>
+ <span class="s1">&#39;TiB&#39;</span><span class="p">:</span> <span class="mi">1000</span> <span class="o">*</span> <span class="mi">1000</span> <span class="o">*</span> <span class="mi">1000</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">,</span>
+ <span class="s1">&#39;GiB&#39;</span><span class="p">:</span> <span class="mi">1000</span> <span class="o">*</span> <span class="mi">1000</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">,</span>
+ <span class="s1">&#39;MiB&#39;</span><span class="p">:</span> <span class="mi">1000</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">,</span>
+ <span class="s1">&#39;KiB&#39;</span><span class="p">:</span> <span class="mi">1000</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="n">_XPATH_CACHE</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">XPath</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="n">_LANG_TO_LC_CACHE</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">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="o">=</span> <span class="p">{}</span>
+
+<span class="n">_FASTTEXT_MODEL</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="s2">&quot;fasttext.FastText._FastText&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># type: ignore</span>
+<span class="sd">&quot;&quot;&quot;fasttext model to predict laguage of a search term&quot;&quot;&quot;</span>
+
+<span class="n">SEARCH_LANGUAGE_CODES</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">([</span><span class="n">searxng_locale</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">searxng_locale</span> <span class="ow">in</span> <span class="n">sxng_locales</span><span class="p">])</span>
+<span class="sd">&quot;&quot;&quot;Languages supported by most searxng engines (:py:obj:`searx.sxng_locales.sxng_locales`).&quot;&quot;&quot;</span>
+
+
+<span class="k">class</span> <span class="nc">_NotSetClass</span><span class="p">:</span> <span class="c1"># pylint: disable=too-few-public-methods</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Internal class for this module, do not create instance of this class.</span>
+<span class="sd"> Replace the None value, allow explicitly pass None as a function argument&quot;&quot;&quot;</span>
+
+
+<span class="n">_NOTSET</span> <span class="o">=</span> <span class="n">_NotSetClass</span><span class="p">()</span>
+
+
+<div class="viewcode-block" id="searx_useragent">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.searx_useragent">[docs]</a>
+<span class="k">def</span> <span class="nf">searx_useragent</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;Return the searx User Agent&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="s1">&#39;searx/</span><span class="si">{searx_version}</span><span class="s1"> </span><span class="si">{suffix}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">searx_version</span><span class="o">=</span><span class="n">VERSION_TAG</span><span class="p">,</span> <span class="n">suffix</span><span class="o">=</span><span class="n">settings</span><span class="p">[</span><span class="s1">&#39;outgoing&#39;</span><span class="p">][</span><span class="s1">&#39;useragent_suffix&#39;</span><span class="p">]</span>
+ <span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span></div>
+
+
+
+<div class="viewcode-block" id="gen_useragent">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.gen_useragent">[docs]</a>
+<span class="k">def</span> <span class="nf">gen_useragent</span><span class="p">(</span><span class="n">os_string</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</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;Return a random browser User Agent</span>
+
+<span class="sd"> See searx/data/useragents.json</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">USER_AGENTS</span><span class="p">[</span><span class="s1">&#39;ua&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">os</span><span class="o">=</span><span class="n">os_string</span> <span class="ow">or</span> <span class="n">choice</span><span class="p">(</span><span class="n">USER_AGENTS</span><span class="p">[</span><span class="s1">&#39;os&#39;</span><span class="p">]),</span> <span class="n">version</span><span class="o">=</span><span class="n">choice</span><span class="p">(</span><span class="n">USER_AGENTS</span><span class="p">[</span><span class="s1">&#39;versions&#39;</span><span class="p">]))</span></div>
+
+
+
+<span class="k">class</span> <span class="nc">_HTMLTextExtractorException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Internal exception raised when the HTML is invalid&quot;&quot;&quot;</span>
+
+
+<span class="k">class</span> <span class="nc">_HTMLTextExtractor</span><span class="p">(</span><span class="n">HTMLParser</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Internal class to extract text from HTML&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">HTMLParser</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tags</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">def</span> <span class="nf">handle_starttag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s1">&#39;br&#39;</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">handle_endtag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="n">tag</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="n">_HTMLTextExtractorException</span><span class="p">()</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">is_valid_tag</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_BLOCKED_TAGS</span>
+
+ <span class="k">def</span> <span class="nf">handle_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_valid_tag</span><span class="p">():</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">handle_charref</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_valid_tag</span><span class="p">():</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="s1">&#39;X&#39;</span><span class="p">):</span>
+ <span class="n">codepoint</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="mi">16</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">codepoint</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">codepoint</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">handle_entityref</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_valid_tag</span><span class="p">():</span>
+ <span class="k">return</span>
+ <span class="c1"># codepoint = htmlentitydefs.name2codepoint[name]</span>
+ <span class="c1"># self.result.append(chr(codepoint))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_text</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+ <span class="c1"># error handle is needed in &lt;py3.10</span>
+ <span class="c1"># https://github.com/python/cpython/pull/8562/files</span>
+ <span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="html_to_text">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.html_to_text">[docs]</a>
+<span class="k">def</span> <span class="nf">html_to_text</span><span class="p">(</span><span class="n">html_str</span><span class="p">:</span> <span class="nb">str</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;Extract text from a HTML string</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * html_str (str): string HTML</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * str: extracted text</span>
+
+<span class="sd"> Examples:</span>
+<span class="sd"> &gt;&gt;&gt; html_to_text(&#39;Example &lt;span id=&quot;42&quot;&gt;#2&lt;/span&gt;&#39;)</span>
+<span class="sd"> &#39;Example #2&#39;</span>
+
+<span class="sd"> &gt;&gt;&gt; html_to_text(&#39;&lt;style&gt;.span { color: red; }&lt;/style&gt;&lt;span&gt;Example&lt;/span&gt;&#39;)</span>
+<span class="sd"> &#39;Example&#39;</span>
+
+<span class="sd"> &gt;&gt;&gt; html_to_text(r&#39;regexp: (?&lt;![a-zA-Z]&#39;)</span>
+<span class="sd"> &#39;regexp: (?&lt;![a-zA-Z]&#39;</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">html_str</span> <span class="o">=</span> <span class="n">html_str</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\r</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
+ <span class="n">html_str</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">html_str</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">_HTMLTextExtractor</span><span class="p">()</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">html_str</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">AssertionError</span><span class="p">:</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">_HTMLTextExtractor</span><span class="p">()</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">feed</span><span class="p">(</span><span class="n">escape</span><span class="p">(</span><span class="n">html_str</span><span class="p">,</span> <span class="n">quote</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
+ <span class="k">except</span> <span class="n">_HTMLTextExtractorException</span><span class="p">:</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;HTMLTextExtractor: invalid HTML</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">html_str</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">get_text</span><span class="p">()</span></div>
+
+
+
+<div class="viewcode-block" id="markdown_to_text">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.markdown_to_text">[docs]</a>
+<span class="k">def</span> <span class="nf">markdown_to_text</span><span class="p">(</span><span class="n">markdown_str</span><span class="p">:</span> <span class="nb">str</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;Extract text from a Markdown string</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * markdown_str (str): string Markdown</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * str: extracted text</span>
+
+<span class="sd"> Examples:</span>
+<span class="sd"> &gt;&gt;&gt; markdown_to_text(&#39;[example](https://example.com)&#39;)</span>
+<span class="sd"> &#39;example&#39;</span>
+
+<span class="sd"> &gt;&gt;&gt; markdown_to_text(&#39;## Headline&#39;)</span>
+<span class="sd"> &#39;Headline&#39;</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">html_str</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">MarkdownIt</span><span class="p">(</span><span class="s2">&quot;commonmark&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;typographer&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span><span class="o">.</span><span class="n">enable</span><span class="p">([</span><span class="s2">&quot;replacements&quot;</span><span class="p">,</span> <span class="s2">&quot;smartquotes&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">markdown_str</span><span class="p">)</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">html_to_text</span><span class="p">(</span><span class="n">html_str</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="extract_text">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.extract_text">[docs]</a>
+<span class="k">def</span> <span class="nf">extract_text</span><span class="p">(</span><span class="n">xpath_results</span><span class="p">,</span> <span class="n">allow_none</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Extract text from a lxml result</span>
+
+<span class="sd"> * if xpath_results is list, extract the text from each result and concat the list</span>
+<span class="sd"> * if xpath_results is a xml element, extract all the text node from it</span>
+<span class="sd"> ( text_content() method from lxml )</span>
+<span class="sd"> * if xpath_results is a string element, then it&#39;s already done</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">xpath_results</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="c1"># it&#39;s list of result : concat everything using recursive call</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">xpath_results</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">result</span> <span class="o">+</span> <span class="p">(</span><span class="n">extract_text</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">xpath_results</span><span class="p">,</span> <span class="n">ElementBase</span><span class="p">):</span>
+ <span class="c1"># it&#39;s a element</span>
+ <span class="n">text</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">tostring</span><span class="p">(</span><span class="n">xpath_results</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;unicode&#39;</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;text&#39;</span><span class="p">,</span> <span class="n">with_tail</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+ <span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">xpath_results</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">Number</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">xpath_results</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">xpath_results</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">allow_none</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="n">xpath_results</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">allow_none</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;extract_text(None, allow_none=False)&#39;</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unsupported type&#39;</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="normalize_url">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.normalize_url">[docs]</a>
+<span class="k">def</span> <span class="nf">normalize_url</span><span class="p">(</span><span class="n">url</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_url</span><span class="p">:</span> <span class="nb">str</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;Normalize URL: add protocol, join URL with base_url, add trailing slash if there is no path</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * url (str): Relative URL</span>
+<span class="sd"> * base_url (str): Base URL, it must be an absolute URL.</span>
+
+<span class="sd"> Example:</span>
+<span class="sd"> &gt;&gt;&gt; normalize_url(&#39;https://example.com&#39;, &#39;http://example.com/&#39;)</span>
+<span class="sd"> &#39;https://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; normalize_url(&#39;//example.com&#39;, &#39;http://example.com/&#39;)</span>
+<span class="sd"> &#39;http://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; normalize_url(&#39;//example.com&#39;, &#39;https://example.com/&#39;)</span>
+<span class="sd"> &#39;https://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; normalize_url(&#39;/path?a=1&#39;, &#39;https://example.com&#39;)</span>
+<span class="sd"> &#39;https://example.com/path?a=1&#39;</span>
+<span class="sd"> &gt;&gt;&gt; normalize_url(&#39;&#39;, &#39;https://example.com&#39;)</span>
+<span class="sd"> &#39;https://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; normalize_url(&#39;/test&#39;, &#39;/path&#39;)</span>
+<span class="sd"> raise ValueError</span>
+
+<span class="sd"> Raises:</span>
+<span class="sd"> * lxml.etree.ParserError</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * str: normalized URL</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;//&#39;</span><span class="p">):</span>
+ <span class="c1"># add http or https to this kind of url //example.com/</span>
+ <span class="n">parsed_search_url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">base_url</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">parsed_search_url</span><span class="o">.</span><span class="n">scheme</span> <span class="ow">or</span> <span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">):</span>
+ <span class="c1"># fix relative url to the search engine</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">urljoin</span><span class="p">(</span><span class="n">base_url</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+
+ <span class="c1"># fix relative urls that fall through the crack</span>
+ <span class="k">if</span> <span class="s1">&#39;://&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">url</span><span class="p">:</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">urljoin</span><span class="p">(</span><span class="n">base_url</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+
+ <span class="n">parsed_url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+
+ <span class="c1"># add a / at this end of the url if there is no path</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">parsed_url</span><span class="o">.</span><span class="n">netloc</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Cannot parse url&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">parsed_url</span><span class="o">.</span><span class="n">path</span><span class="p">:</span>
+ <span class="n">url</span> <span class="o">+=</span> <span class="s1">&#39;/&#39;</span>
+
+ <span class="k">return</span> <span class="n">url</span></div>
+
+
+
+<div class="viewcode-block" id="extract_url">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.extract_url">[docs]</a>
+<span class="k">def</span> <span class="nf">extract_url</span><span class="p">(</span><span class="n">xpath_results</span><span class="p">,</span> <span class="n">base_url</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;Extract and normalize URL from lxml Element</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * xpath_results (Union[List[html.HtmlElement], html.HtmlElement]): lxml Element(s)</span>
+<span class="sd"> * base_url (str): Base URL</span>
+
+<span class="sd"> Example:</span>
+<span class="sd"> &gt;&gt;&gt; def f(s, search_url):</span>
+<span class="sd"> &gt;&gt;&gt; return searx.utils.extract_url(html.fromstring(s), search_url)</span>
+<span class="sd"> &gt;&gt;&gt; f(&#39;&lt;span id=&quot;42&quot;&gt;https://example.com&lt;/span&gt;&#39;, &#39;http://example.com/&#39;)</span>
+<span class="sd"> &#39;https://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; f(&#39;https://example.com&#39;, &#39;http://example.com/&#39;)</span>
+<span class="sd"> &#39;https://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; f(&#39;//example.com&#39;, &#39;http://example.com/&#39;)</span>
+<span class="sd"> &#39;http://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; f(&#39;//example.com&#39;, &#39;https://example.com/&#39;)</span>
+<span class="sd"> &#39;https://example.com/&#39;</span>
+<span class="sd"> &gt;&gt;&gt; f(&#39;/path?a=1&#39;, &#39;https://example.com&#39;)</span>
+<span class="sd"> &#39;https://example.com/path?a=1&#39;</span>
+<span class="sd"> &gt;&gt;&gt; f(&#39;&#39;, &#39;https://example.com&#39;)</span>
+<span class="sd"> raise lxml.etree.ParserError</span>
+<span class="sd"> &gt;&gt;&gt; searx.utils.extract_url([], &#39;https://example.com&#39;)</span>
+<span class="sd"> raise ValueError</span>
+
+<span class="sd"> Raises:</span>
+<span class="sd"> * ValueError</span>
+<span class="sd"> * lxml.etree.ParserError</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * str: normalized URL</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">xpath_results</span> <span class="o">==</span> <span class="p">[]:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Empty url resultset&#39;</span><span class="p">)</span>
+
+ <span class="n">url</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">xpath_results</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">url</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">normalize_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">base_url</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;URL not found&#39;</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="dict_subset">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.dict_subset">[docs]</a>
+<span class="k">def</span> <span class="nf">dict_subset</span><span class="p">(</span><span class="n">dictionary</span><span class="p">:</span> <span class="n">MutableMapping</span><span class="p">,</span> <span class="n">properties</span><span class="p">:</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Extract a subset of a dict</span>
+
+<span class="sd"> Examples:</span>
+<span class="sd"> &gt;&gt;&gt; dict_subset({&#39;A&#39;: &#39;a&#39;, &#39;B&#39;: &#39;b&#39;, &#39;C&#39;: &#39;c&#39;}, [&#39;A&#39;, &#39;C&#39;])</span>
+<span class="sd"> {&#39;A&#39;: &#39;a&#39;, &#39;C&#39;: &#39;c&#39;}</span>
+<span class="sd"> &gt;&gt;&gt; &gt;&gt; dict_subset({&#39;A&#39;: &#39;a&#39;, &#39;B&#39;: &#39;b&#39;, &#39;C&#39;: &#39;c&#39;}, [&#39;A&#39;, &#39;D&#39;])</span>
+<span class="sd"> {&#39;A&#39;: &#39;a&#39;}</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">dictionary</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">properties</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">dictionary</span><span class="p">}</span></div>
+
+
+
+<div class="viewcode-block" id="get_torrent_size">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.get_torrent_size">[docs]</a>
+<span class="k">def</span> <span class="nf">get_torrent_size</span><span class="p">(</span><span class="n">filesize</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">filesize_multiplier</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * filesize (str): size</span>
+<span class="sd"> * filesize_multiplier (str): TB, GB, .... TiB, GiB...</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * int: number of bytes</span>
+
+<span class="sd"> Example:</span>
+<span class="sd"> &gt;&gt;&gt; get_torrent_size(&#39;5&#39;, &#39;GB&#39;)</span>
+<span class="sd"> 5368709120</span>
+<span class="sd"> &gt;&gt;&gt; get_torrent_size(&#39;3.14&#39;, &#39;MiB&#39;)</span>
+<span class="sd"> 3140000</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">multiplier</span> <span class="o">=</span> <span class="n">_STORAGE_UNIT_VALUE</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">filesize_multiplier</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">filesize</span><span class="p">)</span> <span class="o">*</span> <span class="n">multiplier</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span></div>
+
+
+
+<div class="viewcode-block" id="humanize_bytes">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.humanize_bytes">[docs]</a>
+<span class="k">def</span> <span class="nf">humanize_bytes</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">precision</span><span class="o">=</span><span class="mi">2</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Determine the *human readable* value of bytes on 1024 base (1KB=1024B).&quot;&quot;&quot;</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;B &#39;</span><span class="p">,</span> <span class="s1">&#39;KB&#39;</span><span class="p">,</span> <span class="s1">&#39;MB&#39;</span><span class="p">,</span> <span class="s1">&#39;GB&#39;</span><span class="p">,</span> <span class="s1">&#39;TB&#39;</span><span class="p">]</span>
+
+ <span class="n">x</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
+ <span class="n">p</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="k">while</span> <span class="n">size</span> <span class="o">&gt;</span> <span class="mi">1024</span> <span class="ow">and</span> <span class="n">p</span> <span class="o">&lt;</span> <span class="n">x</span><span class="p">:</span>
+ <span class="n">p</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="o">/</span> <span class="mf">1024.0</span>
+ <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%.*f</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">precision</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">])</span></div>
+
+
+
+<div class="viewcode-block" id="convert_str_to_int">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.convert_str_to_int">[docs]</a>
+<span class="k">def</span> <span class="nf">convert_str_to_int</span><span class="p">(</span><span class="n">number_str</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert number_str to int or 0 if number_str is not a number.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">number_str</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
+ <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">number_str</span><span class="p">)</span>
+ <span class="k">return</span> <span class="mi">0</span></div>
+
+
+
+<div class="viewcode-block" id="int_or_zero">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.int_or_zero">[docs]</a>
+<span class="k">def</span> <span class="nf">int_or_zero</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">List</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="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert num to int or 0. num can be either a str or a list.</span>
+<span class="sd"> If num is a list, the first element is converted to int (or return 0 if the list is empty).</span>
+<span class="sd"> If num is a str, see convert_str_to_int</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">num</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="n">num</span> <span class="o">=</span> <span class="n">num</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">convert_str_to_int</span><span class="p">(</span><span class="n">num</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="is_valid_lang">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.is_valid_lang">[docs]</a>
+<span class="k">def</span> <span class="nf">is_valid_lang</span><span class="p">(</span><span class="n">lang</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</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="w"> </span><span class="sd">&quot;&quot;&quot;Return language code and name if lang describe a language.</span>
+
+<span class="sd"> Examples:</span>
+<span class="sd"> &gt;&gt;&gt; is_valid_lang(&#39;zz&#39;)</span>
+<span class="sd"> None</span>
+<span class="sd"> &gt;&gt;&gt; is_valid_lang(&#39;uk&#39;)</span>
+<span class="sd"> (True, &#39;uk&#39;, &#39;ukrainian&#39;)</span>
+<span class="sd"> &gt;&gt;&gt; is_valid_lang(b&#39;uk&#39;)</span>
+<span class="sd"> (True, &#39;uk&#39;, &#39;ukrainian&#39;)</span>
+<span class="sd"> &gt;&gt;&gt; is_valid_lang(&#39;en&#39;)</span>
+<span class="sd"> (True, &#39;en&#39;, &#39;english&#39;)</span>
+<span class="sd"> &gt;&gt;&gt; searx.utils.is_valid_lang(&#39;Español&#39;)</span>
+<span class="sd"> (True, &#39;es&#39;, &#39;spanish&#39;)</span>
+<span class="sd"> &gt;&gt;&gt; searx.utils.is_valid_lang(&#39;Spanish&#39;)</span>
+<span class="sd"> (True, &#39;es&#39;, &#39;spanish&#39;)</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">lang</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
+ <span class="n">is_abbr</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lang</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">is_abbr</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">sxng_locales</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">l</span><span class="p">[</span><span class="mi">0</span><span class="p">][:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">lang</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">l</span><span class="p">[</span><span class="mi">0</span><span class="p">][:</span><span class="mi">2</span><span class="p">],</span> <span class="n">l</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">sxng_locales</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">l</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">lang</span> <span class="ow">or</span> <span class="n">l</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">lang</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">l</span><span class="p">[</span><span class="mi">0</span><span class="p">][:</span><span class="mi">2</span><span class="p">],</span> <span class="n">l</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
+ <span class="k">return</span> <span class="kc">None</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">load_module</span><span class="p">(</span><span class="n">filename</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">module_dir</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">types</span><span class="o">.</span><span class="n">ModuleType</span><span class="p">:</span>
+ <span class="n">modname</span> <span class="o">=</span> <span class="n">splitext</span><span class="p">(</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">modpath</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">module_dir</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
+ <span class="c1"># and https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly</span>
+ <span class="n">spec</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">spec_from_file_location</span><span class="p">(</span><span class="n">modname</span><span class="p">,</span> <span class="n">modpath</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">spec</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;Error loading &#39;</span><span class="si">{</span><span class="n">modpath</span><span class="si">}</span><span class="s2">&#39; module&quot;</span><span class="p">)</span>
+ <span class="n">module</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">module_from_spec</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">spec</span><span class="o">.</span><span class="n">loader</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;Error loading &#39;</span><span class="si">{</span><span class="n">modpath</span><span class="si">}</span><span class="s2">&#39; module&quot;</span><span class="p">)</span>
+ <span class="n">spec</span><span class="o">.</span><span class="n">loader</span><span class="o">.</span><span class="n">exec_module</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">module</span>
+
+
+<div class="viewcode-block" id="to_string">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.to_string">[docs]</a>
+<span class="k">def</span> <span class="nf">to_string</span><span class="p">(</span><span class="n">obj</span><span class="p">:</span> <span class="n">Any</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;Convert obj to its string representation.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">obj</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;__str__&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="ecma_unescape">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.ecma_unescape">[docs]</a>
+<span class="k">def</span> <span class="nf">ecma_unescape</span><span class="p">(</span><span class="n">string</span><span class="p">:</span> <span class="nb">str</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;Python implementation of the unescape javascript function</span>
+
+<span class="sd"> https://www.ecma-international.org/ecma-262/6.0/#sec-unescape-string</span>
+<span class="sd"> https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/unescape</span>
+
+<span class="sd"> Examples:</span>
+<span class="sd"> &gt;&gt;&gt; ecma_unescape(&#39;%u5409&#39;)</span>
+<span class="sd"> &#39;吉&#39;</span>
+<span class="sd"> &gt;&gt;&gt; ecma_unescape(&#39;%20&#39;)</span>
+<span class="sd"> &#39; &#39;</span>
+<span class="sd"> &gt;&gt;&gt; ecma_unescape(&#39;%F3&#39;)</span>
+<span class="sd"> &#39;ó&#39;</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># &quot;%u5409&quot; becomes &quot;吉&quot;</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">_ECMA_UNESCAPE4_RE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="mi">16</span><span class="p">)),</span> <span class="n">string</span><span class="p">)</span>
+ <span class="c1"># &quot;%20&quot; becomes &quot; &quot;, &quot;%F3&quot; becomes &quot;ó&quot;</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">_ECMA_UNESCAPE2_RE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="mi">16</span><span class="p">)),</span> <span class="n">string</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">string</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">get_string_replaces_function</span><span class="p">(</span><span class="n">replaces</span><span class="p">:</span> <span class="n">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="o">-&gt;</span> <span class="n">Callable</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">rep</span> <span class="o">=</span> <span class="p">{</span><span class="n">re</span><span class="o">.</span><span class="n">escape</span><span class="p">(</span><span class="n">k</span><span class="p">):</span> <span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">replaces</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
+ <span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s2">&quot;|&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">rep</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
+
+ <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">pattern</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="n">rep</span><span class="p">[</span><span class="n">re</span><span class="o">.</span><span class="n">escape</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">))],</span> <span class="n">text</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">func</span>
+
+
+<div class="viewcode-block" id="get_engine_from_settings">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.get_engine_from_settings">[docs]</a>
+<span class="k">def</span> <span class="nf">get_engine_from_settings</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return engine configuration from settings.yml of a given engine name&quot;&quot;&quot;</span>
+
+ <span class="k">if</span> <span class="s1">&#39;engines&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">settings</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">{}</span>
+
+ <span class="k">for</span> <span class="n">engine</span> <span class="ow">in</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;engines&#39;</span><span class="p">]:</span>
+ <span class="k">if</span> <span class="s1">&#39;name&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">engine</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="n">engine</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]:</span>
+ <span class="k">return</span> <span class="n">engine</span>
+
+ <span class="k">return</span> <span class="p">{}</span></div>
+
+
+
+<div class="viewcode-block" id="get_xpath">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.get_xpath">[docs]</a>
+<span class="k">def</span> <span class="nf">get_xpath</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">:</span> <span class="n">XPathSpecType</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">XPath</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return cached compiled XPath</span>
+
+<span class="sd"> There is no thread lock.</span>
+<span class="sd"> Worst case scenario, xpath_str is compiled more than one time.</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * result (bool, float, list, str): Results.</span>
+
+<span class="sd"> Raises:</span>
+<span class="sd"> * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</span>
+<span class="sd"> * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</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">xpath_spec</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">_XPATH_CACHE</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">XPath</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">XPathSyntaxError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SearxXPathSyntaxException</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">msg</span><span class="p">))</span> <span class="kn">from</span> <span class="nn">e</span>
+ <span class="n">_XPATH_CACHE</span><span class="p">[</span><span class="n">xpath_spec</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span>
+ <span class="k">return</span> <span class="n">result</span>
+
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="n">XPath</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">xpath_spec</span>
+
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;xpath_spec must be either a str or a lxml.etree.XPath&#39;</span><span class="p">)</span></div>
+
+
+
+<div class="viewcode-block" id="eval_xpath">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.eval_xpath">[docs]</a>
+<span class="k">def</span> <span class="nf">eval_xpath</span><span class="p">(</span><span class="n">element</span><span class="p">:</span> <span class="n">ElementBase</span><span class="p">,</span> <span class="n">xpath_spec</span><span class="p">:</span> <span class="n">XPathSpecType</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Equivalent of element.xpath(xpath_str) but compile xpath_str once for all.</span>
+<span class="sd"> See https://lxml.de/xpathxslt.html#xpath-return-values</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * element (ElementBase): [description]</span>
+<span class="sd"> * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * result (bool, float, list, str): Results.</span>
+
+<span class="sd"> Raises:</span>
+<span class="sd"> * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</span>
+<span class="sd"> * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</span>
+<span class="sd"> * SearxEngineXPathException: Raise when the XPath can&#39;t be evaluated.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">xpath</span> <span class="o">=</span> <span class="n">get_xpath</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">xpath</span><span class="p">(</span><span class="n">element</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">XPathError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">arg</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span><span class="p">])</span>
+ <span class="k">raise</span> <span class="n">SearxEngineXPathException</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span></div>
+
+
+
+<div class="viewcode-block" id="eval_xpath_list">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.eval_xpath_list">[docs]</a>
+<span class="k">def</span> <span class="nf">eval_xpath_list</span><span class="p">(</span><span class="n">element</span><span class="p">:</span> <span class="n">ElementBase</span><span class="p">,</span> <span class="n">xpath_spec</span><span class="p">:</span> <span class="n">XPathSpecType</span><span class="p">,</span> <span class="n">min_len</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Same as eval_xpath, check if the result is a list</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * element (ElementBase): [description]</span>
+<span class="sd"> * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath</span>
+<span class="sd"> * min_len (int, optional): [description]. Defaults to None.</span>
+
+<span class="sd"> Raises:</span>
+<span class="sd"> * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</span>
+<span class="sd"> * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</span>
+<span class="sd"> * SearxEngineXPathException: raise if the result is not a list</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * result (bool, float, list, str): Results.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">eval_xpath</span><span class="p">(</span><span class="n">element</span><span class="p">,</span> <span class="n">xpath_spec</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SearxEngineXPathException</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="s1">&#39;the result is not a list&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">min_len</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">min_len</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SearxEngineXPathException</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="s1">&#39;len(xpath_str) &lt; &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">min_len</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">result</span></div>
+
+
+
+<div class="viewcode-block" id="eval_xpath_getindex">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.eval_xpath_getindex">[docs]</a>
+<span class="k">def</span> <span class="nf">eval_xpath_getindex</span><span class="p">(</span><span class="n">elements</span><span class="p">:</span> <span class="n">ElementBase</span><span class="p">,</span> <span class="n">xpath_spec</span><span class="p">:</span> <span class="n">XPathSpecType</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">_NOTSET</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Call eval_xpath_list then get one element using the index parameter.</span>
+<span class="sd"> If the index does not exist, either raise an exception is default is not set,</span>
+<span class="sd"> other return the default value (can be None).</span>
+
+<span class="sd"> Args:</span>
+<span class="sd"> * elements (ElementBase): lxml element to apply the xpath.</span>
+<span class="sd"> * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath.</span>
+<span class="sd"> * index (int): index to get</span>
+<span class="sd"> * default (Object, optional): Defaults if index doesn&#39;t exist.</span>
+
+<span class="sd"> Raises:</span>
+<span class="sd"> * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</span>
+<span class="sd"> * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</span>
+<span class="sd"> * SearxEngineXPathException: if the index is not found. Also see eval_xpath.</span>
+
+<span class="sd"> Returns:</span>
+<span class="sd"> * result (bool, float, list, str): Results.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">eval_xpath_list</span><span class="p">(</span><span class="n">elements</span><span class="p">,</span> <span class="n">xpath_spec</span><span class="p">)</span>
+ <span class="k">if</span> <span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">result</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">default</span> <span class="o">==</span> <span class="n">_NOTSET</span><span class="p">:</span>
+ <span class="c1"># raise an SearxEngineXPathException instead of IndexError</span>
+ <span class="c1"># to record xpath_spec</span>
+ <span class="k">raise</span> <span class="n">SearxEngineXPathException</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="s1">&#39;index &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">index</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; not found&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">default</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">_get_fasttext_model</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="s2">&quot;fasttext.FastText._FastText&quot;</span><span class="p">:</span> <span class="c1"># type: ignore</span>
+ <span class="k">global</span> <span class="n">_FASTTEXT_MODEL</span> <span class="c1"># pylint: disable=global-statement</span>
+ <span class="k">if</span> <span class="n">_FASTTEXT_MODEL</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">fasttext</span> <span class="c1"># pylint: disable=import-outside-toplevel</span>
+
+ <span class="c1"># Monkey patch: prevent fasttext from showing a (useless) warning when loading a model.</span>
+ <span class="n">fasttext</span><span class="o">.</span><span class="n">FastText</span><span class="o">.</span><span class="n">eprint</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="kc">None</span>
+ <span class="n">_FASTTEXT_MODEL</span> <span class="o">=</span> <span class="n">fasttext</span><span class="o">.</span><span class="n">load_model</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">data_dir</span> <span class="o">/</span> <span class="s1">&#39;lid.176.ftz&#39;</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">_FASTTEXT_MODEL</span>
+
+
+<div class="viewcode-block" id="detect_language">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.detect_language">[docs]</a>
+<span class="k">def</span> <span class="nf">detect_language</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">threshold</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">0.3</span><span class="p">,</span> <span class="n">only_search_languages</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Detect the language of the ``text`` parameter.</span>
+
+<span class="sd"> :param str text: The string whose language is to be detected.</span>
+
+<span class="sd"> :param float threshold: Threshold filters the returned labels by a threshold</span>
+<span class="sd"> on probability. A choice of 0.3 will return labels with at least 0.3</span>
+<span class="sd"> probability.</span>
+
+<span class="sd"> :param bool only_search_languages: If ``True``, returns only supported</span>
+<span class="sd"> SearXNG search languages. see :py:obj:`searx.languages`</span>
+
+<span class="sd"> :rtype: str, None</span>
+<span class="sd"> :returns:</span>
+<span class="sd"> The detected language code or ``None``. See below.</span>
+
+<span class="sd"> :raises ValueError: If ``text`` is not a string.</span>
+
+<span class="sd"> The language detection is done by using `a fork`_ of the fastText_ library</span>
+<span class="sd"> (`python fasttext`_). fastText_ distributes the `language identification</span>
+<span class="sd"> model`_, for reference:</span>
+
+<span class="sd"> - `FastText.zip: Compressing text classification models`_</span>
+<span class="sd"> - `Bag of Tricks for Efficient Text Classification`_</span>
+
+<span class="sd"> The `language identification model`_ support the language codes</span>
+<span class="sd"> (ISO-639-3)::</span>
+
+<span class="sd"> af als am an ar arz as ast av az azb ba bar bcl be bg bh bn bo bpy br bs</span>
+<span class="sd"> bxr ca cbk ce ceb ckb co cs cv cy da de diq dsb dty dv el eml en eo es</span>
+<span class="sd"> et eu fa fi fr frr fy ga gd gl gn gom gu gv he hi hif hr hsb ht hu hy ia</span>
+<span class="sd"> id ie ilo io is it ja jbo jv ka kk km kn ko krc ku kv kw ky la lb lez li</span>
+<span class="sd"> lmo lo lrc lt lv mai mg mhr min mk ml mn mr mrj ms mt mwl my myv mzn nah</span>
+<span class="sd"> nap nds ne new nl nn no oc or os pa pam pfl pl pms pnb ps pt qu rm ro ru</span>
+<span class="sd"> rue sa sah sc scn sco sd sh si sk sl so sq sr su sv sw ta te tg th tk tl</span>
+<span class="sd"> tr tt tyv ug uk ur uz vec vep vi vls vo wa war wuu xal xmf yi yo yue zh</span>
+
+<span class="sd"> By using ``only_search_languages=True`` the `language identification model`_</span>
+<span class="sd"> is harmonized with the SearXNG&#39;s language (locale) model. General</span>
+<span class="sd"> conditions of SearXNG&#39;s locale model are:</span>
+
+<span class="sd"> a. SearXNG&#39;s locale of a query is passed to the</span>
+<span class="sd"> :py:obj:`searx.locales.get_engine_locale` to get a language and/or region</span>
+<span class="sd"> code that is used by an engine.</span>
+
+<span class="sd"> b. Most of SearXNG&#39;s engines do not support all the languages from `language</span>
+<span class="sd"> identification model`_ and there is also a discrepancy in the ISO-639-3</span>
+<span class="sd"> (fasttext) and ISO-639-2 (SearXNG)handling. Further more, in SearXNG the</span>
+<span class="sd"> locales like ``zh-TH`` (``zh-CN``) are mapped to ``zh_Hant``</span>
+<span class="sd"> (``zh_Hans``) while the `language identification model`_ reduce both to</span>
+<span class="sd"> ``zh``.</span>
+
+<span class="sd"> .. _a fork: https://github.com/searxng/fasttext-predict</span>
+<span class="sd"> .. _fastText: https://fasttext.cc/</span>
+<span class="sd"> .. _python fasttext: https://pypi.org/project/fasttext/</span>
+<span class="sd"> .. _language identification model: https://fasttext.cc/docs/en/language-identification.html</span>
+<span class="sd"> .. _Bag of Tricks for Efficient Text Classification: https://arxiv.org/abs/1607.01759</span>
+<span class="sd"> .. _`FastText.zip: Compressing text classification models`: https://arxiv.org/abs/1612.03651</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;text must a str&#39;</span><span class="p">)</span>
+ <span class="n">r</span> <span class="o">=</span> <span class="n">_get_fasttext_model</span><span class="p">()</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">text</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">),</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="n">threshold</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">language</span> <span class="o">=</span> <span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;__label__&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">only_search_languages</span> <span class="ow">and</span> <span class="n">language</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">SEARCH_LANGUAGE_CODES</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">return</span> <span class="n">language</span>
+ <span class="k">return</span> <span class="kc">None</span></div>
+
+
+
+<div class="viewcode-block" id="js_variable_to_python">
+<a class="viewcode-back" href="../../src/searx.utils.html#searx.utils.js_variable_to_python">[docs]</a>
+<span class="k">def</span> <span class="nf">js_variable_to_python</span><span class="p">(</span><span class="n">js_variable</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert a javascript variable into JSON and then load the value</span>
+
+<span class="sd"> It does not deal with all cases, but it is good enough for now.</span>
+<span class="sd"> chompjs has a better implementation.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># when in_string is not None, it contains the character that has opened the string</span>
+ <span class="c1"># either simple quote or double quote</span>
+ <span class="n">in_string</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="c1"># cut the string:</span>
+ <span class="c1"># r&quot;&quot;&quot;{ a:&quot;f\&quot;irst&quot;, c:&#39;sec&quot;ond&#39;}&quot;&quot;&quot;</span>
+ <span class="c1"># becomes</span>
+ <span class="c1"># [&#39;{ a:&#39;, &#39;&quot;&#39;, &#39;f\\&#39;, &#39;&quot;&#39;, &#39;irst&#39;, &#39;&quot;&#39;, &#39;, c:&#39;, &quot;&#39;&quot;, &#39;sec&#39;, &#39;&quot;&#39;, &#39;ond&#39;, &quot;&#39;&quot;, &#39;}&#39;]</span>
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;([&quot;</span><span class="se">\&#39;</span><span class="s1">])&#39;</span><span class="p">,</span> <span class="n">js_variable</span><span class="p">)</span>
+ <span class="c1"># previous part (to check the escape character antislash)</span>
+ <span class="n">previous_p</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">p</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">parts</span><span class="p">):</span>
+ <span class="c1"># parse characters inside a ECMA string</span>
+ <span class="k">if</span> <span class="n">in_string</span><span class="p">:</span>
+ <span class="c1"># we are in a JS string: replace the colon by a temporary character</span>
+ <span class="c1"># so quote_keys_regex doesn&#39;t have to deal with colon inside the JS strings</span>
+ <span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">,</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">in_string</span> <span class="o">==</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">:</span>
+ <span class="c1"># the JS string is delimited by simple quote.</span>
+ <span class="c1"># This is not supported by JSON.</span>
+ <span class="c1"># simple quote delimited string are converted to double quote delimited string</span>
+ <span class="c1"># here, inside a JS string, we escape the double quote</span>
+ <span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\&quot;&#39;</span><span class="p">)</span>
+
+ <span class="c1"># deal with delimiters and escape character</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">in_string</span> <span class="ow">and</span> <span class="n">p</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">,</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">):</span>
+ <span class="c1"># we are not in string</span>
+ <span class="c1"># but p is double or simple quote</span>
+ <span class="c1"># that&#39;s the start of a new string</span>
+ <span class="c1"># replace simple quote by double quote</span>
+ <span class="c1"># (JSON doesn&#39;t support simple quote)</span>
+ <span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&quot;&#39;</span>
+ <span class="n">in_string</span> <span class="o">=</span> <span class="n">p</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="n">p</span> <span class="o">==</span> <span class="n">in_string</span><span class="p">:</span>
+ <span class="c1"># we are in a string and the current part MAY close the string</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">previous_p</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">previous_p</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">:</span>
+ <span class="c1"># there is an antislash just before: the ECMA string continue</span>
+ <span class="k">continue</span>
+ <span class="c1"># the current p close the string</span>
+ <span class="c1"># replace simple quote by double quote</span>
+ <span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&quot;&#39;</span>
+ <span class="n">in_string</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">in_string</span><span class="p">:</span>
+ <span class="c1"># replace void 0 by null</span>
+ <span class="c1"># https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void</span>
+ <span class="c1"># we are sure there is no string in p</span>
+ <span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">_JS_VOID_RE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;null&quot;</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span>
+ <span class="c1"># update previous_p</span>
+ <span class="n">previous_p</span> <span class="o">=</span> <span class="n">p</span>
+ <span class="c1"># join the string</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span>
+ <span class="c1"># add quote around the key</span>
+ <span class="c1"># { a: 12 }</span>
+ <span class="c1"># becomes</span>
+ <span class="c1"># { &quot;a&quot;: 12 }</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">_JS_QUOTE_KEYS_RE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;\1&quot;\2&quot;\3&#39;</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">_JS_DECIMAL_RE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;:0.&quot;</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
+ <span class="c1"># replace the surogate character by colon</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="s1">&#39;:&#39;</span><span class="p">)</span>
+ <span class="c1"># load the JSON and return the result</span>
+ <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">s</span><span class="p">)</span></div>
+
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searxng_extra/standalone_searx.html b/_modules/searxng_extra/standalone_searx.html
new file mode 100644
index 000000000..a34722b05
--- /dev/null
+++ b/_modules/searxng_extra/standalone_searx.html
@@ -0,0 +1,300 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra.standalone_searx &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searxng_extra.standalone_searx</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searxng_extra.standalone_searx</h1><div class="highlight"><pre>
+<span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="sd">&quot;&quot;&quot;Script to run SearXNG from terminal.</span>
+
+<span class="sd"> DON&#39;T USE THIS SCRIPT!!</span>
+
+<span class="sd">.. danger::</span>
+
+<span class="sd"> Be warned, using the ``standalone_searx.py`` won&#39;t give you privacy!</span>
+
+<span class="sd"> On the contrary, this script behaves like a SearXNG server: your IP is</span>
+<span class="sd"> exposed and tracked by all active engines (google, bing, qwant, ... ), with</span>
+<span class="sd"> every query!</span>
+
+<span class="sd">.. note::</span>
+
+<span class="sd"> This is an old and grumpy hack / SearXNG is a Flask application with</span>
+<span class="sd"> client/server structure, which can&#39;t be turned into a command line tool the</span>
+<span class="sd"> way it was done here.</span>
+
+<span class="sd">Getting categories without initiate the engine will only return `[&#39;general&#39;]`</span>
+
+<span class="sd">&gt;&gt;&gt; import searx.engines</span>
+<span class="sd">... list(searx.engines.categories.keys())</span>
+<span class="sd">[&#39;general&#39;]</span>
+<span class="sd">&gt;&gt;&gt; import searx.search</span>
+<span class="sd">... searx.search.initialize()</span>
+<span class="sd">... list(searx.engines.categories.keys())</span>
+<span class="sd">[&#39;general&#39;, &#39;it&#39;, &#39;science&#39;, &#39;images&#39;, &#39;news&#39;, &#39;videos&#39;, &#39;music&#39;, &#39;files&#39;, &#39;social media&#39;, &#39;map&#39;]</span>
+
+<span class="sd">Example to use this script:</span>
+
+<span class="sd">.. code:: bash</span>
+
+<span class="sd"> $ python3 searxng_extra/standalone_searx.py rain</span>
+
+<span class="sd">&quot;&quot;&quot;</span> <span class="c1"># pylint: disable=line-too-long</span>
+
+<span class="kn">import</span> <span class="nn">argparse</span>
+<span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
+<span class="kn">from</span> <span class="nn">json</span> <span class="kn">import</span> <span class="n">dumps</span>
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>
+
+<span class="kn">import</span> <span class="nn">searx</span>
+<span class="kn">import</span> <span class="nn">searx.preferences</span>
+<span class="kn">import</span> <span class="nn">searx.query</span>
+<span class="kn">import</span> <span class="nn">searx.search</span>
+<span class="kn">import</span> <span class="nn">searx.webadapter</span>
+
+<span class="n">EngineCategoriesVar</span> <span class="o">=</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
+
+
+<div class="viewcode-block" id="get_search_query">
+<a class="viewcode-back" href="../../dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.get_search_query">[docs]</a>
+<span class="k">def</span> <span class="nf">get_search_query</span><span class="p">(</span>
+ <span class="n">args</span><span class="p">:</span> <span class="n">argparse</span><span class="o">.</span><span class="n">Namespace</span><span class="p">,</span> <span class="n">engine_categories</span><span class="p">:</span> <span class="n">EngineCategoriesVar</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">SearchQuery</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get search results for the query&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">engine_categories</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">engine_categories</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">categories</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">category</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">category</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+ <span class="n">category</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">category</span>
+ <span class="n">form</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;q&quot;</span><span class="p">:</span> <span class="n">args</span><span class="o">.</span><span class="n">query</span><span class="p">,</span>
+ <span class="s2">&quot;categories&quot;</span><span class="p">:</span> <span class="n">category</span><span class="p">,</span>
+ <span class="s2">&quot;pageno&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">pageno</span><span class="p">),</span>
+ <span class="s2">&quot;language&quot;</span><span class="p">:</span> <span class="n">args</span><span class="o">.</span><span class="n">lang</span><span class="p">,</span>
+ <span class="s2">&quot;time_range&quot;</span><span class="p">:</span> <span class="n">args</span><span class="o">.</span><span class="n">timerange</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="n">preferences</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">preferences</span><span class="o">.</span><span class="n">Preferences</span><span class="p">([</span><span class="s1">&#39;simple&#39;</span><span class="p">],</span> <span class="n">engine_categories</span><span class="p">,</span> <span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">engines</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="n">preferences</span><span class="o">.</span><span class="n">key_value_settings</span><span class="p">[</span><span class="s1">&#39;safesearch&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">safesearch</span><span class="p">)</span>
+
+ <span class="n">search_query</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">webadapter</span><span class="o">.</span><span class="n">get_search_query_from_webapp</span><span class="p">(</span><span class="n">preferences</span><span class="p">,</span> <span class="n">form</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">search_query</span></div>
+
+
+
+<div class="viewcode-block" id="no_parsed_url">
+<a class="viewcode-back" href="../../dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.no_parsed_url">[docs]</a>
+<span class="k">def</span> <span class="nf">no_parsed_url</span><span class="p">(</span><span class="n">results</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove parsed url from dict.&quot;&quot;&quot;</span>
+ <span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
+ <span class="k">del</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;parsed_url&#39;</span><span class="p">]</span>
+ <span class="k">return</span> <span class="n">results</span></div>
+
+
+
+<div class="viewcode-block" id="json_serial">
+<a class="viewcode-back" href="../../dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.json_serial">[docs]</a>
+<span class="k">def</span> <span class="nf">json_serial</span><span class="p">(</span><span class="n">obj</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;JSON serializer for objects not serializable by default json code.</span>
+
+<span class="sd"> :raise TypeError: raised when **obj** is not serializable</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">obj</span><span class="p">,</span> <span class="n">datetime</span><span class="p">):</span>
+ <span class="n">serial</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">serial</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">obj</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">set</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Type (</span><span class="si">{}</span><span class="s2">) not serializable&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span></div>
+
+
+
+<div class="viewcode-block" id="to_dict">
+<a class="viewcode-back" href="../../dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.to_dict">[docs]</a>
+<span class="k">def</span> <span class="nf">to_dict</span><span class="p">(</span><span class="n">search_query</span><span class="p">:</span> <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">SearchQuery</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get result from parsed arguments.&quot;&quot;&quot;</span>
+ <span class="n">result_container</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">Search</span><span class="p">(</span><span class="n">search_query</span><span class="p">)</span><span class="o">.</span><span class="n">search</span><span class="p">()</span>
+ <span class="n">result_container_json</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;search&quot;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s2">&quot;q&quot;</span><span class="p">:</span> <span class="n">search_query</span><span class="o">.</span><span class="n">query</span><span class="p">,</span>
+ <span class="s2">&quot;pageno&quot;</span><span class="p">:</span> <span class="n">search_query</span><span class="o">.</span><span class="n">pageno</span><span class="p">,</span>
+ <span class="s2">&quot;lang&quot;</span><span class="p">:</span> <span class="n">search_query</span><span class="o">.</span><span class="n">lang</span><span class="p">,</span>
+ <span class="s2">&quot;safesearch&quot;</span><span class="p">:</span> <span class="n">search_query</span><span class="o">.</span><span class="n">safesearch</span><span class="p">,</span>
+ <span class="s2">&quot;timerange&quot;</span><span class="p">:</span> <span class="n">search_query</span><span class="o">.</span><span class="n">time_range</span><span class="p">,</span>
+ <span class="p">},</span>
+ <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="n">no_parsed_url</span><span class="p">(</span><span class="n">result_container</span><span class="o">.</span><span class="n">get_ordered_results</span><span class="p">()),</span>
+ <span class="s2">&quot;infoboxes&quot;</span><span class="p">:</span> <span class="n">result_container</span><span class="o">.</span><span class="n">infoboxes</span><span class="p">,</span>
+ <span class="s2">&quot;suggestions&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">result_container</span><span class="o">.</span><span class="n">suggestions</span><span class="p">),</span>
+ <span class="s2">&quot;answers&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">result_container</span><span class="o">.</span><span class="n">answers</span><span class="p">),</span>
+ <span class="s2">&quot;paging&quot;</span><span class="p">:</span> <span class="n">result_container</span><span class="o">.</span><span class="n">paging</span><span class="p">,</span>
+ <span class="s2">&quot;number_of_results&quot;</span><span class="p">:</span> <span class="n">result_container</span><span class="o">.</span><span class="n">number_of_results</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="k">return</span> <span class="n">result_container_json</span></div>
+
+
+
+<div class="viewcode-block" id="parse_argument">
+<a class="viewcode-back" href="../../dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.parse_argument">[docs]</a>
+<span class="k">def</span> <span class="nf">parse_argument</span><span class="p">(</span>
+ <span class="n">args</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">category_choices</span><span class="p">:</span> <span class="n">EngineCategoriesVar</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">argparse</span><span class="o">.</span><span class="n">Namespace</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse command line.</span>
+
+<span class="sd"> :raise SystemExit: Query argument required on `args`</span>
+
+<span class="sd"> Examples:</span>
+
+<span class="sd"> &gt;&gt;&gt; import importlib</span>
+<span class="sd"> ... # load module</span>
+<span class="sd"> ... spec = importlib.util.spec_from_file_location(</span>
+<span class="sd"> ... &#39;utils.standalone_searx&#39;, &#39;utils/standalone_searx.py&#39;)</span>
+<span class="sd"> ... sas = importlib.util.module_from_spec(spec)</span>
+<span class="sd"> ... spec.loader.exec_module(sas)</span>
+<span class="sd"> ... sas.parse_argument()</span>
+<span class="sd"> usage: ptipython [-h] [--category [{general}]] [--lang [LANG]] [--pageno [PAGENO]] [--safesearch [{0,1,2}]] [--timerange [{day,week,month,year}]]</span>
+<span class="sd"> query</span>
+<span class="sd"> SystemExit: 2</span>
+<span class="sd"> &gt;&gt;&gt; sas.parse_argument([&#39;rain&#39;])</span>
+<span class="sd"> Namespace(category=&#39;general&#39;, lang=&#39;all&#39;, pageno=1, query=&#39;rain&#39;, safesearch=&#39;0&#39;, timerange=None)</span>
+<span class="sd"> &quot;&quot;&quot;</span> <span class="c1"># noqa: E501</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">category_choices</span><span class="p">:</span>
+ <span class="n">category_choices</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">categories</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+ <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">&#39;Standalone searx.&#39;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;query&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Text query&#39;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
+ <span class="s1">&#39;--category&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="n">category_choices</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;general&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Search category&#39;</span>
+ <span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--lang&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;all&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Search language&#39;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--pageno&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Page number starting from 1&#39;</span><span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
+ <span class="s1">&#39;--safesearch&#39;</span><span class="p">,</span>
+ <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span>
+ <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span>
+ <span class="n">choices</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;2&#39;</span><span class="p">],</span>
+ <span class="n">default</span><span class="o">=</span><span class="s1">&#39;0&#39;</span><span class="p">,</span>
+ <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Safe content filter from none to strict&#39;</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
+ <span class="s1">&#39;--timerange&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">&#39;?&#39;</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;day&#39;</span><span class="p">,</span> <span class="s1">&#39;week&#39;</span><span class="p">,</span> <span class="s1">&#39;month&#39;</span><span class="p">,</span> <span class="s1">&#39;year&#39;</span><span class="p">],</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Filter by time range&#39;</span>
+ <span class="p">)</span>
+ <span class="k">return</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">args</span><span class="p">)</span></div>
+
+
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
+ <span class="n">settings_engines</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">&#39;engines&#39;</span><span class="p">]</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">load_engines</span><span class="p">(</span><span class="n">settings_engines</span><span class="p">)</span>
+ <span class="n">engine_cs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">categories</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+ <span class="n">prog_args</span> <span class="o">=</span> <span class="n">parse_argument</span><span class="p">(</span><span class="n">category_choices</span><span class="o">=</span><span class="n">engine_cs</span><span class="p">)</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">initialize_network</span><span class="p">(</span><span class="n">settings_engines</span><span class="p">,</span> <span class="n">searx</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">&#39;outgoing&#39;</span><span class="p">])</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">check_network_configuration</span><span class="p">()</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">initialize_metrics</span><span class="p">([</span><span class="n">engine</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">engine</span> <span class="ow">in</span> <span class="n">settings_engines</span><span class="p">])</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">initialize_processors</span><span class="p">(</span><span class="n">settings_engines</span><span class="p">)</span>
+ <span class="n">search_q</span> <span class="o">=</span> <span class="n">get_search_query</span><span class="p">(</span><span class="n">prog_args</span><span class="p">,</span> <span class="n">engine_categories</span><span class="o">=</span><span class="n">engine_cs</span><span class="p">)</span>
+ <span class="n">res_dict</span> <span class="o">=</span> <span class="n">to_dict</span><span class="p">(</span><span class="n">search_q</span><span class="p">)</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">dumps</span><span class="p">(</span><span class="n">res_dict</span><span class="p">,</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">json_serial</span><span class="p">))</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searxng_extra/update/update_engine_descriptions.html b/_modules/searxng_extra/update/update_engine_descriptions.html
new file mode 100644
index 000000000..fcef2685f
--- /dev/null
+++ b/_modules/searxng_extra/update/update_engine_descriptions.html
@@ -0,0 +1,482 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra.update.update_engine_descriptions &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searxng_extra.update.update_engine_descriptions</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searxng_extra.update.update_engine_descriptions</h1><div class="highlight"><pre>
+<span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="sd">&quot;&quot;&quot;Fetch website description from websites and from</span>
+<span class="sd">:origin:`searx/engines/wikidata.py` engine.</span>
+
+<span class="sd">Output file: :origin:`searx/data/engine_descriptions.json`.</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="c1"># pylint: disable=invalid-name, global-statement</span>
+
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlparse</span>
+<span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">join</span>
+
+<span class="kn">from</span> <span class="nn">lxml.html</span> <span class="kn">import</span> <span class="n">fromstring</span>
+
+<span class="kn">from</span> <span class="nn">searx.engines</span> <span class="kn">import</span> <span class="n">wikidata</span><span class="p">,</span> <span class="n">set_loggers</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">extract_text</span><span class="p">,</span> <span class="n">searx_useragent</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="n">LOCALE_NAMES</span><span class="p">,</span> <span class="n">locales_initialize</span><span class="p">,</span> <span class="n">match_locale</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">searx_dir</span>
+<span class="kn">from</span> <span class="nn">searx.utils</span> <span class="kn">import</span> <span class="n">gen_useragent</span><span class="p">,</span> <span class="n">detect_language</span>
+<span class="kn">import</span> <span class="nn">searx.search</span>
+<span class="kn">import</span> <span class="nn">searx.network</span>
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">data_dir</span>
+
+<span class="n">DATA_FILE</span> <span class="o">=</span> <span class="n">data_dir</span> <span class="o">/</span> <span class="s1">&#39;engine_descriptions.json&#39;</span>
+
+<span class="n">set_loggers</span><span class="p">(</span><span class="n">wikidata</span><span class="p">,</span> <span class="s1">&#39;wikidata&#39;</span><span class="p">)</span>
+<span class="n">locales_initialize</span><span class="p">()</span>
+
+<span class="c1"># you can run the query in https://query.wikidata.org</span>
+<span class="c1"># replace %IDS% by Wikidata entities separated by spaces with the prefix wd:</span>
+<span class="c1"># for example wd:Q182496 wd:Q1540899</span>
+<span class="c1"># replace %LANGUAGES_SPARQL% by languages</span>
+<span class="n">SPARQL_WIKIPEDIA_ARTICLE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">SELECT DISTINCT ?item ?name ?article ?lang</span>
+<span class="s2">WHERE {</span>
+<span class="s2"> hint:Query hint:optimizer &quot;None&quot;.</span>
+<span class="s2"> VALUES ?item { %IDS% }</span>
+<span class="s2"> ?article schema:about ?item ;</span>
+<span class="s2"> schema:inLanguage ?lang ;</span>
+<span class="s2"> schema:name ?name ;</span>
+<span class="s2"> schema:isPartOf [ wikibase:wikiGroup &quot;wikipedia&quot; ] .</span>
+<span class="s2"> FILTER(?lang in (%LANGUAGES_SPARQL%)) .</span>
+<span class="s2"> FILTER (!CONTAINS(?name, &#39;:&#39;)) .</span>
+<span class="s2">}</span>
+<span class="s2">ORDER BY ?item ?lang</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="n">SPARQL_DESCRIPTION</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">SELECT DISTINCT ?item ?itemDescription</span>
+<span class="s2">WHERE {</span>
+<span class="s2"> VALUES ?item { %IDS% }</span>
+<span class="s2"> ?item schema:description ?itemDescription .</span>
+<span class="s2"> FILTER (lang(?itemDescription) in (%LANGUAGES_SPARQL%))</span>
+<span class="s2">}</span>
+<span class="s2">ORDER BY ?itemLang</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="n">NOT_A_DESCRIPTION</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="s1">&#39;web site&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;site web&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;komputa serĉilo&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;interreta serĉilo&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;bilaketa motor&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;web search engine&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;wikimedia täpsustuslehekülg&#39;</span><span class="p">,</span>
+<span class="p">]</span>
+
+<span class="n">SKIP_ENGINE_SOURCE</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="c1"># fmt: off</span>
+ <span class="p">(</span><span class="s1">&#39;gitlab&#39;</span><span class="p">,</span> <span class="s1">&#39;wikidata&#39;</span><span class="p">)</span>
+ <span class="c1"># descriptions are about wikipedia disambiguation pages</span>
+ <span class="c1"># fmt: on</span>
+<span class="p">]</span>
+
+<span class="n">WIKIPEDIA_LANGUAGES</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="n">LANGUAGES_SPARQL</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+<span class="n">IDS</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="n">WIKIPEDIA_LANGUAGE_VARIANTS</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;zh_Hant&#39;</span><span class="p">:</span> <span class="s1">&#39;zh-tw&#39;</span><span class="p">}</span>
+
+
+<span class="n">descriptions</span> <span class="o">=</span> <span class="p">{}</span>
+<span class="n">wd_to_engine_name</span> <span class="o">=</span> <span class="p">{}</span>
+
+
+<span class="k">def</span> <span class="nf">normalize_description</span><span class="p">(</span><span class="n">description</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">chr</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">31</span><span class="p">)]:</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="n">description</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">description</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">description</span>
+
+
+<span class="k">def</span> <span class="nf">update_description</span><span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">lang</span><span class="p">,</span> <span class="n">description</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">replace</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">description</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">return</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="n">normalize_description</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">description</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">engine_name</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="n">description</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="n">NOT_A_DESCRIPTION</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span> <span class="ow">in</span> <span class="n">SKIP_ENGINE_SOURCE</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="s1">&#39; &#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">description</span><span class="p">:</span>
+ <span class="c1"># skip unique word description (like &quot;website&quot;)</span>
+ <span class="k">return</span>
+ <span class="k">if</span> <span class="n">replace</span> <span class="ow">or</span> <span class="n">lang</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">descriptions</span><span class="p">[</span><span class="n">engine_name</span><span class="p">]:</span>
+ <span class="n">descriptions</span><span class="p">[</span><span class="n">engine_name</span><span class="p">][</span><span class="n">lang</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">description</span><span class="p">,</span> <span class="n">source</span><span class="p">]</span>
+
+
+<span class="k">def</span> <span class="nf">get_wikipedia_summary</span><span class="p">(</span><span class="n">wikipedia_url</span><span class="p">,</span> <span class="n">searxng_locale</span><span class="p">):</span>
+ <span class="c1"># get the REST API URL from the HTML URL</span>
+
+ <span class="c1"># Headers</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="n">searx_useragent</span><span class="p">()}</span>
+
+ <span class="k">if</span> <span class="n">searxng_locale</span> <span class="ow">in</span> <span class="n">WIKIPEDIA_LANGUAGE_VARIANTS</span><span class="p">:</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">WIKIPEDIA_LANGUAGE_VARIANTS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">searxng_locale</span><span class="p">)</span>
+
+ <span class="c1"># URL path : from HTML URL to REST API URL</span>
+ <span class="n">parsed_url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">wikipedia_url</span><span class="p">)</span>
+ <span class="c1"># remove the /wiki/ prefix</span>
+ <span class="n">article_name</span> <span class="o">=</span> <span class="n">parsed_url</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/wiki/&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="c1"># article_name is already encoded but not the / which is required for the REST API call</span>
+ <span class="n">encoded_article_name</span> <span class="o">=</span> <span class="n">article_name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%2F</span><span class="s1">&#39;</span><span class="p">)</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;/api/rest_v1/page/summary/&#39;</span> <span class="o">+</span> <span class="n">encoded_article_name</span>
+ <span class="n">wikipedia_rest_url</span> <span class="o">=</span> <span class="n">parsed_url</span><span class="o">.</span><span class="n">_replace</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span><span class="o">.</span><span class="n">geturl</span><span class="p">()</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="n">searx</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">wikipedia_rest_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
+ <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="n">wikipedia_url</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">api_result</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">api_result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;extract&#39;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">get_website_description</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">lang1</span><span class="p">,</span> <span class="n">lang2</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;User-Agent&#39;</span><span class="p">:</span> <span class="n">gen_useragent</span><span class="p">(),</span>
+ <span class="s1">&#39;Accept&#39;</span><span class="p">:</span> <span class="s1">&#39;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;DNT&#39;</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;Upgrade-Insecure-Requests&#39;</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;Sec-GPC&#39;</span><span class="p">:</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;Cache-Control&#39;</span><span class="p">:</span> <span class="s1">&#39;max-age=0&#39;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="k">if</span> <span class="n">lang1</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">lang_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">lang1</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">lang2</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">lang_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lang2</span><span class="p">)</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lang_list</span><span class="p">)</span><span class="si">}</span><span class="s1">;q=0.8&#39;</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="n">searx</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">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
+ <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
+ <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="c1"># pylint: disable=broad-except</span>
+ <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">html</span> <span class="o">=</span> <span class="n">fromstring</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="n">html</span> <span class="o">=</span> <span class="n">fromstring</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="n">description</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">html</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;/html/head/meta[@name=&quot;description&quot;]/@content&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">description</span><span class="p">:</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">html</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;/html/head/meta[@property=&quot;og:description&quot;]/@content&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">description</span><span class="p">:</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">html</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;/html/head/title&#39;</span><span class="p">))</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">extract_text</span><span class="p">(</span><span class="n">html</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s1">&#39;/html/@lang&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">lang</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">lang1</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">lang1</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">detect_language</span><span class="p">(</span><span class="n">description</span><span class="p">)</span> <span class="ow">or</span> <span class="n">lang</span> <span class="ow">or</span> <span class="s1">&#39;en&#39;</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</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">lang</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">initialize</span><span class="p">():</span>
+ <span class="k">global</span> <span class="n">IDS</span><span class="p">,</span> <span class="n">LANGUAGES_SPARQL</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+ <span class="n">wikipedia_engine</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">engines</span><span class="p">[</span><span class="s1">&#39;wikipedia&#39;</span><span class="p">]</span>
+
+ <span class="n">locale2lang</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;nl-BE&#39;</span><span class="p">:</span> <span class="s1">&#39;nl&#39;</span><span class="p">}</span>
+ <span class="k">for</span> <span class="n">sxng_ui_lang</span> <span class="ow">in</span> <span class="n">LOCALE_NAMES</span><span class="p">:</span>
+
+ <span class="n">sxng_ui_alias</span> <span class="o">=</span> <span class="n">locale2lang</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_ui_lang</span><span class="p">,</span> <span class="n">sxng_ui_lang</span><span class="p">)</span>
+ <span class="n">wiki_lang</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="n">sxng_ui_alias</span> <span class="ow">in</span> <span class="n">wikipedia_engine</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;WIKIPEDIA_LANGUAGES&#39;</span><span class="p">]:</span>
+ <span class="n">wiki_lang</span> <span class="o">=</span> <span class="n">sxng_ui_alias</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">wiki_lang</span><span class="p">:</span>
+ <span class="n">wiki_lang</span> <span class="o">=</span> <span class="n">wikipedia_engine</span><span class="o">.</span><span class="n">traits</span><span class="o">.</span><span class="n">get_language</span><span class="p">(</span><span class="n">sxng_ui_alias</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">wiki_lang</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;WIKIPEDIA_LANGUAGES missing </span><span class="si">{</span><span class="n">sxng_ui_lang</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="k">continue</span>
+ <span class="n">WIKIPEDIA_LANGUAGES</span><span class="p">[</span><span class="n">sxng_ui_lang</span><span class="p">]</span> <span class="o">=</span> <span class="n">wiki_lang</span>
+
+ <span class="n">LANGUAGES_SPARQL</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;&#39;</span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">&#39;&quot;</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">set</span><span class="p">(</span><span class="n">WIKIPEDIA_LANGUAGES</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
+ <span class="k">for</span> <span class="n">engine_name</span><span class="p">,</span> <span class="n">engine</span> <span class="ow">in</span> <span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">descriptions</span><span class="p">[</span><span class="n">engine_name</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">wikidata_id</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s2">&quot;about&quot;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;wikidata_id&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">wikidata_id</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">wd_to_engine_name</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">wikidata_id</span><span class="p">,</span> <span class="nb">set</span><span class="p">())</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">engine_name</span><span class="p">)</span>
+
+ <span class="n">IDS</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">wd_id</span><span class="p">:</span> <span class="s1">&#39;wd:&#39;</span> <span class="o">+</span> <span class="n">wd_id</span><span class="p">,</span> <span class="n">wd_to_engine_name</span><span class="o">.</span><span class="n">keys</span><span class="p">())))</span>
+
+
+<span class="k">def</span> <span class="nf">fetch_wikidata_descriptions</span><span class="p">():</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Fetching wikidata descriptions&#39;</span><span class="p">)</span>
+ <span class="n">searx</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">set_timeout_for_thread</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">wikidata</span><span class="o">.</span><span class="n">send_wikidata_query</span><span class="p">(</span>
+ <span class="n">SPARQL_DESCRIPTION</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%IDS%&#39;</span><span class="p">,</span> <span class="n">IDS</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%LANGUAGES_SPARQL%&#39;</span><span class="p">,</span> <span class="n">LANGUAGES_SPARQL</span><span class="p">)</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">binding</span> <span class="ow">in</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">][</span><span class="s1">&#39;bindings&#39;</span><span class="p">]:</span>
+ <span class="n">wikidata_id</span> <span class="o">=</span> <span class="n">binding</span><span class="p">[</span><span class="s1">&#39;item&#39;</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;http://www.wikidata.org/entity/&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">wikidata_lang</span> <span class="o">=</span> <span class="n">binding</span><span class="p">[</span><span class="s1">&#39;itemDescription&#39;</span><span class="p">][</span><span class="s1">&#39;xml:lang&#39;</span><span class="p">]</span>
+ <span class="n">desc</span> <span class="o">=</span> <span class="n">binding</span><span class="p">[</span><span class="s1">&#39;itemDescription&#39;</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span>
+ <span class="k">for</span> <span class="n">engine_name</span> <span class="ow">in</span> <span class="n">wd_to_engine_name</span><span class="p">[</span><span class="n">wikidata_id</span><span class="p">]:</span>
+ <span class="k">for</span> <span class="n">searxng_locale</span> <span class="ow">in</span> <span class="n">LOCALE_NAMES</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">WIKIPEDIA_LANGUAGES</span><span class="p">[</span><span class="n">searxng_locale</span><span class="p">]</span> <span class="o">!=</span> <span class="n">wikidata_lang</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="nb">print</span><span class="p">(</span>
+ <span class="sa">f</span><span class="s2">&quot; engine: </span><span class="si">{</span><span class="n">engine_name</span><span class="si">:</span><span class="s2">20</span><span class="si">}</span><span class="s2"> / wikidata_lang: </span><span class="si">{</span><span class="n">wikidata_lang</span><span class="si">:</span><span class="s2">5</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="sa">f</span><span class="s2">&quot;/ len(wikidata_desc): </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">desc</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="n">update_description</span><span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">searxng_locale</span><span class="p">,</span> <span class="n">desc</span><span class="p">,</span> <span class="s1">&#39;wikidata&#39;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">fetch_wikipedia_descriptions</span><span class="p">():</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Fetching wikipedia descriptions&#39;</span><span class="p">)</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">wikidata</span><span class="o">.</span><span class="n">send_wikidata_query</span><span class="p">(</span>
+ <span class="n">SPARQL_WIKIPEDIA_ARTICLE</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%IDS%&#39;</span><span class="p">,</span> <span class="n">IDS</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%LANGUAGES_SPARQL%&#39;</span><span class="p">,</span> <span class="n">LANGUAGES_SPARQL</span><span class="p">)</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">binding</span> <span class="ow">in</span> <span class="n">result</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">][</span><span class="s1">&#39;bindings&#39;</span><span class="p">]:</span>
+ <span class="n">wikidata_id</span> <span class="o">=</span> <span class="n">binding</span><span class="p">[</span><span class="s1">&#39;item&#39;</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;http://www.wikidata.org/entity/&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">wikidata_lang</span> <span class="o">=</span> <span class="n">binding</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">][</span><span class="s1">&#39;xml:lang&#39;</span><span class="p">]</span>
+ <span class="n">wikipedia_url</span> <span class="o">=</span> <span class="n">binding</span><span class="p">[</span><span class="s1">&#39;article&#39;</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span> <span class="c1"># for example the URL https://de.wikipedia.org/wiki/PubMed</span>
+ <span class="k">for</span> <span class="n">engine_name</span> <span class="ow">in</span> <span class="n">wd_to_engine_name</span><span class="p">[</span><span class="n">wikidata_id</span><span class="p">]:</span>
+ <span class="k">for</span> <span class="n">searxng_locale</span> <span class="ow">in</span> <span class="n">LOCALE_NAMES</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">WIKIPEDIA_LANGUAGES</span><span class="p">[</span><span class="n">searxng_locale</span><span class="p">]</span> <span class="o">!=</span> <span class="n">wikidata_lang</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="n">desc</span> <span class="o">=</span> <span class="n">get_wikipedia_summary</span><span class="p">(</span><span class="n">wikipedia_url</span><span class="p">,</span> <span class="n">searxng_locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">desc</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="nb">print</span><span class="p">(</span>
+ <span class="sa">f</span><span class="s2">&quot; engine: </span><span class="si">{</span><span class="n">engine_name</span><span class="si">:</span><span class="s2">20</span><span class="si">}</span><span class="s2"> / wikidata_lang: </span><span class="si">{</span><span class="n">wikidata_lang</span><span class="si">:</span><span class="s2">5</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="sa">f</span><span class="s2">&quot;/ len(wikipedia_desc): </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">desc</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="n">update_description</span><span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">searxng_locale</span><span class="p">,</span> <span class="n">desc</span><span class="p">,</span> <span class="s1">&#39;wikipedia&#39;</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">normalize_url</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{language}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">_replace</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">fragment</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">geturl</span><span class="p">()</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;https://api.&#39;</span><span class="p">,</span> <span class="s1">&#39;https://&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">url</span>
+
+
+<span class="k">def</span> <span class="nf">fetch_website_description</span><span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">website</span><span class="p">):</span>
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;- fetch website descr: </span><span class="si">{</span><span class="n">engine_name</span><span class="si">}</span><span class="s2"> / </span><span class="si">{</span><span class="n">website</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+ <span class="n">default_lang</span><span class="p">,</span> <span class="n">default_description</span> <span class="o">=</span> <span class="n">get_website_description</span><span class="p">(</span><span class="n">website</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">default_lang</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">default_description</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="c1"># the front page can&#39;t be fetched: skip this engine</span>
+ <span class="k">return</span>
+
+ <span class="c1"># to specify an order in where the most common languages are in front of the</span>
+ <span class="c1"># language list ..</span>
+ <span class="n">languages</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;en&#39;</span><span class="p">,</span> <span class="s1">&#39;es&#39;</span><span class="p">,</span> <span class="s1">&#39;pt&#39;</span><span class="p">,</span> <span class="s1">&#39;ru&#39;</span><span class="p">,</span> <span class="s1">&#39;tr&#39;</span><span class="p">,</span> <span class="s1">&#39;fr&#39;</span><span class="p">]</span>
+ <span class="n">languages</span> <span class="o">=</span> <span class="n">languages</span> <span class="o">+</span> <span class="p">[</span><span class="n">l</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">LOCALE_NAMES</span> <span class="k">if</span> <span class="n">l</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">languages</span><span class="p">]</span>
+
+ <span class="n">previous_matched_lang</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">previous_count</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">languages</span><span class="p">:</span>
+
+ <span class="k">if</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">descriptions</span><span class="p">[</span><span class="n">engine_name</span><span class="p">]:</span>
+ <span class="k">continue</span>
+
+ <span class="n">fetched_lang</span><span class="p">,</span> <span class="n">desc</span> <span class="o">=</span> <span class="n">get_website_description</span><span class="p">(</span><span class="n">website</span><span class="p">,</span> <span class="n">lang</span><span class="p">,</span> <span class="n">WIKIPEDIA_LANGUAGES</span><span class="p">[</span><span class="n">lang</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">fetched_lang</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">desc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="c1"># check if desc changed with the different lang values</span>
+
+ <span class="k">if</span> <span class="n">fetched_lang</span> <span class="o">==</span> <span class="n">previous_matched_lang</span><span class="p">:</span>
+ <span class="n">previous_count</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">previous_count</span> <span class="o">==</span> <span class="mi">6</span><span class="p">:</span>
+ <span class="c1"># the website has returned the same description for 6 different languages in Accept-Language header</span>
+ <span class="c1"># stop now</span>
+ <span class="k">break</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">previous_matched_lang</span> <span class="o">=</span> <span class="n">fetched_lang</span>
+ <span class="n">previous_count</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="c1"># Don&#39;t trust in the value of fetched_lang, some websites return</span>
+ <span class="c1"># for some inappropriate values, by example bing-images::</span>
+ <span class="c1">#</span>
+ <span class="c1"># requested lang: zh-Hans-CN / fetched lang: ceb / desc: 查看根据您的兴趣量身定制的提要</span>
+ <span class="c1">#</span>
+ <span class="c1"># The lang ceb is &quot;Cebuano&quot; but the description is given in zh-Hans-CN</span>
+
+ <span class="nb">print</span><span class="p">(</span>
+ <span class="sa">f</span><span class="s2">&quot; engine: </span><span class="si">{</span><span class="n">engine_name</span><span class="si">:</span><span class="s2">20</span><span class="si">}</span><span class="s2"> / requested lang:</span><span class="si">{</span><span class="n">lang</span><span class="si">:</span><span class="s2">7</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="sa">f</span><span class="s2">&quot; / fetched lang: </span><span class="si">{</span><span class="n">fetched_lang</span><span class="si">:</span><span class="s2">7</span><span class="si">}</span><span class="s2"> / len(desc): </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">desc</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
+ <span class="p">)</span>
+
+ <span class="n">matched_lang</span> <span class="o">=</span> <span class="n">match_locale</span><span class="p">(</span><span class="n">fetched_lang</span><span class="p">,</span> <span class="n">LOCALE_NAMES</span><span class="o">.</span><span class="n">keys</span><span class="p">(),</span> <span class="n">fallback</span><span class="o">=</span><span class="n">lang</span><span class="p">)</span>
+ <span class="n">update_description</span><span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">matched_lang</span><span class="p">,</span> <span class="n">desc</span><span class="p">,</span> <span class="n">website</span><span class="p">,</span> <span class="n">replace</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">fetch_website_descriptions</span><span class="p">():</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Fetching website descriptions&#39;</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">engine_name</span><span class="p">,</span> <span class="n">engine</span> <span class="ow">in</span> <span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">website</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s2">&quot;about&quot;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;website&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">website</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s2">&quot;search_url&quot;</span><span class="p">):</span>
+ <span class="n">website</span> <span class="o">=</span> <span class="n">normalize_url</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s2">&quot;search_url&quot;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">website</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s2">&quot;base_url&quot;</span><span class="p">):</span>
+ <span class="n">website</span> <span class="o">=</span> <span class="n">normalize_url</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="s2">&quot;base_url&quot;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">website</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">fetch_website_description</span><span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">website</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">get_engine_descriptions_filename</span><span class="p">():</span>
+ <span class="k">return</span> <span class="n">join</span><span class="p">(</span><span class="n">join</span><span class="p">(</span><span class="n">searx_dir</span><span class="p">,</span> <span class="s2">&quot;data&quot;</span><span class="p">),</span> <span class="s2">&quot;engine_descriptions.json&quot;</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="get_output">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_engine_descriptions.get_output">[docs]</a>
+<span class="k">def</span> <span class="nf">get_output</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> From descriptions[engine][language] = [description, source]</span>
+<span class="sd"> To</span>
+
+<span class="sd"> * output[language][engine] = description_and_source</span>
+<span class="sd"> * description_and_source can be:</span>
+<span class="sd"> * [description, source]</span>
+<span class="sd"> * description (if source = &quot;wikipedia&quot;)</span>
+<span class="sd"> * [f&quot;engine:lang&quot;, &quot;ref&quot;] (reference to another existing description)</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">output</span> <span class="o">=</span> <span class="p">{</span><span class="n">locale</span><span class="p">:</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">locale</span> <span class="ow">in</span> <span class="n">LOCALE_NAMES</span><span class="p">}</span>
+
+ <span class="n">seen_descriptions</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">for</span> <span class="n">engine_name</span><span class="p">,</span> <span class="n">lang_descriptions</span> <span class="ow">in</span> <span class="n">descriptions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">language</span><span class="p">,</span> <span class="n">description</span> <span class="ow">in</span> <span class="n">lang_descriptions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">description</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">seen_descriptions</span><span class="p">:</span>
+ <span class="n">ref</span> <span class="o">=</span> <span class="n">seen_descriptions</span><span class="p">[</span><span class="n">description</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">ref</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s1">:</span><span class="si">{</span><span class="n">ref</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;ref&#39;</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">seen_descriptions</span><span class="p">[</span><span class="n">description</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">description</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;wikipedia&#39;</span><span class="p">:</span>
+ <span class="n">description</span> <span class="o">=</span> <span class="n">description</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">output</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">language</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">engine_name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">output</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+ <span class="n">initialize</span><span class="p">()</span>
+ <span class="n">fetch_wikidata_descriptions</span><span class="p">()</span>
+ <span class="n">fetch_wikipedia_descriptions</span><span class="p">()</span>
+ <span class="n">fetch_website_descriptions</span><span class="p">()</span>
+
+ <span class="n">output</span> <span class="o">=</span> <span class="n">get_output</span><span class="p">()</span>
+ <span class="k">with</span> <span class="n">DATA_FILE</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">separators</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">,</span> <span class="s1">&#39;:&#39;</span><span class="p">),</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">))</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="n">main</span><span class="p">()</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searxng_extra/update/update_engine_traits.html b/_modules/searxng_extra/update/update_engine_traits.html
new file mode 100644
index 000000000..9d5f59b32
--- /dev/null
+++ b/_modules/searxng_extra/update/update_engine_traits.html
@@ -0,0 +1,319 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra.update.update_engine_traits &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searxng_extra.update.update_engine_traits</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searxng_extra.update.update_engine_traits</h1><div class="highlight"><pre>
+<span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="sd">&quot;&quot;&quot;Update :py:obj:`searx.enginelib.traits.EngineTraitsMap` and :origin:`searx/languages.py`</span>
+
+<span class="sd">:py:obj:`searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE`:</span>
+<span class="sd"> Persistence of engines traits, fetched from the engines.</span>
+
+<span class="sd">:origin:`searx/languages.py`</span>
+<span class="sd"> Is generated from intersecting each engine&#39;s supported traits.</span>
+
+<span class="sd">The script :origin:`searxng_extra/update/update_engine_traits.py` is called in</span>
+<span class="sd">the :origin:`CI Update data ... &lt;.github/workflows/data-update.yml&gt;`</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="c1"># pylint: disable=invalid-name</span>
+<span class="kn">from</span> <span class="nn">unicodedata</span> <span class="kn">import</span> <span class="n">lookup</span>
+<span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pformat</span>
+<span class="kn">import</span> <span class="nn">babel</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">settings</span><span class="p">,</span> <span class="n">searx_dir</span>
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">network</span>
+<span class="kn">from</span> <span class="nn">searx.engines</span> <span class="kn">import</span> <span class="n">load_engines</span>
+<span class="kn">from</span> <span class="nn">searx.enginelib.traits</span> <span class="kn">import</span> <span class="n">EngineTraitsMap</span>
+
+<span class="c1"># Output files.</span>
+<span class="n">languages_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">searx_dir</span><span class="p">)</span> <span class="o">/</span> <span class="s1">&#39;sxng_locales.py&#39;</span>
+<span class="n">languages_file_header</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>
+<span class="s2"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="s2">&#39;&#39;&#39;List of SearXNG&#39;s locale codes.</span>
+
+<span class="s2">.. hint::</span>
+
+<span class="s2"> Don&#39;t modify this file, this file is generated by::</span>
+
+<span class="s2"> ./manage data.traits</span>
+<span class="s2">&#39;&#39;&#39;</span>
+
+<span class="s2">sxng_locales = (</span>
+<span class="s2">&quot;&quot;&quot;</span>
+<span class="n">languages_file_footer</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;,</span>
+<span class="s2">)</span>
+<span class="s2">&#39;&#39;&#39;</span>
+<span class="s2">A list of five-digit tuples:</span>
+
+<span class="s2">0. SearXNG&#39;s internal locale tag (a language or region tag)</span>
+<span class="s2">1. Name of the language (:py:obj:`babel.core.Locale.get_language_name`)</span>
+<span class="s2">2. For region tags the name of the region (:py:obj:`babel.core.Locale.get_territory_name`).</span>
+<span class="s2"> Empty string for language tags.</span>
+<span class="s2">3. English language name (from :py:obj:`babel.core.Locale.english_name`)</span>
+<span class="s2">4. Unicode flag (emoji) that fits to SearXNG&#39;s internal region tag. Languages</span>
+<span class="s2"> are represented by a globe (</span><span class="se">\U0001F310</span><span class="s2">)</span>
+
+<span class="s2">.. code:: python</span>
+
+<span class="s2"> (&#39;en&#39;, &#39;English&#39;, &#39;&#39;, &#39;English&#39;, &#39;</span><span class="se">\U0001f310</span><span class="s2">&#39;),</span>
+<span class="s2"> (&#39;en-CA&#39;, &#39;English&#39;, &#39;Canada&#39;, &#39;English&#39;, &#39;</span><span class="se">\U0001f1e8\U0001f1e6</span><span class="s2">&#39;),</span>
+<span class="s2"> (&#39;en-US&#39;, &#39;English&#39;, &#39;United States&#39;, &#39;English&#39;, &#39;</span><span class="se">\U0001f1fa\U0001f1f8</span><span class="s2">&#39;),</span>
+<span class="s2"> ..</span>
+<span class="s2"> (&#39;fr&#39;, &#39;Français&#39;, &#39;&#39;, &#39;French&#39;, &#39;</span><span class="se">\U0001f310</span><span class="s2">&#39;),</span>
+<span class="s2"> (&#39;fr-BE&#39;, &#39;Français&#39;, &#39;Belgique&#39;, &#39;French&#39;, &#39;</span><span class="se">\U0001f1e7\U0001f1ea</span><span class="s2">&#39;),</span>
+<span class="s2"> (&#39;fr-CA&#39;, &#39;Français&#39;, &#39;Canada&#39;, &#39;French&#39;, &#39;</span><span class="se">\U0001f1e8\U0001f1e6</span><span class="s2">&#39;),</span>
+
+<span class="s2">:meta hide-value:</span>
+<span class="s2">&#39;&#39;&#39;</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+
+<span class="n">lang2emoji</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;ha&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\U0001F1F3\U0001F1EA</span><span class="s1">&#39;</span><span class="p">,</span> <span class="c1"># Hausa / Niger</span>
+ <span class="s1">&#39;bs&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\U0001F1E7\U0001F1E6</span><span class="s1">&#39;</span><span class="p">,</span> <span class="c1"># Bosnian / Bosnia &amp; Herzegovina</span>
+ <span class="s1">&#39;jp&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\U0001F1EF\U0001F1F5</span><span class="s1">&#39;</span><span class="p">,</span> <span class="c1"># Japanese</span>
+ <span class="s1">&#39;ua&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\U0001F1FA\U0001F1E6</span><span class="s1">&#39;</span><span class="p">,</span> <span class="c1"># Ukrainian</span>
+ <span class="s1">&#39;he&#39;</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\U0001F1EE\U0001F1F1</span><span class="s1">&#39;</span><span class="p">,</span> <span class="c1"># Hebrew</span>
+<span class="p">}</span>
+
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+ <span class="n">load_engines</span><span class="p">(</span><span class="n">settings</span><span class="p">[</span><span class="s1">&#39;engines&#39;</span><span class="p">])</span>
+ <span class="c1"># traits_map = EngineTraitsMap.from_data()</span>
+ <span class="n">traits_map</span> <span class="o">=</span> <span class="n">fetch_traits_map</span><span class="p">()</span>
+ <span class="n">sxng_tag_list</span> <span class="o">=</span> <span class="n">filter_locales</span><span class="p">(</span><span class="n">traits_map</span><span class="p">)</span>
+ <span class="n">write_languages_file</span><span class="p">(</span><span class="n">sxng_tag_list</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="fetch_traits_map">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.fetch_traits_map">[docs]</a>
+<span class="k">def</span> <span class="nf">fetch_traits_map</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fetchs supported languages for each engine and writes json file with those.&quot;&quot;&quot;</span>
+ <span class="n">network</span><span class="o">.</span><span class="n">set_timeout_for_thread</span><span class="p">(</span><span class="mf">10.0</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">log</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
+ <span class="nb">print</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+
+ <span class="n">traits_map</span> <span class="o">=</span> <span class="n">EngineTraitsMap</span><span class="o">.</span><span class="n">fetch_traits</span><span class="p">(</span><span class="n">log</span><span class="o">=</span><span class="n">log</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;fetched properties from </span><span class="si">%s</span><span class="s2"> engines&quot;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">traits_map</span><span class="p">))</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;write json file: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">traits_map</span><span class="o">.</span><span class="n">ENGINE_TRAITS_FILE</span><span class="p">)</span>
+ <span class="n">traits_map</span><span class="o">.</span><span class="n">save_data</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">traits_map</span></div>
+
+
+
+<div class="viewcode-block" id="filter_locales">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.filter_locales">[docs]</a>
+<span class="k">def</span> <span class="nf">filter_locales</span><span class="p">(</span><span class="n">traits_map</span><span class="p">:</span> <span class="n">EngineTraitsMap</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Filter language &amp; region tags by a threshold.&quot;&quot;&quot;</span>
+
+ <span class="n">min_eng_per_region</span> <span class="o">=</span> <span class="mi">15</span>
+ <span class="n">min_eng_per_lang</span> <span class="o">=</span> <span class="mi">20</span>
+
+ <span class="n">_</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">eng</span> <span class="ow">in</span> <span class="n">traits_map</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">reg</span> <span class="ow">in</span> <span class="n">eng</span><span class="o">.</span><span class="n">regions</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
+ <span class="n">_</span><span class="p">[</span><span class="n">reg</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">reg</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+
+ <span class="n">regions</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">_</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&gt;=</span> <span class="n">min_eng_per_region</span><span class="p">)</span>
+ <span class="n">lang_from_region</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">k</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">regions</span><span class="p">)</span>
+
+ <span class="n">_</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">eng</span> <span class="ow">in</span> <span class="n">traits_map</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">eng</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
+ <span class="c1"># ignore script types like zh_Hant, zh_Hans or sr_Latin, pa_Arab (they</span>
+ <span class="c1"># already counted by existence of &#39;zh&#39; or &#39;sr&#39;, &#39;pa&#39;)</span>
+ <span class="k">if</span> <span class="s1">&#39;_&#39;</span> <span class="ow">in</span> <span class="n">lang</span><span class="p">:</span>
+ <span class="c1"># print(&quot;ignore %s&quot; % lang)</span>
+ <span class="k">continue</span>
+ <span class="n">_</span><span class="p">[</span><span class="n">lang</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">lang</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+
+ <span class="n">languages</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">_</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&gt;=</span> <span class="n">min_eng_per_lang</span><span class="p">)</span>
+
+ <span class="n">sxng_tag_list</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+ <span class="n">sxng_tag_list</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">regions</span><span class="p">)</span>
+ <span class="n">sxng_tag_list</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">lang_from_region</span><span class="p">)</span>
+ <span class="n">sxng_tag_list</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">languages</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">sxng_tag_list</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">write_languages_file</span><span class="p">(</span><span class="n">sxng_tag_list</span><span class="p">):</span>
+
+ <span class="n">language_codes</span> <span class="o">=</span> <span class="p">[]</span>
+
+ <span class="k">for</span> <span class="n">sxng_tag</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">sxng_tag_list</span><span class="p">):</span>
+ <span class="n">sxng_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">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">sxng_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">flag</span> <span class="o">=</span> <span class="n">get_unicode_flag</span><span class="p">(</span><span class="n">sxng_locale</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span>
+
+ <span class="n">item</span> <span class="o">=</span> <span class="p">(</span>
+ <span class="n">sxng_tag</span><span class="p">,</span>
+ <span class="n">sxng_locale</span><span class="o">.</span><span class="n">get_language_name</span><span class="p">()</span><span class="o">.</span><span class="n">title</span><span class="p">(),</span> <span class="c1"># type: ignore</span>
+ <span class="n">sxng_locale</span><span class="o">.</span><span class="n">get_territory_name</span><span class="p">()</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
+ <span class="n">sxng_locale</span><span class="o">.</span><span class="n">english_name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; (&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">sxng_locale</span><span class="o">.</span><span class="n">english_name</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
+ <span class="n">UnicodeEscape</span><span class="p">(</span><span class="n">flag</span><span class="p">),</span>
+ <span class="p">)</span>
+
+ <span class="n">language_codes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+
+ <span class="n">language_codes</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">language_codes</span><span class="p">)</span>
+
+ <span class="k">with</span> <span class="n">languages_file</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">new_file</span><span class="p">:</span>
+ <span class="n">file_content</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{header}</span><span class="s2"> </span><span class="si">{language_codes}{footer}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">header</span><span class="o">=</span><span class="n">languages_file_header</span><span class="p">,</span>
+ <span class="n">language_codes</span><span class="o">=</span><span class="n">pformat</span><span class="p">(</span><span class="n">language_codes</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">120</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">)[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
+ <span class="n">footer</span><span class="o">=</span><span class="n">languages_file_footer</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="n">new_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">file_content</span><span class="p">)</span>
+ <span class="n">new_file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+
+<div class="viewcode-block" id="UnicodeEscape">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.UnicodeEscape">[docs]</a>
+<span class="k">class</span> <span class="nc">UnicodeEscape</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Escape unicode string in :py:obj:`pprint.pformat`&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;&#39;&quot;</span> <span class="o">+</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;unicode-escape&#39;</span><span class="p">)])</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span></div>
+
+
+
+<div class="viewcode-block" id="get_unicode_flag">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.get_unicode_flag">[docs]</a>
+<span class="k">def</span> <span class="nf">get_unicode_flag</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="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Determine a unicode flag (emoji) that fits to the ``locale``&quot;&quot;&quot;</span>
+
+ <span class="n">emoji</span> <span class="o">=</span> <span class="n">lang2emoji</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">language</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">emoji</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">emoji</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">:</span>
+ <span class="k">return</span> <span class="s1">&#39;</span><span class="se">\U0001F310</span><span class="s1">&#39;</span>
+
+ <span class="n">emoji</span> <span class="o">=</span> <span class="n">lang2emoji</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">emoji</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">emoji</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">c1</span> <span class="o">=</span> <span class="n">lookup</span><span class="p">(</span><span class="s1">&#39;REGIONAL INDICATOR SYMBOL LETTER &#39;</span> <span class="o">+</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="n">c2</span> <span class="o">=</span> <span class="n">lookup</span><span class="p">(</span><span class="s1">&#39;REGIONAL INDICATOR SYMBOL LETTER &#39;</span> <span class="o">+</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
+ <span class="c1"># print(&quot;OK : %s --&gt; %s%s&quot; % (locale, c1, c2))</span>
+ <span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR: </span><span class="si">%s</span><span class="s2"> --&gt; </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">exc</span><span class="p">))</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="k">return</span> <span class="n">c1</span> <span class="o">+</span> <span class="n">c2</span></div>
+
+
+
+<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="n">main</span><span class="p">()</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searxng_extra/update/update_external_bangs.html b/_modules/searxng_extra/update/update_external_bangs.html
new file mode 100644
index 000000000..f135ed2ee
--- /dev/null
+++ b/_modules/searxng_extra/update/update_external_bangs.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra.update.update_external_bangs &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searxng_extra.update.update_external_bangs</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searxng_extra.update.update_external_bangs</h1><div class="highlight"><pre>
+<span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="sd">&quot;&quot;&quot;Update :origin:`searx/data/external_bangs.json` using the duckduckgo bangs</span>
+<span class="sd">from :py:obj:`BANGS_URL`.</span>
+
+<span class="sd">- :origin:`CI Update data ... &lt;.github/workflows/data-update.yml&gt;`</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">import</span> <span class="nn">httpx</span>
+
+<span class="kn">from</span> <span class="nn">searx.external_bang</span> <span class="kn">import</span> <span class="n">LEAF_KEY</span>
+<span class="kn">from</span> <span class="nn">searx.data</span> <span class="kn">import</span> <span class="n">data_dir</span>
+
+<span class="n">DATA_FILE</span> <span class="o">=</span> <span class="n">data_dir</span> <span class="o">/</span> <span class="s1">&#39;external_bangs.json&#39;</span>
+
+<span class="n">BANGS_URL</span> <span class="o">=</span> <span class="s1">&#39;https://duckduckgo.com/bang.js&#39;</span>
+<span class="sd">&quot;&quot;&quot;JSON file which contains the bangs.&quot;&quot;&quot;</span>
+
+<span class="n">HTTPS_COLON</span> <span class="o">=</span> <span class="s1">&#39;https:&#39;</span>
+<span class="n">HTTP_COLON</span> <span class="o">=</span> <span class="s1">&#39;http:&#39;</span>
+
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;fetch bangs from </span><span class="si">{</span><span class="n">BANGS_URL</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">BANGS_URL</span><span class="p">)</span>
+ <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
+ <span class="n">ddg_bangs</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
+ <span class="n">trie</span> <span class="o">=</span> <span class="n">parse_ddg_bangs</span><span class="p">(</span><span class="n">ddg_bangs</span><span class="p">)</span>
+ <span class="n">output</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;version&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
+ <span class="s1">&#39;trie&#39;</span><span class="p">:</span> <span class="n">trie</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="k">with</span> <span class="n">DATA_FILE</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf8&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="merge_when_no_leaf">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_external_bangs.merge_when_no_leaf">[docs]</a>
+<span class="k">def</span> <span class="nf">merge_when_no_leaf</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Minimize the number of nodes</span>
+
+<span class="sd"> ``A -&gt; B -&gt; C``</span>
+
+<span class="sd"> - ``B`` is child of ``A``</span>
+<span class="sd"> - ``C`` is child of ``B``</span>
+
+<span class="sd"> If there are no ``C`` equals to ``&lt;LEAF_KEY&gt;``, then each ``C`` are merged</span>
+<span class="sd"> into ``A``. For example (5 nodes)::</span>
+
+<span class="sd"> d -&gt; d -&gt; g -&gt; &lt;LEAF_KEY&gt; (ddg)</span>
+<span class="sd"> -&gt; i -&gt; g -&gt; &lt;LEAF_KEY&gt; (dig)</span>
+
+<span class="sd"> becomes (3 nodes)::</span>
+
+<span class="sd"> d -&gt; dg -&gt; &lt;LEAF_KEY&gt;</span>
+<span class="sd"> -&gt; ig -&gt; &lt;LEAF_KEY&gt;</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">restart</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="c1"># create a copy of the keys so node can be modified</span>
+ <span class="n">keys</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">LEAF_KEY</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">value</span> <span class="o">=</span> <span class="n">node</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="n">value_keys</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">LEAF_KEY</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value_keys</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">value_key</span> <span class="ow">in</span> <span class="n">value_keys</span><span class="p">:</span>
+ <span class="n">node</span><span class="p">[</span><span class="n">key</span> <span class="o">+</span> <span class="n">value_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="n">value_key</span><span class="p">]</span>
+ <span class="n">merge_when_no_leaf</span><span class="p">(</span><span class="n">node</span><span class="p">[</span><span class="n">key</span> <span class="o">+</span> <span class="n">value_key</span><span class="p">])</span>
+ <span class="k">del</span> <span class="n">node</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="n">restart</span> <span class="o">=</span> <span class="kc">True</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">merge_when_no_leaf</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">restart</span><span class="p">:</span>
+ <span class="n">merge_when_no_leaf</span><span class="p">(</span><span class="n">node</span><span class="p">)</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">optimize_leaf</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">parent_key</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">LEAF_KEY</span> <span class="ow">in</span> <span class="n">node</span> <span class="ow">and</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">parent</span><span class="p">[</span><span class="n">parent_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">[</span><span class="n">LEAF_KEY</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">optimize_leaf</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">parse_ddg_bangs</span><span class="p">(</span><span class="n">ddg_bangs</span><span class="p">):</span>
+ <span class="n">bang_trie</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">bang_urls</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">for</span> <span class="n">bang_definition</span> <span class="ow">in</span> <span class="n">ddg_bangs</span><span class="p">:</span>
+ <span class="c1"># bang_list</span>
+ <span class="n">bang_url</span> <span class="o">=</span> <span class="n">bang_definition</span><span class="p">[</span><span class="s1">&#39;u&#39;</span><span class="p">]</span>
+ <span class="k">if</span> <span class="s1">&#39;{{</span><span class="si">{s}</span><span class="s1">}}&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">bang_url</span><span class="p">:</span>
+ <span class="c1"># ignore invalid bang</span>
+ <span class="k">continue</span>
+
+ <span class="n">bang_url</span> <span class="o">=</span> <span class="n">bang_url</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;{{</span><span class="si">{s}</span><span class="s1">}}&#39;</span><span class="p">,</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
+
+ <span class="c1"># only for the https protocol: &quot;https://example.com&quot; becomes &quot;//example.com&quot;</span>
+ <span class="k">if</span> <span class="n">bang_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">HTTPS_COLON</span> <span class="o">+</span> <span class="s1">&#39;//&#39;</span><span class="p">):</span>
+ <span class="n">bang_url</span> <span class="o">=</span> <span class="n">bang_url</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">HTTPS_COLON</span><span class="p">)</span> <span class="p">:]</span>
+
+ <span class="c1">#</span>
+ <span class="k">if</span> <span class="n">bang_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">HTTP_COLON</span> <span class="o">+</span> <span class="s1">&#39;//&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">bang_url</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">HTTP_COLON</span><span class="p">)</span> <span class="p">:]</span> <span class="ow">in</span> <span class="n">bang_urls</span><span class="p">:</span>
+ <span class="c1"># if the bang_url uses the http:// protocol, and the same URL exists in https://</span>
+ <span class="c1"># then reuse the https:// bang definition. (written //example.com)</span>
+ <span class="n">bang_def_output</span> <span class="o">=</span> <span class="n">bang_urls</span><span class="p">[</span><span class="n">bang_url</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">HTTP_COLON</span><span class="p">)</span> <span class="p">:]]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># normal use case : new http:// URL or https:// URL (without &quot;https:&quot;, see above)</span>
+ <span class="n">bang_rank</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">bang_definition</span><span class="p">[</span><span class="s1">&#39;r&#39;</span><span class="p">])</span>
+ <span class="n">bang_def_output</span> <span class="o">=</span> <span class="n">bang_url</span> <span class="o">+</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">bang_rank</span>
+ <span class="n">bang_def_output</span> <span class="o">=</span> <span class="n">bang_urls</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">bang_url</span><span class="p">,</span> <span class="n">bang_def_output</span><span class="p">)</span>
+
+ <span class="n">bang_urls</span><span class="p">[</span><span class="n">bang_url</span><span class="p">]</span> <span class="o">=</span> <span class="n">bang_def_output</span>
+
+ <span class="c1"># bang name</span>
+ <span class="n">bang</span> <span class="o">=</span> <span class="n">bang_definition</span><span class="p">[</span><span class="s1">&#39;t&#39;</span><span class="p">]</span>
+
+ <span class="c1"># bang_trie</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="n">bang_trie</span>
+ <span class="k">for</span> <span class="n">bang_letter</span> <span class="ow">in</span> <span class="n">bang</span><span class="p">:</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">bang_letter</span><span class="p">,</span> <span class="p">{})</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">LEAF_KEY</span><span class="p">,</span> <span class="n">bang_def_output</span><span class="p">)</span>
+
+ <span class="c1"># optimize the trie</span>
+ <span class="n">merge_when_no_leaf</span><span class="p">(</span><span class="n">bang_trie</span><span class="p">)</span>
+ <span class="n">optimize_leaf</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">bang_trie</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">bang_trie</span>
+
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
+ <span class="n">main</span><span class="p">()</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searxng_extra/update/update_locales.html b/_modules/searxng_extra/update/update_locales.html
new file mode 100644
index 000000000..78ff8fbb0
--- /dev/null
+++ b/_modules/searxng_extra/update/update_locales.html
@@ -0,0 +1,213 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra.update.update_locales &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searxng_extra.update.update_locales</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searxng_extra.update.update_locales</h1><div class="highlight"><pre>
+<span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="sd">&quot;&quot;&quot;Update locale names in :origin:`searx/data/locales.json` used by</span>
+<span class="sd">:ref:`searx.locales`</span>
+
+<span class="sd">- :py:obj:`searx.locales.RTL_LOCALES`</span>
+<span class="sd">- :py:obj:`searx.locales.LOCALE_NAMES`</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=invalid-name</span>
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Set</span>
+<span class="kn">import</span> <span class="nn">json</span>
+<span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
+
+<span class="kn">import</span> <span class="nn">babel</span>
+<span class="kn">import</span> <span class="nn">babel.languages</span>
+<span class="kn">import</span> <span class="nn">babel.core</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">searx_dir</span>
+<span class="kn">from</span> <span class="nn">searx.locales</span> <span class="kn">import</span> <span class="p">(</span>
+ <span class="n">ADDITIONAL_TRANSLATIONS</span><span class="p">,</span>
+ <span class="n">LOCALE_BEST_MATCH</span><span class="p">,</span>
+ <span class="n">get_translation_locales</span><span class="p">,</span>
+<span class="p">)</span>
+
+<span class="n">LOCALE_DATA_FILE</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">searx_dir</span><span class="p">)</span> <span class="o">/</span> <span class="s1">&#39;data&#39;</span> <span class="o">/</span> <span class="s1">&#39;locales.json&#39;</span>
+<span class="n">TRANSLATOINS_FOLDER</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">searx_dir</span><span class="p">)</span> <span class="o">/</span> <span class="s1">&#39;translations&#39;</span>
+
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+
+ <span class="n">LOCALE_NAMES</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">RTL_LOCALES</span><span class="p">:</span> <span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+
+ <span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">descr</span> <span class="ow">in</span> <span class="n">ADDITIONAL_TRANSLATIONS</span><span class="o">.</span><span class="n">items</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">LOCALE_BEST_MATCH</span><span class="p">[</span><span class="n">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">LOCALE_NAMES</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">descr</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">text_direction</span> <span class="o">==</span> <span class="s1">&#39;rtl&#39;</span><span class="p">:</span>
+ <span class="n">RTL_LOCALES</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">LOCALE_BEST_MATCH</span><span class="p">:</span>
+ <span class="n">descr</span> <span class="o">=</span> <span class="n">LOCALE_NAMES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">descr</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">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">LOCALE_NAMES</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_locale_descr</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">tag</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">text_direction</span> <span class="o">==</span> <span class="s1">&#39;rtl&#39;</span><span class="p">:</span>
+ <span class="n">RTL_LOCALES</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">tr_locale</span> <span class="ow">in</span> <span class="n">get_translation_locales</span><span class="p">():</span>
+ <span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">tr_locale</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span>
+ <span class="n">descr</span> <span class="o">=</span> <span class="n">LOCALE_NAMES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">descr</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">tr_locale</span><span class="p">)</span>
+ <span class="n">LOCALE_NAMES</span><span class="p">[</span><span class="n">sxng_tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_locale_descr</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">tr_locale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">text_direction</span> <span class="o">==</span> <span class="s1">&#39;rtl&#39;</span><span class="p">:</span>
+ <span class="n">RTL_LOCALES</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sxng_tag</span><span class="p">)</span>
+
+ <span class="n">content</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;LOCALE_NAMES&quot;</span><span class="p">:</span> <span class="n">LOCALE_NAMES</span><span class="p">,</span>
+ <span class="s2">&quot;RTL_LOCALES&quot;</span><span class="p">:</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">RTL_LOCALES</span><span class="p">),</span>
+ <span class="p">}</span>
+
+ <span class="k">with</span> <span class="n">LOCALE_DATA_FILE</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="get_locale_descr">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_locales.get_locale_descr">[docs]</a>
+<span class="k">def</span> <span class="nf">get_locale_descr</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="p">,</span> <span class="n">tr_locale</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get locale name e.g. &#39;Français - fr&#39; or &#39;Português (Brasil) - pt-BR&#39;</span>
+
+<span class="sd"> :param locale: instance of :py:class:`Locale`</span>
+<span class="sd"> :param tr_locale: name e.g. &#39;fr&#39; or &#39;pt_BR&#39; (delimiter is *underscore*)</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">native_language</span><span class="p">,</span> <span class="n">native_territory</span> <span class="o">=</span> <span class="n">_get_locale_descr</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">tr_locale</span><span class="p">)</span>
+ <span class="n">english_language</span><span class="p">,</span> <span class="n">english_territory</span> <span class="o">=</span> <span class="n">_get_locale_descr</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">native_territory</span> <span class="o">==</span> <span class="n">english_territory</span><span class="p">:</span>
+ <span class="n">english_territory</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">native_territory</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">english_territory</span><span class="p">:</span>
+ <span class="c1"># none territory name</span>
+ <span class="k">if</span> <span class="n">native_language</span> <span class="o">==</span> <span class="n">english_language</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">native_language</span>
+ <span class="k">return</span> <span class="n">native_language</span> <span class="o">+</span> <span class="s1">&#39; (&#39;</span> <span class="o">+</span> <span class="n">english_language</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span>
+
+ <span class="n">result</span> <span class="o">=</span> <span class="n">native_language</span> <span class="o">+</span> <span class="s1">&#39;, &#39;</span> <span class="o">+</span> <span class="n">native_territory</span> <span class="o">+</span> <span class="s1">&#39; (&#39;</span> <span class="o">+</span> <span class="n">english_language</span>
+ <span class="k">if</span> <span class="n">english_territory</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">result</span> <span class="o">+</span> <span class="s1">&#39;, &#39;</span> <span class="o">+</span> <span class="n">english_territory</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span>
+ <span class="k">return</span> <span class="n">result</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">_get_locale_descr</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="p">,</span> <span class="n">tr_locale</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</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">language_name</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">get_language_name</span><span class="p">(</span><span class="n">tr_locale</span><span class="p">)</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span> <span class="c1"># type: ignore</span>
+ <span class="k">if</span> <span class="n">language_name</span> <span class="ow">and</span> <span class="p">(</span><span class="s1">&#39;a&#39;</span> <span class="o">&lt;=</span> <span class="n">language_name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="s1">&#39;z&#39;</span><span class="p">):</span>
+ <span class="n">language_name</span> <span class="o">=</span> <span class="n">language_name</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
+ <span class="n">territory_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">get_territory_name</span><span class="p">(</span><span class="n">tr_locale</span><span class="p">)</span> <span class="c1"># type: ignore</span>
+ <span class="k">return</span> <span class="n">language_name</span><span class="p">,</span> <span class="n">territory_name</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="n">main</span><span class="p">()</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_modules/searxng_extra/update/update_pygments.html b/_modules/searxng_extra/update/update_pygments.html
new file mode 100644
index 000000000..6014c0ac3
--- /dev/null
+++ b/_modules/searxng_extra/update/update_pygments.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra.update.update_pygments &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">searxng_extra.update.update_pygments</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1>Source code for searxng_extra.update.update_pygments</h1><div class="highlight"><pre>
+<span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="sd">&quot;&quot;&quot;Update pygments style</span>
+
+<span class="sd">Call this script after each upgrade of pygments</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="c1"># pylint: disable=too-few-public-methods</span>
+
+<span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">import</span> <span class="nn">pygments</span>
+<span class="kn">from</span> <span class="nn">pygments.formatters.html</span> <span class="kn">import</span> <span class="n">HtmlFormatter</span>
+
+<span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">searx_dir</span>
+
+<span class="n">LESS_FILE</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">searx_dir</span><span class="p">)</span> <span class="o">/</span> <span class="s1">&#39;static/themes/simple/src/generated/pygments.less&#39;</span>
+
+<span class="n">HEADER</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>
+<span class="s2">/*</span>
+<span class="s2"> this file is generated automatically by searxng_extra/update/update_pygments.py</span>
+<span class="s2"> using pygments version </span><span class="si">{</span><span class="n">pygments</span><span class="o">.</span><span class="n">__version__</span><span class="si">}</span>
+<span class="s2">*/</span>
+
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="n">START_LIGHT_THEME</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">.code-highlight {</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="n">END_LIGHT_THEME</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">}</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="n">START_DARK_THEME</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">.code-highlight-dark(){</span>
+<span class="s2"> .code-highlight {</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+<span class="n">END_DARK_THEME</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
+<span class="s2"> }</span>
+<span class="s2">}</span>
+<span class="s2">&quot;&quot;&quot;</span>
+
+
+<div class="viewcode-block" id="Formatter">
+<a class="viewcode-back" href="../../../dev/searxng_extra/update.html#searxng_extra.update.update_pygments.Formatter">[docs]</a>
+<span class="k">class</span> <span class="nc">Formatter</span><span class="p">(</span><span class="n">HtmlFormatter</span><span class="p">):</span> <span class="c1"># pylint: disable=missing-class-docstring</span>
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">_pre_style</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;line-height: 100%;&#39;</span>
+
+ <span class="k">def</span> <span class="nf">get_style_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">style_lines</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">style_lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_linenos_style_defs</span><span class="p">())</span>
+ <span class="n">style_lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_background_style_defs</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
+ <span class="n">style_lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_token_style_defs</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">style_lines</span></div>
+
+
+
+<span class="k">def</span> <span class="nf">generat_css</span><span class="p">(</span><span class="n">light_style</span><span class="p">,</span> <span class="n">dark_style</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
+ <span class="n">css</span> <span class="o">=</span> <span class="n">HEADER</span> <span class="o">+</span> <span class="n">START_LIGHT_THEME</span>
+ <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">Formatter</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="n">light_style</span><span class="p">)</span><span class="o">.</span><span class="n">get_style_lines</span><span class="p">():</span>
+ <span class="n">css</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="n">line</span>
+ <span class="n">css</span> <span class="o">+=</span> <span class="n">END_LIGHT_THEME</span> <span class="o">+</span> <span class="n">START_DARK_THEME</span>
+ <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">Formatter</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="n">dark_style</span><span class="p">)</span><span class="o">.</span><span class="n">get_style_lines</span><span class="p">():</span>
+ <span class="n">css</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="n">line</span>
+ <span class="n">css</span> <span class="o">+=</span> <span class="n">END_DARK_THEME</span>
+ <span class="k">return</span> <span class="n">css</span>
+
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;update: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">LESS_FILE</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">LESS_FILE</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">generat_css</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span> <span class="s1">&#39;lightbulb&#39;</span><span class="p">))</span>
+</pre></div>
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Module code</a>
+
+
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/_sources/admin/answer-captcha.rst.txt b/_sources/admin/answer-captcha.rst.txt
new file mode 100644
index 000000000..7ae29be0c
--- /dev/null
+++ b/_sources/admin/answer-captcha.rst.txt
@@ -0,0 +1,69 @@
+===============================
+Answer CAPTCHA from server's IP
+===============================
+
+With a SSH tunnel we can send requests from server's IP and solve a CAPTCHA that
+blocks requests from this IP. If your SearXNG instance is hosted at
+``example.org`` and your login is ``user`` you can setup a proxy simply by
+:man:`ssh`:
+
+.. code:: bash
+
+ # SOCKS server: socks://127.0.0.1:8080
+
+ $ ssh -q -N -D 8080 user@example.org
+
+The ``socks://localhost:8080`` from above can be tested by:
+
+.. tabs::
+
+ .. group-tab:: server's IP
+
+ .. code:: bash
+
+ $ curl -x socks://127.0.0.1:8080 http://ipecho.net/plain
+ n.n.n.n
+
+ .. group-tab:: desktop's IP
+
+ .. code:: bash
+
+ $ curl http://ipecho.net/plain
+ x.x.x.x
+
+In the settings of the WEB browser open the *"Network Settings"* and setup a
+proxy on ``SOCKS5 127.0.0.1:8080`` (see screenshot below). In the WEB browser
+check the IP from the server is used:
+
+- http://ipecho.net/plain
+
+Now open the search engine that blocks requests from your server's IP. If you
+have `issues with the qwant engine
+<https://github.com/searxng/searxng/issues/2011#issuecomment-1553317619>`__,
+solve the CAPTCHA from `qwant.com <https://www.qwant.com/>`__.
+
+-----
+
+.. tabs::
+
+ .. group-tab:: Firefox
+
+ .. kernel-figure:: answer-captcha/ffox-setting-proxy-socks.png
+ :alt: FFox proxy on SOCKS5, 127.0.0.1:8080
+
+ Firefox's network settings
+
+
+.. admonition:: :man:`ssh` manual:
+
+ -D [bind_address:]port
+ Specifies a local “dynamic” application-level port forwarding. This works
+ by allocating a socket to listen to port on the local side .. Whenever a
+ connection is made to this port, the connection is forwarded over the
+ secure channel, and the application protocol is then used to determine
+ where to connect to from the remote machine .. ssh will act as a SOCKS
+ server ..
+
+ -N
+ Do not execute a remote command. This is useful for just forwarding ports.
+
diff --git a/_sources/admin/api.rst.txt b/_sources/admin/api.rst.txt
new file mode 100644
index 000000000..8f4552f9c
--- /dev/null
+++ b/_sources/admin/api.rst.txt
@@ -0,0 +1,92 @@
+.. _adminapi:
+
+==================
+Administration API
+==================
+
+Get configuration data
+======================
+
+.. code:: http
+
+ GET /config HTTP/1.1
+
+Sample response
+---------------
+
+.. code:: json
+
+ {
+ "autocomplete": "",
+ "categories": [
+ "map",
+ "it",
+ "images",
+ ],
+ "default_locale": "",
+ "default_theme": "simple",
+ "engines": [
+ {
+ "categories": [
+ "map"
+ ],
+ "enabled": true,
+ "name": "openstreetmap",
+ "shortcut": "osm"
+ },
+ {
+ "categories": [
+ "it"
+ ],
+ "enabled": true,
+ "name": "arch linux wiki",
+ "shortcut": "al"
+ },
+ {
+ "categories": [
+ "images"
+ ],
+ "enabled": true,
+ "name": "google images",
+ "shortcut": "goi"
+ },
+ {
+ "categories": [
+ "it"
+ ],
+ "enabled": false,
+ "name": "bitbucket",
+ "shortcut": "bb"
+ },
+ ],
+ "instance_name": "searx",
+ "locales": {
+ "de": "Deutsch (German)",
+ "en": "English",
+ "eo": "Esperanto (Esperanto)",
+ },
+ "plugins": [
+ {
+ "enabled": true,
+ "name": "HTTPS rewrite"
+ }
+ ],
+ "safe_search": 0
+ }
+
+
+Embed search bar
+================
+
+The search bar can be embedded into websites. Just paste the example into the
+HTML of the site. URL of the SearXNG instance and values are customizable.
+
+.. code:: html
+
+ <form method="post" action="https://example.org/">
+ <!-- search --> <input type="text" name="q" />
+ <!-- categories --> <input type="hidden" name="categories" value="general,social media" />
+ <!-- language --> <input type="hidden" name="lang" value="all" />
+ <!-- locale --> <input type="hidden" name="locale" value="en" />
+ <!-- date filter --> <input type="hidden" name="time_range" value="month" />
+ </form>
diff --git a/_sources/admin/architecture.rst.txt b/_sources/admin/architecture.rst.txt
new file mode 100644
index 000000000..d0d40715d
--- /dev/null
+++ b/_sources/admin/architecture.rst.txt
@@ -0,0 +1,38 @@
+.. _architecture:
+
+============
+Architecture
+============
+
+.. sidebar:: Further reading
+
+ - Reverse Proxy: :ref:`Apache <apache searxng site>` & :ref:`nginx <nginx
+ searxng site>`
+ - uWSGI: :ref:`searxng uwsgi`
+ - SearXNG: :ref:`installation basic`
+
+Herein you will find some hints and suggestions about typical architectures of
+SearXNG infrastructures.
+
+.. _architecture uWSGI:
+
+uWSGI Setup
+===========
+
+We start with a *reference* setup for public SearXNG instances which can be build
+up and maintained by the scripts from our :ref:`toolboxing`.
+
+.. _arch public:
+
+.. kernel-figure:: arch_public.dot
+ :alt: arch_public.dot
+
+ Reference architecture of a public SearXNG setup.
+
+The reference installation activates ``server.limiter``, ``server.image_proxy``
+and ``ui.static_use_hash`` (:origin:`/etc/searxng/settings.yml
+<utils/templates/etc/searxng/settings.yml>`)
+
+.. literalinclude:: ../../utils/templates/etc/searxng/settings.yml
+ :language: yaml
+ :end-before: # preferences:
diff --git a/_sources/admin/buildhosts.rst.txt b/_sources/admin/buildhosts.rst.txt
new file mode 100644
index 000000000..bdb9ae1d4
--- /dev/null
+++ b/_sources/admin/buildhosts.rst.txt
@@ -0,0 +1,163 @@
+.. _buildhosts:
+
+==========
+Buildhosts
+==========
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+To get best results from build, it's recommend to install additional packages on
+build hosts (see :ref:`searxng.sh`).
+
+.. _searxng.sh install buildhost:
+
+Build and Development tools
+===========================
+
+To Install tools used by build and development tasks in once:
+
+.. tabs::
+
+ .. group-tab:: SearXNG's development tools
+
+ .. code:: sh
+
+ $ sudo -H ./utils/searxng.sh install buildhost
+
+This will install packages needed by SearXNG:
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START distro-packages
+ :end-before: END distro-packages
+
+and packages needed to build documentation and run tests:
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START build-packages
+ :end-before: END build-packages
+
+.. _docs build:
+
+Build docs
+==========
+
+.. _Graphviz: https://graphviz.gitlab.io
+.. _ImageMagick: https://www.imagemagick.org
+.. _XeTeX: https://tug.org/xetex/
+.. _dvisvgm: https://dvisvgm.de/
+
+.. sidebar:: Sphinx build needs
+
+ - ImageMagick_
+ - Graphviz_
+ - XeTeX_
+ - dvisvgm_
+
+Most of the sphinx requirements are installed from :origin:`setup.py` and the
+docs can be build from scratch with ``make docs.html``. For better math and
+image processing additional packages are needed. The XeTeX_ needed not only for
+PDF creation, it's also needed for :ref:`math` when HTML output is build.
+
+To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
+as images (``sphinx.ext.imgmath`` extension).
+
+Here is the extract from the :origin:`docs/conf.py` file, setting math renderer
+to ``imgmath``:
+
+.. literalinclude:: ../conf.py
+ :language: python
+ :start-after: # sphinx.ext.imgmath setup
+ :end-before: # sphinx.ext.imgmath setup END
+
+If your docs build (``make docs.html``) shows warnings like this::
+
+ WARNING: dot(1) not found, for better output quality install \
+ graphviz from https://www.graphviz.org
+ ..
+ WARNING: LaTeX command 'latex' cannot be run (needed for math \
+ display), check the imgmath_latex setting
+
+you need to install additional packages on your build host, to get better HTML
+output (:ref:`install buildhost <searxng.sh install buildhost>`).
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code-block:: sh
+
+ $ sudo apt install graphviz imagemagick texlive-xetex librsvg2-bin
+
+ .. group-tab:: Arch Linux
+
+ .. code-block:: sh
+
+ $ sudo pacman -S graphviz imagemagick texlive-bin extra/librsvg
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code-block:: sh
+
+ $ sudo dnf install graphviz graphviz-gd ImageMagick texlive-xetex-bin librsvg2-tools
+
+
+For PDF output you also need:
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: sh
+
+ $ sudo apt texlive-latex-recommended texlive-extra-utils ttf-dejavu
+
+ .. group-tab:: Arch Linux
+
+ .. code:: sh
+
+ $ sudo pacman -S texlive-core texlive-latexextra ttf-dejavu
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code:: sh
+
+ $ sudo dnf install \
+ texlive-collection-fontsrecommended texlive-collection-latex \
+ dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts
+
+.. _sh lint:
+
+Lint shell scripts
+==================
+
+.. _ShellCheck: https://github.com/koalaman/shellcheck
+
+To lint shell scripts we use ShellCheck_ - a shell script static analysis tool
+(:ref:`install buildhost <searxng.sh install buildhost>`).
+
+.. SNIP sh lint requirements
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code-block:: sh
+
+ $ sudo apt install shellcheck
+
+ .. group-tab:: Arch Linux
+
+ .. code-block:: sh
+
+ $ sudo pacman -S shellcheck
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code-block:: sh
+
+ $ sudo dnf install ShellCheck
+
+.. SNAP sh lint requirements
diff --git a/_sources/admin/index.rst.txt b/_sources/admin/index.rst.txt
new file mode 100644
index 000000000..606b51c22
--- /dev/null
+++ b/_sources/admin/index.rst.txt
@@ -0,0 +1,22 @@
+===========================
+Administrator documentation
+===========================
+
+.. toctree::
+ :maxdepth: 2
+
+ settings/index
+ installation
+ installation-docker
+ installation-scripts
+ installation-searxng
+ installation-uwsgi
+ installation-nginx
+ installation-apache
+ update-searxng
+ answer-captcha
+ searx.limiter
+ api
+ architecture
+ plugins
+ buildhosts
diff --git a/_sources/admin/installation-apache.rst.txt b/_sources/admin/installation-apache.rst.txt
new file mode 100644
index 000000000..b0b580607
--- /dev/null
+++ b/_sources/admin/installation-apache.rst.txt
@@ -0,0 +1,388 @@
+.. _installation apache:
+
+======
+Apache
+======
+
+.. _Apache: https://httpd.apache.org/
+.. _Apache Debian:
+ https://cwiki.apache.org/confluence/display/HTTPD/DistrosDefaultLayout#DistrosDefaultLayout-Debian,Ubuntu(Apachehttpd2.x):
+.. _apache2.README.Debian:
+ https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian
+.. _Apache Arch Linux:
+ https://wiki.archlinux.org/index.php/Apache_HTTP_Server
+.. _Apache Fedora:
+ https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-apache-http-server/index.html
+.. _Apache directives:
+ https://httpd.apache.org/docs/trunk/mod/directives.html
+.. _Getting Started:
+ https://httpd.apache.org/docs/current/en/getting-started.html
+.. _Terms Used to Describe Directives:
+ https://httpd.apache.org/docs/current/en/mod/directive-dict.html
+.. _Configuration Files:
+ https://httpd.apache.org/docs/current/en/configuring.html
+.. _ProxyPreserveHost: https://httpd.apache.org/docs/trunk/mod/mod_proxy.html#proxypreservehost
+.. _LoadModule:
+ https://httpd.apache.org/docs/mod/mod_so.html#loadmodule
+.. _IncludeOptional:
+ https://httpd.apache.org/docs/mod/core.html#includeoptional
+.. _DocumentRoot:
+ https://httpd.apache.org/docs/trunk/mod/core.html#documentroot
+.. _Location:
+ https://httpd.apache.org/docs/trunk/mod/core.html#location
+.. _uWSGI Apache support:
+ https://uwsgi-docs.readthedocs.io/en/latest/Apache.html
+.. _mod_proxy_uwsgi:
+ https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi
+.. _mod_proxy_http:
+ https://httpd.apache.org/docs/current/mod/mod_proxy_http.html
+.. _mod_proxy:
+ https://httpd.apache.org/docs/current/mod/mod_proxy.html
+
+
+This section explains how to set up a SearXNG instance using the HTTP server Apache_.
+If you did use the :ref:`installation scripts` and do not have any special preferences
+you can install the :ref:`SearXNG site <apache searxng site>` using
+:ref:`searxng.sh <searxng.sh overview>`:
+
+.. code:: bash
+
+ $ sudo -H ./utils/searxng.sh install apache
+
+If you have special interests or problems with setting up Apache, the following
+section might give you some guidance.
+
+
+.. sidebar:: further read
+
+ - `Apache Arch Linux`_
+ - `Apache Debian`_
+ - `apache2.README.Debian`_
+ - `Apache Fedora`_
+ - `Apache directives`_
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+The Apache HTTP server
+======================
+
+If Apache_ is not installed, install it now. If apache_ is new to you, the
+`Getting Started`_, `Configuration Files`_ and `Terms Used to Describe
+Directives`_ documentation gives first orientation. There is also a list of
+`Apache directives`_ *to keep in the pocket*.
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: bash
+
+ sudo -H apt-get install apache2
+
+ .. group-tab:: Arch Linux
+
+ .. code:: bash
+
+ sudo -H pacman -S apache
+ sudo -H systemctl enable httpd
+ sudo -H systemctl start http
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code:: bash
+
+ sudo -H dnf install httpd
+ sudo -H systemctl enable httpd
+ sudo -H systemctl start httpd
+
+Now at http://localhost you should see some kind of *Welcome* or *Test* page.
+How this default site is configured, depends on the linux distribution
+(compare `Apache directives`_).
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: bash
+
+ less /etc/apache2/sites-enabled/000-default.conf
+
+ In this file, there is a line setting the `DocumentRoot`_ directive:
+
+ .. code:: apache
+
+ DocumentRoot /var/www/html
+
+ And the *welcome* page is the HTML file at ``/var/www/html/index.html``.
+
+ .. group-tab:: Arch Linux
+
+ .. code:: bash
+
+ less /etc/httpd/conf/httpd.conf
+
+ In this file, there is a line setting the `DocumentRoot`_ directive:
+
+ .. code:: apache
+
+ DocumentRoot "/srv/http"
+ <Directory "/srv/http">
+ Options Indexes FollowSymLinks
+ AllowOverride None
+ Require all granted
+ </Directory>
+
+ The *welcome* page of Arch Linux is a page showing the directory located
+ at ``DocumentRoot``. This *directory* page is generated by the Module
+ `mod_autoindex <https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html>`_:
+
+ .. code:: apache
+
+ LoadModule autoindex_module modules/mod_autoindex.so
+ ...
+ Include conf/extra/httpd-autoindex.conf
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code:: bash
+
+ less /etc/httpd/conf/httpd.conf
+
+ In this file, there is a line setting the ``DocumentRoot`` directive:
+
+ .. code:: apache
+
+ DocumentRoot "/var/www/html"
+ ...
+ <Directory "/var/www">
+ AllowOverride None
+ # Allow open access:
+ Require all granted
+ </Directory>
+
+ On fresh installations, the ``/var/www`` is empty and the *default
+ welcome page* is shown, the configuration is located at::
+
+ less /etc/httpd/conf.d/welcome.conf
+
+
+.. _Debian's Apache layout:
+
+Debian's Apache layout
+----------------------
+
+Be aware, Debian's Apache layout is quite different from the standard Apache
+configuration. For details look at the apache2.README.Debian_
+(``/usr/share/doc/apache2/README.Debian.gz``). Some commands you should know on
+Debian:
+
+* :man:`apache2ctl`: Apache HTTP server control interface
+* :man:`a2enmod`, :man:`a2dismod`: switch on/off modules
+* :man:`a2enconf`, :man:`a2disconf`: switch on/off configurations
+* :man:`a2ensite`, :man:`a2dissite`: switch on/off sites
+
+.. _apache modules:
+
+Apache modules
+--------------
+
+To load additional modules, in most distributions you have to uncomment the
+lines with the corresponding LoadModule_ directive, except in :ref:`Debian's
+Apache layout`.
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ :ref:`Debian's Apache layout` uses :man:`a2enmod` and :man:`a2dismod` to
+ activate or disable modules:
+
+ .. code:: bash
+
+ sudo -H a2enmod ssl
+ sudo -H a2enmod headers
+ sudo -H a2enmod proxy
+ sudo -H a2enmod proxy_http
+ sudo -H a2enmod proxy_uwsgi
+
+ .. group-tab:: Arch Linux
+
+ In the ``/etc/httpd/conf/httpd.conf`` file, activate LoadModule_
+ directives:
+
+ .. code:: apache
+
+ LoadModule ssl_module modules/mod_ssl.so
+ LoadModule headers_module modules/mod_headers.so
+ LoadModule proxy_module modules/mod_proxy.so
+ LoadModule proxy_http_module modules/mod_proxy_http.so
+ LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
+
+ .. group-tab:: Fedora / RHEL
+
+ In the ``/etc/httpd/conf/httpd.conf`` file, activate LoadModule_
+ directives:
+
+ .. code:: apache
+
+ LoadModule ssl_module modules/mod_ssl.so
+ LoadModule headers_module modules/mod_headers.so
+ LoadModule proxy_module modules/mod_proxy.so
+ LoadModule proxy_http_module modules/mod_proxy_http.so
+ LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
+
+
+.. _apache sites:
+
+Apache sites
+------------
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ In :ref:`Debian's Apache layout` you create a ``searxng.conf`` with the
+ ``<Location /searxng >`` directive and save this file in the *sites
+ available* folder at ``/etc/apache2/sites-available``. To enable the
+ ``searxng.conf`` use :man:`a2ensite`:
+
+ .. code:: bash
+
+ sudo -H a2ensite searxng.conf
+
+ .. group-tab:: Arch Linux
+
+ In the ``/etc/httpd/conf/httpd.conf`` file add a IncludeOptional_
+ directive:
+
+ .. code:: apache
+
+ IncludeOptional sites-enabled/*.conf
+
+ Create two folders, one for the *available sites* and one for the *enabled sites*:
+
+ .. code:: bash
+
+ mkdir -p /etc/httpd/sites-available
+ mkdir -p /etc/httpd/sites-enabled
+
+ Create configuration at ``/etc/httpd/sites-available`` and place a
+ symlink to ``sites-enabled``:
+
+ .. code:: bash
+
+ sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
+ /etc/httpd/sites-enabled/searxng.conf
+
+ .. group-tab:: Fedora / RHEL
+
+ In the ``/etc/httpd/conf/httpd.conf`` file add a IncludeOptional_
+ directive:
+
+ .. code:: apache
+
+ IncludeOptional sites-enabled/*.conf
+
+ Create two folders, one for the *available sites* and one for the *enabled sites*:
+
+ .. code:: bash
+
+ mkdir -p /etc/httpd/sites-available
+ mkdir -p /etc/httpd/sites-enabled
+
+ Create configuration at ``/etc/httpd/sites-available`` and place a
+ symlink to ``sites-enabled``:
+
+ .. code:: bash
+
+ sudo -H ln -s /etc/httpd/sites-available/searxng.conf \
+ /etc/httpd/sites-enabled/searxng.conf
+
+
+.. _apache searxng site:
+
+Apache's SearXNG site
+=====================
+
+.. _mod_uwsgi: https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-uwsgi
+
+.. sidebar:: uWSGI
+
+ Use mod_proxy_uwsgi_ / don't use the old mod_uwsgi_ anymore.
+
+To proxy the incoming requests to the SearXNG instance Apache needs the
+mod_proxy_ module (:ref:`apache modules`).
+
+.. sidebar:: HTTP headers
+
+ With ProxyPreserveHost_ the incoming ``Host`` header is passed to the proxied
+ host.
+
+Depending on what your SearXNG installation is listening on, you need a http
+mod_proxy_http_) or socket (mod_proxy_uwsgi_) communication to upstream.
+
+The :ref:`installation scripts` installs the :ref:`reference setup
+<use_default_settings.yml>` and a :ref:`uwsgi setup` that listens on a socket by default.
+You can install and activate your own ``searxng.conf`` like shown in
+:ref:`apache sites`.
+
+.. tabs::
+
+ .. group-tab:: socket
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START apache socket
+ :end-before: END apache socket
+
+ .. group-tab:: http
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START apache http
+ :end-before: END apache http
+
+.. _restart apache:
+
+Restart service:
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: bash
+
+ sudo -H systemctl restart apache2
+ sudo -H service uwsgi restart searxng
+
+ .. group-tab:: Arch Linux
+
+ .. code:: bash
+
+ sudo -H systemctl restart httpd
+ sudo -H systemctl restart uwsgi@searxng
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code:: bash
+
+ sudo -H systemctl restart httpd
+ sudo -H touch /etc/uwsgi.d/searxng.ini
+
+
+disable logs
+============
+
+For better privacy you can disable Apache logs. In the examples above activate
+one of the lines and `restart apache`_:
+
+.. code:: apache
+
+ SetEnvIf Request_URI "/searxng" dontlog
+ # CustomLog /dev/null combined env=dontlog
+
+The ``CustomLog`` directive disables logs for the entire (virtual) server, use it
+when the URL of the service does not have a path component (``/searxng``), so when
+SearXNG is located at root (``/``).
diff --git a/_sources/admin/installation-docker.rst.txt b/_sources/admin/installation-docker.rst.txt
new file mode 100644
index 000000000..09471891b
--- /dev/null
+++ b/_sources/admin/installation-docker.rst.txt
@@ -0,0 +1,197 @@
+.. _installation docker:
+
+================
+Docker Container
+================
+
+.. _ENTRYPOINT: https://docs.docker.com/engine/reference/builder/#entrypoint
+.. _searxng/searxng @dockerhub: https://hub.docker.com/r/searxng/searxng
+.. _searxng-docker: https://github.com/searxng/searxng-docker
+.. _[caddy]: https://hub.docker.com/_/caddy
+.. _Redis: https://redis.io/
+
+----
+
+.. sidebar:: info
+
+ - `searxng/searxng @dockerhub`_
+ - :origin:`Dockerfile`
+ - `Docker overview <https://docs.docker.com/get-started/overview>`_
+ - `Docker Cheat Sheet <https://docs.docker.com/get-started/docker_cheatsheet.pdf>`_
+ - `Alpine Linux <https://alpinelinux.org>`_
+ `(wiki) <https://en.wikipedia.org/wiki/Alpine_Linux>`__
+ `apt packages <https://pkgs.alpinelinux.org/packages>`_
+ - Alpine's ``/bin/sh`` is :man:`dash`
+
+**If you intend to create a public instance using Docker, use our well maintained
+docker container**
+
+- `searxng/searxng @dockerhub`_.
+
+.. sidebar:: hint
+
+ The rest of this article is of interest only to those who want to create and
+ maintain their own Docker images.
+
+The sources are hosted at searxng-docker_ and the container includes:
+
+- a HTTPS reverse proxy `[caddy]`_ and
+- a Redis_ DB
+
+The `default SearXNG setup <https://github.com/searxng/searxng-docker/blob/master/searxng/settings.yml>`_
+of this container:
+
+- enables :ref:`limiter <limiter>` to protect against bots
+- enables :ref:`image proxy <image_proxy>` for better privacy
+- enables :ref:`cache busting <static_use_hash>` to save bandwidth
+
+----
+
+
+Get Docker
+==========
+
+If you plan to build and maintain a docker image by yourself, make sure you have
+`Docker installed <https://docs.docker.com/get-docker/>`_. On Linux don't
+forget to add your user to the docker group (log out and log back in so that
+your group membership is re-evaluated):
+
+.. code:: sh
+
+ $ sudo usermod -a -G docker $USER
+
+
+searxng/searxng
+===============
+
+.. sidebar:: ``docker run``
+
+ - `-\-rm <https://docs.docker.com/engine/reference/run/#clean-up---rm>`__
+ automatically clean up when container exits
+ - `-d <https://docs.docker.com/engine/reference/run/#detached--d>`__ start
+ detached container
+ - `-v <https://docs.docker.com/engine/reference/run/#volume-shared-filesystems>`__
+ mount volume ``HOST:CONTAINER``
+
+The docker image is based on :origin:`Dockerfile` and available from
+`searxng/searxng @dockerhub`_. Using the docker image is quite easy, for
+instance you can pull the `searxng/searxng @dockerhub`_ image and deploy a local
+instance using `docker run <https://docs.docker.com/engine/reference/run/>`_:
+
+.. code:: sh
+
+ $ mkdir my-instance
+ $ cd my-instance
+ $ export PORT=8080
+ $ docker pull searxng/searxng
+ $ docker run --rm \
+ -d -p ${PORT}:8080 \
+ -v "${PWD}/searxng:/etc/searxng" \
+ -e "BASE_URL=http://localhost:$PORT/" \
+ -e "INSTANCE_NAME=my-instance" \
+ searxng/searxng
+ 2f998.... # container's ID
+
+The environment variables UWSGI_WORKERS and UWSGI_THREADS overwrite the default
+number of UWSGI processes and UWSGI threads specified in `/etc/searxng/uwsgi.ini`.
+
+Open your WEB browser and visit the URL:
+
+.. code:: sh
+
+ $ xdg-open "http://localhost:$PORT"
+
+Inside ``${PWD}/searxng``, you will find ``settings.yml`` and ``uwsgi.ini``. You
+can modify these files according to your needs and restart the Docker image.
+
+.. code:: sh
+
+ $ docker container restart 2f998
+
+Use command ``container ls`` to list running containers, add flag `-a
+<https://docs.docker.com/engine/reference/commandline/container_ls>`__ to list
+exited containers also. With ``container stop`` a running container can be
+stopped. To get rid of a container use ``container rm``:
+
+.. code:: sh
+
+ $ docker container ls
+ CONTAINER ID IMAGE COMMAND CREATED ...
+ 2f998d725993 searxng/searxng "/sbin/tini -- /usr/…" 7 minutes ago ...
+
+ $ docker container stop 2f998
+ $ docker container rm 2f998
+
+.. sidebar:: Warning
+
+ This might remove all docker items, not only those from SearXNG.
+
+If you won't use docker anymore and want to get rid of all containers & images
+use the following *prune* command:
+
+.. code:: sh
+
+ $ docker stop $(docker ps -aq) # stop all containers
+ $ docker system prune # make some housekeeping
+ $ docker rmi -f $(docker images -q) # drop all images
+
+
+shell inside container
+----------------------
+
+.. sidebar:: Bashism
+
+ - `A tale of two shells: bash or dash <https://lwn.net/Articles/343924/>`_
+ - `How to make bash scripts work in dash <http://mywiki.wooledge.org/Bashism>`_
+ - `Checking for Bashisms <https://dev.to/bowmanjd/writing-bash-scripts-that-are-not-only-bash-checking-for-bashisms-and-testing-with-dash-1bli>`_
+
+Like in many other distributions, Alpine's `/bin/sh
+<https://wiki.ubuntu.com/DashAsBinSh>`__ is :man:`dash`. Dash is meant to be
+`POSIX-compliant <https://pubs.opengroup.org/onlinepubs/9699919799>`__.
+Compared to debian, in the Alpine image :man:`bash` is not installed. The
+:origin:`dockerfiles/docker-entrypoint.sh` script is checked *against dash*
+(``make tests.shell``).
+
+To open a shell inside the container:
+
+.. code:: sh
+
+ $ docker exec -it 2f998 sh
+
+
+Build the image
+===============
+
+It's also possible to build SearXNG from the embedded :origin:`Dockerfile`::
+
+ $ git clone https://github.com/searxng/searxng.git
+ $ cd searxng
+ $ make docker.build
+ ...
+ Successfully built 49586c016434
+ Successfully tagged searxng/searxng:latest
+ Successfully tagged searxng/searxng:1.0.0-209-9c823800-dirty
+
+ $ docker images
+ REPOSITORY TAG IMAGE ID CREATED SIZE
+ searxng/searxng 1.0.0-209-9c823800-dirty 49586c016434 13 minutes ago 308MB
+ searxng/searxng latest 49586c016434 13 minutes ago 308MB
+ alpine 3.13 6dbb9cc54074 3 weeks ago 5.61MB
+
+
+Command line
+============
+
+.. sidebar:: docker run
+
+ Use flags ``-it`` for `interactive processes
+ <https://docs.docker.com/engine/reference/run/#foreground>`__.
+
+In the :origin:`Dockerfile` the ENTRYPOINT_ is defined as
+:origin:`dockerfiles/docker-entrypoint.sh`
+
+.. code:: sh
+
+ docker run --rm -it searxng/searxng -h
+
+.. program-output:: ../dockerfiles/docker-entrypoint.sh -h
diff --git a/_sources/admin/installation-nginx.rst.txt b/_sources/admin/installation-nginx.rst.txt
new file mode 100644
index 000000000..f95354b53
--- /dev/null
+++ b/_sources/admin/installation-nginx.rst.txt
@@ -0,0 +1,252 @@
+.. _installation nginx:
+
+=====
+NGINX
+=====
+
+.. _nginx:
+ https://docs.nginx.com/nginx/admin-guide/
+.. _nginx server configuration:
+ https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers
+.. _nginx beginners guide:
+ https://nginx.org/en/docs/beginners_guide.html
+.. _Getting Started wiki:
+ https://www.nginx.com/resources/wiki/start/
+.. _uWSGI support from nginx:
+ https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html
+.. _uwsgi_params:
+ https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#configuring-nginx
+.. _SCRIPT_NAME:
+ https://werkzeug.palletsprojects.com/en/1.0.x/wsgi/#werkzeug.wsgi.get_script_name
+
+This section explains how to set up a SearXNG instance using the HTTP server nginx_.
+If you have used the :ref:`installation scripts` and do not have any special preferences
+you can install the :ref:`SearXNG site <nginx searxng site>` using
+:ref:`searxng.sh <searxng.sh overview>`:
+
+.. code:: bash
+
+ $ sudo -H ./utils/searxng.sh install nginx
+
+If you have special interests or problems with setting up nginx, the following
+section might give you some guidance.
+
+
+.. sidebar:: further reading
+
+ - nginx_
+ - `nginx beginners guide`_
+ - `nginx server configuration`_
+ - `Getting Started wiki`_
+ - `uWSGI support from nginx`_
+
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+The nginx HTTP server
+=====================
+
+If nginx_ is not installed, install it now.
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: bash
+
+ sudo -H apt-get install nginx
+
+ .. group-tab:: Arch Linux
+
+ .. code-block:: sh
+
+ sudo -H pacman -S nginx-mainline
+ sudo -H systemctl enable nginx
+ sudo -H systemctl start nginx
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code-block:: sh
+
+ sudo -H dnf install nginx
+ sudo -H systemctl enable nginx
+ sudo -H systemctl start nginx
+
+Now at http://localhost you should see a *Welcome to nginx!* page, on Fedora you
+see a *Fedora Webserver - Test Page*. The test page comes from the default
+`nginx server configuration`_. How this default site is configured,
+depends on the linux distribution:
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: bash
+
+ less /etc/nginx/nginx.conf
+
+ There is one line that includes site configurations from:
+
+ .. code:: nginx
+
+ include /etc/nginx/sites-enabled/*;
+
+ .. group-tab:: Arch Linux
+
+ .. code-block:: sh
+
+ less /etc/nginx/nginx.conf
+
+ There is a configuration section named ``server``:
+
+ .. code-block:: nginx
+
+ server {
+ listen 80;
+ server_name localhost;
+ # ...
+ }
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code-block:: sh
+
+ less /etc/nginx/nginx.conf
+
+ There is one line that includes site configurations from:
+
+ .. code:: nginx
+
+ include /etc/nginx/conf.d/*.conf;
+
+
+.. _nginx searxng site:
+
+NGINX's SearXNG site
+====================
+
+Now you have to create a configuration file (``searxng.conf``) for the SearXNG
+site. If nginx_ is new to you, the `nginx beginners guide`_ is a good starting
+point and the `Getting Started wiki`_ is always a good resource *to keep in the
+pocket*.
+
+Depending on what your SearXNG installation is listening on, you need a http or socket
+communication to upstream.
+
+.. tabs::
+
+ .. group-tab:: socket
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START nginx socket
+ :end-before: END nginx socket
+
+ .. group-tab:: http
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START nginx http
+ :end-before: END nginx http
+
+The :ref:`installation scripts` installs the :ref:`reference setup
+<use_default_settings.yml>` and a :ref:`uwsgi setup` that listens on a socket by default.
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ Create configuration at ``/etc/nginx/sites-available/`` and place a
+ symlink to ``sites-enabled``:
+
+ .. code:: bash
+
+ sudo -H ln -s /etc/nginx/sites-available/searxng.conf \
+ /etc/nginx/sites-enabled/searxng.conf
+
+ .. group-tab:: Arch Linux
+
+ In the ``/etc/nginx/nginx.conf`` file, in the ``server`` section add a
+ `include <https://nginx.org/en/docs/ngx_core_module.html#include>`_
+ directive:
+
+ .. code:: nginx
+
+ server {
+ # ...
+ include /etc/nginx/default.d/*.conf;
+ # ...
+ }
+
+ Create two folders, one for the *available sites* and one for the *enabled sites*:
+
+ .. code:: bash
+
+ mkdir -p /etc/nginx/default.d
+ mkdir -p /etc/nginx/default.apps-available
+
+ Create configuration at ``/etc/nginx/default.apps-available`` and place a
+ symlink to ``default.d``:
+
+ .. code:: bash
+
+ sudo -H ln -s /etc/nginx/default.apps-available/searxng.conf \
+ /etc/nginx/default.d/searxng.conf
+
+ .. group-tab:: Fedora / RHEL
+
+ Create a folder for the *available sites*:
+
+ .. code:: bash
+
+ mkdir -p /etc/nginx/default.apps-available
+
+ Create configuration at ``/etc/nginx/default.apps-available`` and place a
+ symlink to ``conf.d``:
+
+ .. code:: bash
+
+ sudo -H ln -s /etc/nginx/default.apps-available/searxng.conf \
+ /etc/nginx/conf.d/searxng.conf
+
+Restart services:
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: bash
+
+ sudo -H systemctl restart nginx
+ sudo -H service uwsgi restart searxng
+
+ .. group-tab:: Arch Linux
+
+ .. code:: bash
+
+ sudo -H systemctl restart nginx
+ sudo -H systemctl restart uwsgi@searxng
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code:: bash
+
+ sudo -H systemctl restart nginx
+ sudo -H touch /etc/uwsgi.d/searxng.ini
+
+
+Disable logs
+============
+
+For better privacy you can disable nginx logs in ``/etc/nginx/nginx.conf``.
+
+.. code:: nginx
+
+ http {
+ # ...
+ access_log /dev/null;
+ error_log /dev/null;
+ # ...
+ }
diff --git a/_sources/admin/installation-scripts.rst.txt b/_sources/admin/installation-scripts.rst.txt
new file mode 100644
index 000000000..2d43f5e37
--- /dev/null
+++ b/_sources/admin/installation-scripts.rst.txt
@@ -0,0 +1,62 @@
+.. _installation scripts:
+
+===================
+Installation Script
+===================
+
+.. sidebar:: Update the OS first!
+
+ To avoid unwanted side effects, update your OS before installing SearXNG.
+
+The following will install a setup as shown in :ref:`the reference architecture
+<arch public>`. First you need to get a clone of the repository. The clone is only needed for
+the installation procedure and some maintenance tasks.
+
+.. sidebar:: further read
+
+ - :ref:`toolboxing`
+
+Jump to a folder that is readable by *others* and start to clone SearXNG,
+alternatively you can create your own fork and clone from there.
+
+.. code:: bash
+
+ $ cd ~/Downloads
+ $ git clone https://github.com/searxng/searxng.git searxng
+ $ cd searxng
+
+.. sidebar:: further read
+
+ - :ref:`inspect searxng`
+
+To install a SearXNG :ref:`reference setup <use_default_settings.yml>`
+including a :ref:`uWSGI setup <architecture uWSGI>` as described in the
+:ref:`installation basic` and in the :ref:`searxng uwsgi` section type:
+
+.. code:: bash
+
+ $ sudo -H ./utils/searxng.sh install all
+
+.. attention::
+
+ For the installation procedure, use a *sudoer* login to run the scripts. If
+ you install from ``root``, take into account that the scripts are creating a
+ ``searxng`` user. In the installation procedure this new created user does
+ need to have read access to the cloned SearXNG repository, which is not the case if you clone
+ it into a folder below ``/root``!
+
+.. sidebar:: further read
+
+ - :ref:`update searxng`
+
+.. _caddy: https://hub.docker.com/_/caddy
+
+When all services are installed and running fine, you can add SearXNG to your
+HTTP server. We do not have any preferences regarding the HTTP server, you can use
+whatever you prefer.
+
+We use caddy in our :ref:`docker image <installation docker>` and we have
+implemented installation procedures for:
+
+- :ref:`installation nginx`
+- :ref:`installation apache`
diff --git a/_sources/admin/installation-searxng.rst.txt b/_sources/admin/installation-searxng.rst.txt
new file mode 100644
index 000000000..7bb936f15
--- /dev/null
+++ b/_sources/admin/installation-searxng.rst.txt
@@ -0,0 +1,132 @@
+.. _installation basic:
+
+=========================
+Step by step installation
+=========================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+In this section we show the setup of a SearXNG instance that will be installed
+by the :ref:`installation scripts`.
+
+.. _install packages:
+
+Install packages
+================
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START distro-packages
+ :end-before: END distro-packages
+
+.. hint::
+
+ This installs also the packages needed by :ref:`searxng uwsgi`
+
+.. _create searxng user:
+
+Create user
+===========
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START create user
+ :end-before: END create user
+
+.. _searxng-src:
+
+Install SearXNG & dependencies
+==============================
+
+Start a interactive shell from new created user and clone SearXNG:
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START clone searxng
+ :end-before: END clone searxng
+
+In the same shell create *virtualenv*:
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START create virtualenv
+ :end-before: END create virtualenv
+
+To install SearXNG's dependencies, exit the SearXNG *bash* session you opened above
+and start a new one. Before installing, check if your *virtualenv* was sourced
+from the login (*~/.profile*):
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START manage.sh update_packages
+ :end-before: END manage.sh update_packages
+
+.. tip::
+
+ Open a second terminal for the configuration tasks and leave the ``(searx)$``
+ terminal open for the tasks below.
+
+
+.. _use_default_settings.yml:
+
+Configuration
+=============
+
+.. sidebar:: ``use_default_settings: True``
+
+ - :ref:`settings.yml`
+ - :ref:`settings location`
+ - :ref:`settings use_default_settings`
+ - :origin:`/etc/searxng/settings.yml <utils/templates/etc/searxng/settings.yml>`
+
+To create a initial ``/etc/searxng/settings.yml`` we recommend to start with a
+copy of the file :origin:`utils/templates/etc/searxng/settings.yml`. This setup
+:ref:`use default settings <settings use_default_settings>` from
+:origin:`searx/settings.yml` and is shown in the tab *"Use default settings"*
+below. This setup:
+
+- enables :ref:`limiter <limiter>` to protect against bots
+- enables :ref:`image proxy <image_proxy>` for better privacy
+- enables :ref:`cache busting <static_use_hash>` to save bandwidth
+
+Modify the ``/etc/searxng/settings.yml`` to your needs:
+
+.. tabs::
+
+ .. group-tab:: Use default settings
+
+ .. literalinclude:: ../../utils/templates/etc/searxng/settings.yml
+ :language: yaml
+ :end-before: # hostname_replace:
+
+ To see the entire file jump to :origin:`utils/templates/etc/searxng/settings.yml`
+
+ .. group-tab:: searx/settings.yml
+
+ .. literalinclude:: ../../searx/settings.yml
+ :language: yaml
+ :end-before: # hostname_replace:
+
+ To see the entire file jump to :origin:`searx/settings.yml`
+
+For a *minimal setup* you need to set ``server:secret_key``.
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START searxng config
+ :end-before: END searxng config
+
+
+Check
+=====
+
+To check your SearXNG setup, optional enable debugging and start the *webapp*.
+SearXNG looks at the exported environment ``$SEARXNG_SETTINGS_PATH`` for a
+configuration file.
+
+.. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START check searxng installation
+ :end-before: END check searxng installation
+
+If everything works fine, hit ``[CTRL-C]`` to stop the *webapp* and disable the
+debug option in ``settings.yml``. You can now exit SearXNG user bash session (enter exit
+command twice). At this point SearXNG is not demonized; uwsgi allows this.
+
diff --git a/_sources/admin/installation-uwsgi.rst.txt b/_sources/admin/installation-uwsgi.rst.txt
new file mode 100644
index 000000000..78da22f45
--- /dev/null
+++ b/_sources/admin/installation-uwsgi.rst.txt
@@ -0,0 +1,268 @@
+.. _searxng uwsgi:
+
+=====
+uWSGI
+=====
+
+.. sidebar:: further reading
+
+ - `systemd.unit`_
+ - `uWSGI Emperor`_
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _systemd.unit: https://www.freedesktop.org/software/systemd/man/systemd.unit.html
+.. _One service per app in systemd:
+ https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd
+.. _uWSGI Emperor:
+ https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html
+.. _uwsgi ini file:
+ https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files
+.. _systemd unit template:
+ http://0pointer.de/blog/projects/instances.html
+
+
+Origin uWSGI
+============
+
+.. _Tyrant mode:
+ https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting
+
+How uWSGI is implemented by distributors varies. The uWSGI project itself
+recommends two methods:
+
+1. `systemd.unit`_ template file as described here `One service per app in systemd`_:
+
+ There is one `systemd unit template`_ on the system installed and one `uwsgi
+ ini file`_ per uWSGI-app placed at dedicated locations. Take archlinux and a
+ ``searxng.ini`` as example::
+
+ systemd template unit: /usr/lib/systemd/system/uwsgi@.service
+ contains: [Service]
+ ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/%I.ini
+
+ SearXNG application: /etc/uwsgi/searxng.ini
+ links to: /etc/uwsgi/apps-available/searxng.ini
+
+ The SearXNG app (template ``/etc/uwsgi/%I.ini``) can be maintained as known
+ from common systemd units:
+
+ .. code:: sh
+
+ $ systemctl enable uwsgi@searxng
+ $ systemctl start uwsgi@searxng
+ $ systemctl restart uwsgi@searxng
+ $ systemctl stop uwsgi@searxng
+
+2. The `uWSGI Emperor`_ which fits for maintaining a large range of uwsgi
+ apps and there is a `Tyrant mode`_ to secure multi-user hosting.
+
+ The Emperor mode is a special uWSGI instance that will monitor specific
+ events. The Emperor mode (the service) is started by a (common, not template)
+ systemd unit.
+
+ The Emperor service will scan specific directories for `uwsgi ini file`_\s
+ (also know as *vassals*). If a *vassal* is added, removed or the timestamp is
+ modified, a corresponding action takes place: a new uWSGI instance is started,
+ reload or stopped. Take Fedora and a ``searxng.ini`` as example::
+
+ to install & start SearXNG instance create --> /etc/uwsgi.d/searxng.ini
+ to reload the instance edit timestamp --> touch /etc/uwsgi.d/searxng.ini
+ to stop instance remove ini --> rm /etc/uwsgi.d/searxng.ini
+
+
+Distributors
+============
+
+The `uWSGI Emperor`_ mode and `systemd unit template`_ is what the distributors
+mostly offer their users, even if they differ in the way they implement both
+modes and their defaults. Another point they might differ in is the packaging of
+plugins (if so, compare :ref:`install packages`) and what the default python
+interpreter is (python2 vs. python3).
+
+While archlinux does not start a uWSGI service by default, Fedora (RHEL) starts
+a Emperor in `Tyrant mode`_ by default (you should have read :ref:`uWSGI Tyrant
+mode pitfalls`). Worth to know; debian (ubuntu) follow a complete different
+approach, read see :ref:`Debian's uWSGI layout`.
+
+.. _Debian's uWSGI layout:
+
+Debian's uWSGI layout
+---------------------
+
+.. _uwsgi.README.Debian:
+ https://salsa.debian.org/uwsgi-team/uwsgi/-/raw/debian/latest/debian/uwsgi.README.Debian
+
+Be aware, Debian's uWSGI layout is quite different from the standard uWSGI
+configuration. Your are familiar with :ref:`Debian's Apache layout`? .. they do a
+similar thing for the uWSGI infrastructure. The folders are::
+
+ /etc/uwsgi/apps-available/
+ /etc/uwsgi/apps-enabled/
+
+The `uwsgi ini file`_ is enabled by a symbolic link::
+
+ ln -s /etc/uwsgi/apps-available/searxng.ini /etc/uwsgi/apps-enabled/
+
+More details can be found in the uwsgi.README.Debian_
+(``/usr/share/doc/uwsgi/README.Debian.gz``). Some commands you should know on
+Debian:
+
+.. code:: none
+
+ Commands recognized by init.d script
+ ====================================
+
+ You can issue to init.d script following commands:
+ * start | starts daemon
+ * stop | stops daemon
+ * reload | sends to daemon SIGHUP signal
+ * force-reload | sends to daemon SIGTERM signal
+ * restart | issues 'stop', then 'start' commands
+ * status | shows status of daemon instance (running/not running)
+
+ 'status' command must be issued with exactly one argument: '<confname>'.
+
+ Controlling specific instances of uWSGI
+ =======================================
+
+ You could control specific instance(s) by issuing:
+
+ SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi <command> <confname> <confname>...
+
+ where:
+ * <command> is one of 'start', 'stop' etc.
+ * <confname> is the name of configuration file (without extension)
+
+ For example, this is how instance for /etc/uwsgi/apps-enabled/hello.xml is
+ started:
+
+ SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi start hello
+
+
+.. _uWSGI maintenance:
+
+uWSGI maintenance
+=================
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START searxng uwsgi-description ubuntu-20.04
+ :end-before: END searxng uwsgi-description ubuntu-20.04
+
+ .. hotfix: a bug group-tab need this comment
+
+ .. group-tab:: Arch Linux
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START searxng uwsgi-description arch
+ :end-before: END searxng uwsgi-description arch
+
+ .. hotfix: a bug group-tab need this comment
+
+ .. group-tab:: Fedora / RHEL
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START searxng uwsgi-description fedora
+ :end-before: END searxng uwsgi-description fedora
+
+
+.. _uwsgi setup:
+
+uWSGI setup
+===========
+
+Create the configuration ini-file according to your distribution and restart the
+uwsgi application. As shown below, the :ref:`installation scripts` installs by
+default:
+
+- a uWSGI setup that listens on a socket and
+- enables :ref:`cache busting <static_use_hash>`.
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START searxng uwsgi-appini ubuntu-20.04
+ :end-before: END searxng uwsgi-appini ubuntu-20.04
+
+ .. hotfix: a bug group-tab need this comment
+
+ .. group-tab:: Arch Linux
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START searxng uwsgi-appini arch
+ :end-before: END searxng uwsgi-appini arch
+
+ .. hotfix: a bug group-tab need this comment
+
+ .. group-tab:: Fedora / RHEL
+
+ .. kernel-include:: $DOCS_BUILD/includes/searxng.rst
+ :start-after: START searxng uwsgi-appini fedora
+ :end-before: END searxng uwsgi-appini fedora
+
+
+.. _uWSGI Tyrant mode pitfalls:
+
+Pitfalls of the Tyrant mode
+===========================
+
+The implementation of the process owners and groups in the `Tyrant mode`_ is
+somewhat unusual and requires special consideration. In `Tyrant mode`_ mode the
+Emperor will run the vassal using the UID/GID of the vassal configuration file
+(user and group of the app ``.ini`` file).
+
+.. _#2099@uWSGI: https://github.com/unbit/uwsgi/issues/2099
+.. _#752@uWSGI: https://github.com/unbit/uwsgi/pull/752
+.. _#2425uWSGI: https://github.com/unbit/uwsgi/issues/2425
+
+Without option ``emperor-tyrant-initgroups=true`` in ``/etc/uwsgi.ini`` the
+process won't get the additional groups, but this option is not available in
+2.0.x branch (see `#2099@uWSGI`_) the feature `#752@uWSGI`_ has been merged (on
+Oct. 2014) to the master branch of uWSGI but had never been released; the last
+major release is from Dec. 2013, since the there had been only bugfix releases
+(see `#2425uWSGI`_). To shorten up:
+
+ **In Tyrant mode, there is no way to get additional groups, and the uWSGI
+ process misses additional permissions that may be needed.**
+
+For example on Fedora (RHEL): If you try to install a redis DB with socket
+communication and you want to connect to it from the SearXNG uWSGI, you will see a
+*Permission denied* in the log of your instance::
+
+ ERROR:searx.redisdb: [searxng (993)] can't connect redis DB ...
+ ERROR:searx.redisdb: Error 13 connecting to unix socket: /usr/local/searxng-redis/run/redis.sock. Permission denied.
+ ERROR:searx.plugins.limiter: init limiter DB failed!!!
+
+Even if your *searxng* user of the uWSGI process is added to additional groups
+to give access to the socket from the redis DB::
+
+ $ groups searxng
+ searxng : searxng searxng-redis
+
+To see the effective groups of the uwsgi process, you have to look at the status
+of the process, by example::
+
+ $ ps -aef | grep '/usr/sbin/uwsgi --ini searxng.ini'
+ searxng 93 92 0 12:43 ? 00:00:00 /usr/sbin/uwsgi --ini searxng.ini
+ searxng 186 93 0 12:44 ? 00:00:01 /usr/sbin/uwsgi --ini searxng.ini
+
+Here you can see that the additional "Groups" of PID 186 are unset (missing gid
+of ``searxng-redis``)::
+
+ $ cat /proc/186/task/186/status
+ ...
+ Uid: 993 993 993 993
+ Gid: 993 993 993 993
+ FDSize: 128
+ Groups:
+ ...
diff --git a/_sources/admin/installation.rst.txt b/_sources/admin/installation.rst.txt
new file mode 100644
index 000000000..54d901f76
--- /dev/null
+++ b/_sources/admin/installation.rst.txt
@@ -0,0 +1,22 @@
+.. _installation:
+
+============
+Installation
+============
+
+*You're spoilt for choice*, choose your preferred method of installation.
+
+- :ref:`installation docker`
+- :ref:`installation scripts`
+- :ref:`installation basic`
+
+The :ref:`installation basic` is an excellent illustration of *how a SearXNG
+instance is build up* (see :ref:`architecture uWSGI`). If you do not have any
+special preferences, it's recommended to use the :ref:`installation docker` or the
+:ref:`installation scripts`.
+
+.. attention::
+
+ SearXNG is growing rapidly, you should regularly read our :ref:`migrate and
+ stay tuned` section. If you want to upgrade an existing instance or migrate
+ from searx to SearXNG, you should read this section first!
diff --git a/_sources/admin/plugins.rst.txt b/_sources/admin/plugins.rst.txt
new file mode 100644
index 000000000..d97b3dada
--- /dev/null
+++ b/_sources/admin/plugins.rst.txt
@@ -0,0 +1,39 @@
+.. _plugins generic:
+
+===============
+Plugins builtin
+===============
+
+.. sidebar:: Further reading ..
+
+ - :ref:`dev plugin`
+
+Configuration defaults (at built time):
+
+:DO: Default on
+
+.. _configured plugins:
+
+.. jinja:: searx
+
+ .. flat-table:: Plugins configured at built time (defaults)
+ :header-rows: 1
+ :stub-columns: 1
+ :widths: 3 1 9
+
+ * - Name
+ - DO
+ - Description
+
+ JS & CSS dependencies
+
+ {% for plgin in plugins %}
+
+ * - {{plgin.name}}
+ - {{(plgin.default_on and "y") or ""}}
+ - {{plgin.description}}
+
+ {% for dep in (plgin.js_dependencies + plgin.css_dependencies) %}
+ | ``{{dep}}`` {% endfor %}
+
+ {% endfor %}
diff --git a/_sources/admin/searx.limiter.rst.txt b/_sources/admin/searx.limiter.rst.txt
new file mode 100644
index 000000000..c23635571
--- /dev/null
+++ b/_sources/admin/searx.limiter.rst.txt
@@ -0,0 +1,17 @@
+.. _limiter:
+
+=======
+Limiter
+=======
+
+.. sidebar:: info
+
+ The limiter requires a :ref:`Redis <settings redis>` database.
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.limiter
+ :members:
diff --git a/_sources/admin/settings/index.rst.txt b/_sources/admin/settings/index.rst.txt
new file mode 100644
index 000000000..005ee37e1
--- /dev/null
+++ b/_sources/admin/settings/index.rst.txt
@@ -0,0 +1,25 @@
+========
+Settings
+========
+
+.. sidebar:: Further reading ..
+
+ - :ref:`engine settings`
+ - :ref:`engine file`
+
+.. toctree::
+ :maxdepth: 2
+
+ settings
+ settings_engine
+ settings_brand
+ settings_general
+ settings_search
+ settings_server
+ settings_ui
+ settings_redis
+ settings_outgoing
+ settings_categories_as_tabs
+
+
+
diff --git a/_sources/admin/settings/settings.rst.txt b/_sources/admin/settings/settings.rst.txt
new file mode 100644
index 000000000..9c6fb01be
--- /dev/null
+++ b/_sources/admin/settings/settings.rst.txt
@@ -0,0 +1,117 @@
+.. _settings.yml:
+
+================
+``settings.yml``
+================
+
+This page describe the options possibilities of the :origin:`searx/settings.yml`
+file.
+
+.. sidebar:: Further reading ..
+
+ - :ref:`use_default_settings.yml`
+ - :ref:`search API`
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. _settings location:
+
+settings.yml location
+=====================
+
+The initial ``settings.yml`` we be load from these locations:
+
+1. the full path specified in the ``SEARXNG_SETTINGS_PATH`` environment variable.
+2. ``/etc/searxng/settings.yml``
+
+If these files don't exist (or are empty or can't be read), SearXNG uses the
+:origin:`searx/settings.yml` file. Read :ref:`settings use_default_settings` to
+see how you can simplify your *user defined* ``settings.yml``.
+
+
+
+.. _settings use_default_settings:
+
+use_default_settings
+====================
+
+.. sidebar:: ``use_default_settings: true``
+
+ - :ref:`settings location`
+ - :ref:`use_default_settings.yml`
+ - :origin:`/etc/searxng/settings.yml <utils/templates/etc/searxng/settings.yml>`
+
+The user defined ``settings.yml`` is loaded from the :ref:`settings location`
+and can relied on the default configuration :origin:`searx/settings.yml` using:
+
+ ``use_default_settings: true``
+
+``server:``
+ In the following example, the actual settings are the default settings defined
+ in :origin:`searx/settings.yml` with the exception of the ``secret_key`` and
+ the ``bind_address``:
+
+ .. code:: yaml
+
+ use_default_settings: true
+ server:
+ secret_key: "ultrasecretkey" # change this!
+ bind_address: "0.0.0.0"
+
+``engines:``
+ With ``use_default_settings: true``, each settings can be override in a
+ similar way, the ``engines`` section is merged according to the engine
+ ``name``. In this example, SearXNG will load all the default engines, will
+ enable the ``bing`` engine and define a :ref:`token <private engines>` for
+ the arch linux engine:
+
+ .. code:: yaml
+
+ use_default_settings: true
+ server:
+ secret_key: "ultrasecretkey" # change this!
+ engines:
+ - name: arch linux wiki
+ tokens: ['$ecretValue']
+ - name: bing
+ disabled: false
+
+
+``engines:`` / ``remove:``
+ It is possible to remove some engines from the default settings. The following
+ example is similar to the above one, but SearXNG doesn't load the the google
+ engine:
+
+ .. code:: yaml
+
+ use_default_settings:
+ engines:
+ remove:
+ - google
+ server:
+ secret_key: "ultrasecretkey" # change this!
+ engines:
+ - name: arch linux wiki
+ tokens: ['$ecretValue']
+
+``engines:`` / ``keep_only:``
+ As an alternative, it is possible to specify the engines to keep. In the
+ following example, SearXNG has only two engines:
+
+ .. code:: yaml
+
+ use_default_settings:
+ engines:
+ keep_only:
+ - google
+ - duckduckgo
+ server:
+ secret_key: "ultrasecretkey" # change this!
+ engines:
+ - name: google
+ tokens: ['$ecretValue']
+ - name: duckduckgo
+ tokens: ['$ecretValue']
diff --git a/_sources/admin/settings/settings_brand.rst.txt b/_sources/admin/settings/settings_brand.rst.txt
new file mode 100644
index 000000000..0f1a0d9a9
--- /dev/null
+++ b/_sources/admin/settings/settings_brand.rst.txt
@@ -0,0 +1,25 @@
+.. _settings brand:
+
+==========
+``brand:``
+==========
+
+.. code:: yaml
+
+ brand:
+ issue_url: https://github.com/searxng/searxng/issues
+ docs_url: https://docs.searxng.org
+ public_instances: https://searx.space
+ wiki_url: https://github.com/searxng/searxng/wiki
+
+``issue_url`` :
+ If you host your own issue tracker change this URL.
+
+``docs_url`` :
+ If you host your own documentation change this URL.
+
+``public_instances`` :
+ If you host your own https://searx.space change this URL.
+
+``wiki_url`` :
+ Link to your wiki (or ``false``)
diff --git a/_sources/admin/settings/settings_categories_as_tabs.rst.txt b/_sources/admin/settings/settings_categories_as_tabs.rst.txt
new file mode 100644
index 000000000..732d04678
--- /dev/null
+++ b/_sources/admin/settings/settings_categories_as_tabs.rst.txt
@@ -0,0 +1,31 @@
+.. _settings categories_as_tabs:
+
+=======================
+``categories_as_tabs:``
+=======================
+
+A list of the categories that are displayed as tabs in the user interface.
+Categories not listed here can still be searched with the :ref:`search-syntax`.
+
+.. code:: yaml
+
+ categories_as_tabs:
+ general:
+ images:
+ videos:
+ news:
+ map:
+ music:
+ it:
+ science:
+ files:
+ social media:
+
+Engines are added to ``categories:`` (compare :ref:`engine categories`), the
+categories listed in ``categories_as_tabs`` are shown as tabs in the UI. If
+there are no active engines in a category, the tab is not displayed (e.g. if a
+user disables all engines in a category).
+
+On the preferences page (``/preferences``) -- under *engines* -- there is an
+additional tab, called *other*. In this tab are all engines listed that are not
+in one of the UI tabs (not included in ``categories_as_tabs``).
diff --git a/_sources/admin/settings/settings_engine.rst.txt b/_sources/admin/settings/settings_engine.rst.txt
new file mode 100644
index 000000000..78c400ccf
--- /dev/null
+++ b/_sources/admin/settings/settings_engine.rst.txt
@@ -0,0 +1,244 @@
+.. _settings engine:
+
+===========
+``engine:``
+===========
+
+.. sidebar:: Further reading ..
+
+ - :ref:`configured engines`
+ - :ref:`engines-dev`
+
+In the code example below a *full fledged* example of a YAML setup from a dummy
+engine is shown. Most of the options have a default value or even are optional.
+
+.. hint::
+
+ A few more options are possible, but they are pretty specific to some
+ engines (:ref:`engine implementations`).
+
+.. code:: yaml
+
+ - name: example engine
+ engine: example
+ shortcut: demo
+ base_url: 'https://{language}.example.com/'
+ send_accept_language_header: false
+ categories: general
+ timeout: 3.0
+ api_key: 'apikey'
+ disabled: false
+ language: en_US
+ tokens: [ 'my-secret-token' ]
+ weight: 1
+ display_error_messages: true
+ about:
+ website: https://example.com
+ wikidata_id: Q306656
+ official_api_documentation: https://example.com/api-doc
+ use_official_api: true
+ require_api_key: true
+ results: HTML
+
+ # overwrite values from section 'outgoing:'
+ enable_http2: false
+ retries: 1
+ max_connections: 100
+ max_keepalive_connections: 10
+ keepalive_expiry: 5.0
+ using_tor_proxy: false
+ proxies:
+ http:
+ - http://proxy1:8080
+ - http://proxy2:8080
+ https:
+ - http://proxy1:8080
+ - http://proxy2:8080
+ - socks5://user:password@proxy3:1080
+ - socks5h://user:password@proxy4:1080
+
+ # other network settings
+ enable_http: false
+ retry_on_http_error: true # or 403 or [404, 429]
+
+
+``name`` :
+ Name that will be used across SearXNG to define this engine. In settings, on
+ the result page...
+
+``engine`` :
+ Name of the python file used to handle requests and responses to and from this
+ search engine.
+
+``shortcut`` :
+ Code used to execute bang requests (in this case using ``!bi``)
+
+``base_url`` : optional
+ Part of the URL that should be stable across every request. Can be useful to
+ use multiple sites using only one engine, or updating the site URL without
+ touching at the code.
+
+``send_accept_language_header`` :
+ Several engines that support languages (or regions) deal with the HTTP header
+ ``Accept-Language`` to build a response that fits to the locale. When this
+ option is activated, the language (locale) that is selected by the user is used
+ to build and send a ``Accept-Language`` header in the request to the origin
+ search engine.
+
+.. _engine categories:
+
+``categories`` : optional
+ Specifies to which categories the engine should be added. Engines can be
+ assigned to multiple categories.
+
+ Categories can be shown as tabs (:ref:`settings categories_as_tabs`) in the
+ UI. A search in a tab (in the UI) will query all engines that are active in
+ this tab. In the preferences page (``/preferences``) -- under *engines* --
+ users can select what engine should be active when querying in this tab.
+
+ Alternatively, :ref:`\!bang <search-syntax>` can be used to search all engines
+ in a category, regardless of whether they are active or not, or whether they
+ are in a tab of the UI or not. For example, ``!dictionaries`` can be used to
+ query all search engines in that category (group).
+
+``timeout`` : optional
+ Timeout of the search with the current search engine. Overwrites
+ ``request_timeout`` from :ref:`settings outgoing`. **Be careful, it will
+ modify the global timeout of SearXNG.**
+
+``api_key`` : optional
+ In a few cases, using an API needs the use of a secret key. How to obtain them
+ is described in the file.
+
+``disabled`` : optional
+ To disable by default the engine, but not deleting it. It will allow the user
+ to manually activate it in the settings.
+
+``inactive``: optional
+ Remove the engine from the settings (*disabled & removed*).
+
+``language`` : optional
+ If you want to use another language for a specific engine, you can define it
+ by using the ISO code of language (and region), like ``fr``, ``en-US``,
+ ``de-DE``.
+
+``tokens`` : optional
+ A list of secret tokens to make this engine *private*, more details see
+ :ref:`private engines`.
+
+``weight`` : default ``1``
+ Weighting of the results of this engine.
+
+``display_error_messages`` : default ``true``
+ When an engine returns an error, the message is displayed on the user interface.
+
+``network`` : optional
+ Use the network configuration from another engine.
+ In addition, there are two default networks:
+
+ - ``ipv4`` set ``local_addresses`` to ``0.0.0.0`` (use only IPv4 local addresses)
+ - ``ipv6`` set ``local_addresses`` to ``::`` (use only IPv6 local addresses)
+
+``enable_http`` : optional
+ Enable HTTP for this engine (by default only HTTPS is enabled).
+
+``retry_on_http_error`` : optional
+ Retry request on some HTTP status code.
+
+ Example:
+
+ * ``true`` : on HTTP status code between 400 and 599.
+ * ``403`` : on HTTP status code 403.
+ * ``[403, 429]``: on HTTP status code 403 and 429.
+
+``proxies`` :
+ Overwrites proxy settings from :ref:`settings outgoing`.
+
+``using_tor_proxy`` :
+ Using tor proxy (``true``) or not (``false``) for this engine. The default is
+ taken from ``using_tor_proxy`` of the :ref:`settings outgoing`.
+
+.. _Pool limit configuration: https://www.python-httpx.org/advanced/#pool-limit-configuration
+
+``max_keepalive_connection#s`` :
+ `Pool limit configuration`_, overwrites value ``pool_maxsize`` from
+ :ref:`settings outgoing` for this engine.
+
+``max_connections`` :
+ `Pool limit configuration`_, overwrites value ``pool_connections`` from
+ :ref:`settings outgoing` for this engine.
+
+``keepalive_expiry`` :
+ `Pool limit configuration`_, overwrites value ``keepalive_expiry`` from
+ :ref:`settings outgoing` for this engine.
+
+
+.. _private engines:
+
+Private Engines (``tokens``)
+============================
+
+Administrators might find themselves wanting to limit access to some of the
+enabled engines on their instances. It might be because they do not want to
+expose some private information through :ref:`offline engines`. Or they would
+rather share engines only with their trusted friends or colleagues.
+
+.. sidebar:: info
+
+ Initial sponsored by `Search and Discovery Fund
+ <https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
+
+To solve this issue the concept of *private engines* exists.
+
+A new option was added to engines named `tokens`. It expects a list of strings.
+If the user making a request presents one of the tokens of an engine, they can
+access information about the engine and make search requests.
+
+Example configuration to restrict access to the Arch Linux Wiki engine:
+
+.. code:: yaml
+
+ - name: arch linux wiki
+ engine: archlinux
+ shortcut: al
+ tokens: [ 'my-secret-token' ]
+
+Unless a user has configured the right token, the engine is going to be hidden
+from him/her. It is not going to be included in the list of engines on the
+Preferences page and in the output of `/config` REST API call.
+
+Tokens can be added to one's configuration on the Preferences page under "Engine
+tokens". The input expects a comma separated list of strings.
+
+The distribution of the tokens from the administrator to the users is not carved
+in stone. As providing access to such engines implies that the admin knows and
+trusts the user, we do not see necessary to come up with a strict process.
+Instead, we would like to add guidelines to the documentation of the feature.
+
+
+Example: Multilingual Search
+============================
+
+SearXNG does not support true multilingual search. You have to use the language
+prefix in your search query when searching in a different language.
+
+But there is a workaround: By adding a new search engine with a different
+language, SearXNG will search in your default and other language.
+
+Example configuration in settings.yml for a German and English speaker:
+
+.. code-block:: yaml
+
+ search:
+ default_lang : "de"
+ ...
+
+ engines:
+ - name : google english
+ engine : google
+ language : en
+ ...
+
+When searching, the default google engine will return German results and
+"google english" will return English results.
+
diff --git a/_sources/admin/settings/settings_general.rst.txt b/_sources/admin/settings/settings_general.rst.txt
new file mode 100644
index 000000000..02a2156b3
--- /dev/null
+++ b/_sources/admin/settings/settings_general.rst.txt
@@ -0,0 +1,34 @@
+.. _settings general:
+
+============
+``general:``
+============
+
+.. code:: yaml
+
+ general:
+ debug: false
+ instance_name: "SearXNG"
+ privacypolicy_url: false
+ donation_url: false
+ contact_url: false
+ enable_metrics: true
+
+``debug`` : ``$SEARXNG_DEBUG``
+ Allow a more detailed log if you run SearXNG directly. Display *detailed* error
+ messages in the browser too, so this must be deactivated in production.
+
+``donation_url`` :
+ Set value to ``true`` to use your own donation page written in the
+ :ref:`searx/info/en/donate.md <searx.infopage>` and use ``false`` to disable
+ the donation link altogether.
+
+``privacypolicy_url``:
+ Link to privacy policy.
+
+``contact_url``:
+ Contact ``mailto:`` address or WEB form.
+
+``enable_metrics``:
+ Enabled by default. Record various anonymous metrics available at ``/stats``,
+ ``/stats/errors`` and ``/preferences``.
diff --git a/_sources/admin/settings/settings_outgoing.rst.txt b/_sources/admin/settings/settings_outgoing.rst.txt
new file mode 100644
index 000000000..7d49ab789
--- /dev/null
+++ b/_sources/admin/settings/settings_outgoing.rst.txt
@@ -0,0 +1,110 @@
+.. _settings outgoing:
+
+=============
+``outgoing:``
+=============
+
+Communication with search engines.
+
+.. code:: yaml
+
+ outgoing:
+ request_timeout: 2.0 # default timeout in seconds, can be override by engine
+ max_request_timeout: 10.0 # the maximum timeout in seconds
+ useragent_suffix: "" # information like an email address to the administrator
+ pool_connections: 100 # Maximum number of allowable connections, or null
+ # for no limits. The default is 100.
+ pool_maxsize: 10 # Number of allowable keep-alive connections, or null
+ # to always allow. The default is 10.
+ enable_http2: true # See https://www.python-httpx.org/http2/
+ # uncomment below section if you want to use a custom server certificate
+ # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults
+ # and https://www.python-httpx.org/compatibility/#ssl-configuration
+ # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer
+ #
+ # uncomment below section if you want to use a proxyq see: SOCKS proxies
+ # https://2.python-requests.org/en/latest/user/advanced/#proxies
+ # are also supported: see
+ # https://2.python-requests.org/en/latest/user/advanced/#socks
+ #
+ # proxies:
+ # all://:
+ # - http://proxy1:8080
+ # - http://proxy2:8080
+ #
+ # using_tor_proxy: true
+ #
+ # Extra seconds to add in order to account for the time taken by the proxy
+ #
+ # extra_proxy_timeout: 10.0
+ #
+
+``request_timeout`` :
+ Global timeout of the requests made to others engines in seconds. A bigger
+ timeout will allow to wait for answers from slow engines, but in consequence
+ will slow SearXNG reactivity (the result page may take the time specified in the
+ timeout to load). Can be override by ``timeout`` in the :ref:`settings engine`.
+
+``useragent_suffix`` :
+ Suffix to the user-agent SearXNG uses to send requests to others engines. If an
+ engine wish to block you, a contact info here may be useful to avoid that.
+
+.. _Pool limit configuration: https://www.python-httpx.org/advanced/#pool-limit-configuration
+
+``pool_maxsize``:
+ Number of allowable keep-alive connections, or ``null`` to always allow. The
+ default is 10. See ``max_keepalive_connections`` `Pool limit configuration`_.
+
+``pool_connections`` :
+ Maximum number of allowable connections, or ``null`` # for no limits. The
+ default is 100. See ``max_connections`` `Pool limit configuration`_.
+
+``keepalive_expiry`` :
+ Number of seconds to keep a connection in the pool. By default 5.0 seconds.
+ See ``keepalive_expiry`` `Pool limit configuration`_.
+
+.. _httpx proxies: https://www.python-httpx.org/advanced/#http-proxying
+
+``proxies`` :
+ Define one or more proxies you wish to use, see `httpx proxies`_.
+ If there are more than one proxy for one protocol (http, https),
+ requests to the engines are distributed in a round-robin fashion.
+
+``source_ips`` :
+ If you use multiple network interfaces, define from which IP the requests must
+ be made. Example:
+
+ * ``0.0.0.0`` any local IPv4 address.
+ * ``::`` any local IPv6 address.
+ * ``192.168.0.1``
+ * ``[ 192.168.0.1, 192.168.0.2 ]`` these two specific IP addresses
+ * ``fe80::60a2:1691:e5a2:ee1f``
+ * ``fe80::60a2:1691:e5a2:ee1f/126`` all IP addresses in this network.
+ * ``[ 192.168.0.1, fe80::/126 ]``
+
+``retries`` :
+ Number of retry in case of an HTTP error. On each retry, SearXNG uses an
+ different proxy and source ip.
+
+``enable_http2`` :
+ Enable by default. Set to ``false`` to disable HTTP/2.
+
+.. _httpx verification defaults: https://www.python-httpx.org/advanced/#changing-the-verification-defaults
+.. _httpx ssl configuration: https://www.python-httpx.org/compatibility/#ssl-configuration
+
+``verify``: : ``$SSL_CERT_FILE``, ``$SSL_CERT_DIR``
+ Allow to specify a path to certificate.
+ see `httpx verification defaults`_.
+
+ In addition to ``verify``, SearXNG supports the ``$SSL_CERT_FILE`` (for a file) and
+ ``$SSL_CERT_DIR`` (for a directory) OpenSSL variables.
+ see `httpx ssl configuration`_.
+
+``max_redirects`` :
+ 30 by default. Maximum redirect before it is an error.
+
+``using_tor_proxy`` :
+ Using tor proxy (``true``) or not (``false``) for all engines. The default is
+ ``false`` and can be overwritten in the :ref:`settings engine`
+
+
diff --git a/_sources/admin/settings/settings_redis.rst.txt b/_sources/admin/settings/settings_redis.rst.txt
new file mode 100644
index 000000000..9fb067553
--- /dev/null
+++ b/_sources/admin/settings/settings_redis.rst.txt
@@ -0,0 +1,49 @@
+.. _settings redis:
+
+==========
+``redis:``
+==========
+
+.. _Redis.from_url(url): https://redis-py.readthedocs.io/en/stable/connections.html#redis.client.Redis.from_url
+
+A redis DB can be connected by an URL, in :py:obj:`searx.redisdb` you
+will find a description to test your redis connection in SearXNG. When using
+sockets, don't forget to check the access rights on the socket::
+
+ ls -la /usr/local/searxng-redis/run/redis.sock
+ srwxrwx--- 1 searxng-redis searxng-redis ... /usr/local/searxng-redis/run/redis.sock
+
+In this example read/write access is given to the *searxng-redis* group. To get
+access rights to redis instance (the socket), your SearXNG (or even your
+developer) account needs to be added to the *searxng-redis* group.
+
+``url`` : ``$SEARXNG_REDIS_URL``
+ URL to connect redis database, see `Redis.from_url(url)`_ & :ref:`redis db`::
+
+ redis://[[username]:[password]]@localhost:6379/0
+ rediss://[[username]:[password]]@localhost:6379/0
+ unix://[[username]:[password]]@/path/to/socket.sock?db=0
+
+.. _Redis Developer Notes:
+
+Redis Developer Notes
+=====================
+
+To set up a local redis instance, first set the socket path of the Redis DB
+in your YAML setting:
+
+.. code:: yaml
+
+ redis:
+ url: unix:///usr/local/searxng-redis/run/redis.sock?db=0
+
+Then use the following commands to install the redis instance (:ref:`manage
+redis.help`):
+
+.. code:: sh
+
+ $ ./manage redis.build
+ $ sudo -H ./manage redis.install
+ $ sudo -H ./manage redis.addgrp "${USER}"
+ # don't forget to logout & login to get member of group
+
diff --git a/_sources/admin/settings/settings_search.rst.txt b/_sources/admin/settings/settings_search.rst.txt
new file mode 100644
index 000000000..836207614
--- /dev/null
+++ b/_sources/admin/settings/settings_search.rst.txt
@@ -0,0 +1,98 @@
+.. _settings search:
+
+===========
+``search:``
+===========
+
+.. code:: yaml
+
+ search:
+ safe_search: 0
+ autocomplete: ""
+ default_lang: ""
+ ban_time_on_fail: 5
+ max_ban_time_on_fail: 120
+ suspended_times:
+ SearxEngineAccessDenied: 86400
+ SearxEngineCaptcha: 86400
+ SearxEngineTooManyRequests: 3600
+ cf_SearxEngineCaptcha: 1296000
+ cf_SearxEngineAccessDenied: 86400
+ recaptcha_SearxEngineCaptcha: 604800
+ formats:
+ - html
+
+``safe_search``:
+ Filter results.
+
+ - ``0``: None
+ - ``1``: Moderate
+ - ``2``: Strict
+
+``autocomplete``:
+ Existing autocomplete backends, leave blank to turn it off.
+
+ - ``dbpedia``
+ - ``duckduckgo``
+ - ``google``
+ - ``mwmbl``
+ - ``startpage``
+ - ``swisscows``
+ - ``qwant``
+ - ``wikipedia``
+
+``default_lang``:
+ Default search language - leave blank to detect from browser information or
+ use codes from :origin:`searx/languages.py`.
+
+``languages``:
+ List of available languages - leave unset to use all codes from
+ :origin:`searx/languages.py`. Otherwise list codes of available languages.
+ The ``all`` value is shown as the ``Default language`` in the user interface
+ (in most cases, it is meant to send the query without a language parameter ;
+ in some cases, it means the English language) Example:
+
+ .. code:: yaml
+
+ languages:
+ - all
+ - en
+ - en-US
+ - de
+ - it-IT
+ - fr
+ - fr-BE
+
+``ban_time_on_fail``:
+ Ban time in seconds after engine errors.
+
+``max_ban_time_on_fail``:
+ Max ban time in seconds after engine errors.
+
+``suspended_times``:
+ Engine suspension time after error (in seconds; set to 0 to disable)
+
+ ``SearxEngineAccessDenied``: 86400
+ For error "Access denied" and "HTTP error [402, 403]"
+
+ ``SearxEngineCaptcha``: 86400
+ For error "CAPTCHA"
+
+ ``SearxEngineTooManyRequests``: 3600
+ For error "Too many request" and "HTTP error 429"
+
+ Cloudflare CAPTCHA:
+ - ``cf_SearxEngineCaptcha``: 1296000
+ - ``cf_SearxEngineAccessDenied``: 86400
+
+ Google CAPTCHA:
+ - ``recaptcha_SearxEngineCaptcha``: 604800
+
+``formats``:
+ Result formats available from web, remove format to deny access (use lower
+ case).
+
+ - ``html``
+ - ``csv``
+ - ``json``
+ - ``rss``
diff --git a/_sources/admin/settings/settings_server.rst.txt b/_sources/admin/settings/settings_server.rst.txt
new file mode 100644
index 000000000..daba6d1dd
--- /dev/null
+++ b/_sources/admin/settings/settings_server.rst.txt
@@ -0,0 +1,57 @@
+.. _settings server:
+
+===========
+``server:``
+===========
+
+.. code:: yaml
+
+ server:
+ base_url: http://example.org/location # change this!
+ port: 8888
+ bind_address: "127.0.0.1"
+ secret_key: "ultrasecretkey" # change this!
+ limiter: false
+ public_instance: false
+ image_proxy: false
+ default_http_headers:
+ X-Content-Type-Options : nosniff
+ X-Download-Options : noopen
+ X-Robots-Tag : noindex, nofollow
+ Referrer-Policy : no-referrer
+
+``base_url`` : ``$SEARXNG_URL``
+ The base URL where SearXNG is deployed. Used to create correct inbound links.
+
+``port`` & ``bind_address``: ``$SEARXNG_PORT`` & ``$SEARXNG_BIND_ADDRESS``
+ Port number and *bind address* of the SearXNG web application if you run it
+ directly using ``python searx/webapp.py``. Doesn't apply to a SearXNG
+ services running behind a proxy and using socket communications.
+
+``secret_key`` : ``$SEARXNG_SECRET``
+ Used for cryptography purpose.
+
+``limiter`` :
+ Rate limit the number of request on the instance, block some bots. The
+ :ref:`limiter` requires a :ref:`settings redis` database.
+
+.. _public_instance:
+
+``public_instance`` :
+
+ Setting that allows to enable features specifically for public instances (not
+ needed for local usage). By set to ``true`` the following features are
+ activated:
+
+ - :py:obj:`searx.botdetection.link_token` in the :ref:`limiter`
+
+.. _image_proxy:
+
+``image_proxy`` :
+ Allow your instance of SearXNG of being able to proxy images. Uses memory space.
+
+.. _HTTP headers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
+
+``default_http_headers`` :
+ Set additional HTTP headers, see `#755 <https://github.com/searx/searx/issues/715>`__
+
diff --git a/_sources/admin/settings/settings_ui.rst.txt b/_sources/admin/settings/settings_ui.rst.txt
new file mode 100644
index 000000000..a5d1076ec
--- /dev/null
+++ b/_sources/admin/settings/settings_ui.rst.txt
@@ -0,0 +1,70 @@
+.. _settings ui:
+
+=======
+``ui:``
+=======
+
+.. _cache busting:
+ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#caching_static_assets_with_cache_busting
+
+.. code:: yaml
+
+ ui:
+ static_use_hash: false
+ default_locale: ""
+ query_in_title: false
+ infinite_scroll: false
+ center_alignment: false
+ cache_url: https://web.archive.org/web/
+ default_theme: simple
+ theme_args:
+ simple_style: auto
+ search_on_category_select: true
+ hotkeys: default
+
+.. _static_use_hash:
+
+``static_use_hash`` :
+ Enables `cache busting`_ of static files.
+
+``default_locale`` :
+ SearXNG interface language. If blank, the locale is detected by using the
+ browser language. If it doesn't work, or you are deploying a language
+ specific instance of searx, a locale can be defined using an ISO language
+ code, like ``fr``, ``en``, ``de``.
+
+``query_in_title`` :
+ When true, the result page's titles contains the query it decreases the
+ privacy, since the browser can records the page titles.
+
+``infinite_scroll``:
+ When true, automatically loads the next page when scrolling to bottom of the current page.
+
+``center_alignment`` : default ``false``
+ When enabled, the results are centered instead of being in the left (or RTL)
+ side of the screen. This setting only affects the *desktop layout*
+ (:origin:`min-width: @tablet <searx/static/themes/simple/src/less/definitions.less>`)
+
+.. cache_url:
+
+``cache_url`` : ``https://web.archive.org/web/``
+ URL prefix of the internet archive or cache, don't forget trailing slash (if
+ needed). The default is https://web.archive.org/web/ alternatives are:
+
+ - https://webcache.googleusercontent.com/search?q=cache:
+ - https://archive.today/
+
+``default_theme`` :
+ Name of the theme you want to use by default on your SearXNG instance.
+
+``theme_args.simple_style``:
+ Style of simple theme: ``auto``, ``light``, ``dark``
+
+``results_on_new_tab``:
+ Open result links in a new tab by default.
+
+``search_on_category_select``:
+ Perform search immediately if a category selected. Disable to select multiple categories.
+
+``hotkeys``:
+ Hotkeys to use in the search interface: ``default``, ``vim`` (Vim-like).
diff --git a/_sources/admin/update-searxng.rst.txt b/_sources/admin/update-searxng.rst.txt
new file mode 100644
index 000000000..b9d15c3f7
--- /dev/null
+++ b/_sources/admin/update-searxng.rst.txt
@@ -0,0 +1,138 @@
+.. _searxng maintenance:
+
+===================
+SearXNG maintenance
+===================
+
+.. sidebar:: further read
+
+ - :ref:`toolboxing`
+ - :ref:`uWSGI maintenance`
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. _update searxng:
+
+How to update
+=============
+
+How to update depends on the :ref:`installation` method. If you have used the
+:ref:`installation scripts`, use the ``update`` command from the :ref:`searxng.sh`
+script.
+
+.. code:: sh
+
+ sudo -H ./utils/searxng.sh instance update
+
+.. _inspect searxng:
+
+How to inspect & debug
+======================
+
+How to debug depends on the :ref:`installation` method. If you have used the
+:ref:`installation scripts`, use the ``inspect`` command from the :ref:`searxng.sh`
+script.
+
+.. code:: sh
+
+ sudo -H ./utils/searxng.sh instance inspect
+
+.. _migrate and stay tuned:
+
+Migrate and stay tuned!
+=======================
+
+.. sidebar:: info
+
+ - :pull:`1332`
+ - :pull:`456`
+ - :pull:`A comment about rolling release <446#issuecomment-954730358>`
+
+SearXNG is a *rolling release*; each commit to the master branch is a release.
+SearXNG is growing rapidly, the services and opportunities are change every now
+and then, to name just a few:
+
+- Bot protection has been switched from filtron to SearXNG's :ref:`limiter
+ <limiter>`, this requires a :ref:`Redis <settings redis>` database.
+
+- The image proxy morty is no longer needed, it has been replaced by the
+ :ref:`image proxy <image_proxy>` from SearXNG.
+
+- To save bandwidth :ref:`cache busting <static_use_hash>` has been implemented.
+ To get in use, the ``static-expires`` needs to be set in the :ref:`uwsgi
+ setup`.
+
+To stay tuned and get in use of the new features, instance maintainers have to
+update the SearXNG code regularly (see :ref:`update searxng`). As the above
+examples show, this is not always enough, sometimes services have to be set up
+or reconfigured and sometimes services that are no longer needed should be
+uninstalled.
+
+.. hint::
+
+ First of all: SearXNG is installed by the script :ref:`searxng.sh`. If you
+ have old filtron, morty or searx setup you should consider complete
+ uninstall/reinstall.
+
+Here you will find a list of changes that affect the infrastructure. Please
+check to what extent it is necessary to update your installations:
+
+:pull:`1595`: ``[fix] uWSGI: increase buffer-size``
+ Re-install uWSGI (:ref:`searxng.sh`) or fix your uWSGI ``searxng.ini``
+ file manually.
+
+
+remove obsolete services
+------------------------
+
+If your searx instance was installed *"Step by step"* or by the *"Installation
+scripts"*, you need to undo the installation procedure completely. If you have
+morty & filtron installed, it is recommended to uninstall these services also.
+In case of scripts, to uninstall use the scripts from the origin you installed
+searx from or try::
+
+ $ sudo -H ./utils/filtron.sh remove all
+ $ sudo -H ./utils/morty.sh remove all
+ $ sudo -H ./utils/searx.sh remove all
+
+.. hint::
+
+ If you are migrate from searx take into account that the ``.config.sh`` is no
+ longer used.
+
+If you upgrade from searx or from before :pull:`1332` has been merged and you
+have filtron and/or morty installed, don't forget to remove HTTP sites.
+
+Apache::
+
+ $ sudo -H ./utils/filtron.sh apache remove
+ $ sudo -H ./utils/morty.sh apache remove
+
+nginx::
+
+ $ sudo -H ./utils/filtron.sh nginx remove
+ $ sudo -H ./utils/morty.sh nginx remove
+
+
+
+Check after Installation
+------------------------
+
+Once you have done your installation, you can run a SearXNG *check* procedure,
+to see if there are some left overs. In this example there exists a *old*
+``/etc/searx/settings.yml``::
+
+ $ sudo -H ./utils/searxng.sh instance check
+
+ SearXNG checks
+ --------------
+ ERROR: settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/
+ INFO: [OK] (old) account 'searx' does not exists
+ INFO: [OK] (old) account 'filtron' does not exists
+ INFO: [OK] (old) account 'morty' does not exists
+ ...
+ INFO searx.redisdb : connecting to Redis db=0 path='/usr/local/searxng-redis/run/redis.sock'
+ INFO searx.redisdb : connected to Redis
diff --git a/_sources/dev/contribution_guide.rst.txt b/_sources/dev/contribution_guide.rst.txt
new file mode 100644
index 000000000..df5200637
--- /dev/null
+++ b/_sources/dev/contribution_guide.rst.txt
@@ -0,0 +1,190 @@
+.. _how to contribute:
+
+=================
+How to contribute
+=================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+Prime directives: Privacy, Hackability
+======================================
+
+SearXNG has two prime directives, **privacy-by-design and hackability** . The
+hackability comes in three levels:
+
+- support of search engines
+- plugins to alter search behaviour
+- hacking SearXNG itself
+
+Note the lack of "world domination" among the directives. SearXNG has no
+intention of wide mass-adoption, rounded corners, etc. The prime directive
+"privacy" deserves a separate chapter, as it's quite uncommon unfortunately.
+
+Privacy-by-design
+-----------------
+
+SearXNG was born out of the need for a **privacy-respecting** search tool which
+can be extended easily to maximize both, its search and its privacy protecting
+capabilities.
+
+A few widely used features work differently or turned off by default or not
+implemented at all **as a consequence of privacy-by-design**.
+
+If a feature reduces the privacy preserving aspects of searx, it should be
+switched off by default or should not implemented at all. There are plenty of
+search engines already providing such features. If a feature reduces the
+protection of searx, users must be informed about the effect of choosing to
+enable it. Features that protect privacy but differ from the expectations of
+the user should also be explained.
+
+Also, if you think that something works weird with searx, it's might be because
+of the tool you use is designed in a way to interfere with the privacy respect.
+Submitting a bugreport to the vendor of the tool that misbehaves might be a good
+feedback to reconsider the disrespect to its customers (e.g. ``GET`` vs ``POST``
+requests in various browsers).
+
+Remember the other prime directive of SearXNG is to be hackable, so if the above
+privacy concerns do not fancy you, simply fork it.
+
+ *Happy hacking.*
+
+Code
+====
+
+.. _PEP8: https://www.python.org/dev/peps/pep-0008/
+.. _Conventional Commits: https://www.conventionalcommits.org/
+.. _Git Commit Good Practice: https://wiki.openstack.org/wiki/GitCommitMessages
+.. _Structural split of changes:
+ https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes
+.. _gitmoji: https://gitmoji.carloscuesta.me/
+.. _Semantic PR: https://github.com/zeke/semantic-pull-requests
+
+.. sidebar:: Create good commits!
+
+ - `Structural split of changes`_
+ - `Conventional Commits`_
+ - `Git Commit Good Practice`_
+ - some like to use: gitmoji_
+ - not yet active: `Semantic PR`_
+
+In order to submit a patch, please follow the steps below:
+
+- Follow coding conventions.
+
+ - PEP8_ standards apply, except the convention of line length
+ - Maximum line length is 120 characters
+
+- The cardinal rule for creating good commits is to ensure there is only one
+ *logical change* per commit / read `Structural split of changes`_
+
+- Check if your code breaks existing tests. If so, update the tests or fix your
+ code.
+
+- If your code can be unit-tested, add unit tests.
+
+- Add yourself to the :origin:`AUTHORS.rst` file.
+
+- Choose meaningful commit messages, read `Conventional Commits`_
+
+ .. code::
+
+ <type>[optional scope]: <description>
+
+ [optional body]
+
+ [optional footer(s)]
+
+- Create a pull request.
+
+For more help on getting started with SearXNG development, see :ref:`devquickstart`.
+
+
+Translation
+===========
+
+Translation currently takes place on :ref:`weblate <translation>`.
+
+
+.. _contrib docs:
+
+Documentation
+=============
+
+.. _Sphinx: https://www.sphinx-doc.org
+.. _reST: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
+
+.. sidebar:: The reST sources
+
+ has been moved from ``gh-branch`` into ``master`` (:origin:`docs`).
+
+The documentation is built using Sphinx_. So in order to be able to generate
+the required files, you have to install it on your system. Much easier, use
+our :ref:`makefile`.
+
+Here is an example which makes a complete rebuild:
+
+.. code:: sh
+
+ $ make docs.clean docs.html
+ ...
+ The HTML pages are in dist/docs.
+
+.. _make docs.live:
+
+live build
+----------
+
+.. _sphinx-autobuild:
+ https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
+
+.. sidebar:: docs.clean
+
+ It is recommended to assert a complete rebuild before deploying (use
+ ``docs.clean``).
+
+Live build is like WYSIWYG. If you want to edit the documentation, its
+recommended to use. The Makefile target ``docs.live`` builds the docs, opens
+URL in your favorite browser and rebuilds every time a reST file has been
+changed (:ref:`make docs.clean`).
+
+.. code:: sh
+
+ $ make docs.live
+ ...
+ The HTML pages are in dist/docs.
+ ... Serving on http://0.0.0.0:8000
+ ... Start watching changes
+
+Live builds are implemented by sphinx-autobuild_. Use environment
+``$(SPHINXOPTS)`` to pass arguments to the sphinx-autobuild_ command. Except
+option ``--host`` (which is always set to ``0.0.0.0``) you can pass any
+argument. E.g to find and use a free port, use:
+
+.. code:: sh
+
+ $ SPHINXOPTS="--port 0" make docs.live
+ ...
+ ... Serving on http://0.0.0.0:50593
+ ...
+
+
+.. _deploy on github.io:
+
+deploy on github.io
+-------------------
+
+To deploy documentation at :docs:`github.io <.>` use Makefile target :ref:`make
+docs.gh-pages`, which builds the documentation and runs all the needed git add,
+commit and push:
+
+.. code:: sh
+
+ $ make docs.clean docs.gh-pages
+
+.. attention::
+
+ If you are working in your own brand, don't forget to adjust your
+ :ref:`settings brand`.
diff --git a/_sources/dev/engines/demo/demo_offline.rst.txt b/_sources/dev/engines/demo/demo_offline.rst.txt
new file mode 100644
index 000000000..1b4cb887f
--- /dev/null
+++ b/_sources/dev/engines/demo/demo_offline.rst.txt
@@ -0,0 +1,14 @@
+.. _demo offline engine:
+
+===================
+Demo Offline Engine
+===================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.demo_offline
+ :members:
+
diff --git a/_sources/dev/engines/demo/demo_online.rst.txt b/_sources/dev/engines/demo/demo_online.rst.txt
new file mode 100644
index 000000000..9b94207f7
--- /dev/null
+++ b/_sources/dev/engines/demo/demo_online.rst.txt
@@ -0,0 +1,14 @@
+.. _demo online engine:
+
+==================
+Demo Online Engine
+==================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.demo_online
+ :members:
+
diff --git a/_sources/dev/engines/engine_overview.rst.txt b/_sources/dev/engines/engine_overview.rst.txt
new file mode 100644
index 000000000..091d217c0
--- /dev/null
+++ b/_sources/dev/engines/engine_overview.rst.txt
@@ -0,0 +1,565 @@
+.. _engines-dev:
+
+===============
+Engine Overview
+===============
+
+.. contents::
+ :depth: 3
+ :local:
+ :backlinks: entry
+
+.. _metasearch-engine: https://en.wikipedia.org/wiki/Metasearch_engine
+
+.. sidebar:: Further reading ..
+
+ - :ref:`configured engines`
+ - :ref:`settings engine`
+
+SearXNG is a metasearch-engine_, so it uses different search engines to provide
+better results.
+
+Because there is no general search API which could be used for every search
+engine, an adapter has to be built between SearXNG and the external search
+engines. Adapters are stored under the folder :origin:`searx/engines`.
+
+.. _general engine configuration:
+
+General Engine Configuration
+============================
+
+It is required to tell SearXNG the type of results the engine provides. The
+arguments can be set in the engine file or in the settings file (normally
+``settings.yml``). The arguments in the settings file override the ones in the
+engine file.
+
+It does not matter if an option is stored in the engine file or in the settings.
+However, the standard way is the following:
+
+.. _engine file:
+
+Engine File
+-----------
+
+.. table:: Common options in the engine module
+ :width: 100%
+
+ ======================= =========== ========================================================
+ argument type information
+ ======================= =========== ========================================================
+ categories list categories, in which the engine is working
+ paging boolean support multiple pages
+ time_range_support boolean support search time range
+ engine_type str - ``online`` :ref:`[ref] <online engines>` by
+ default, other possibles values are:
+ - ``offline`` :ref:`[ref] <offline engines>`
+ - ``online_dictionary`` :ref:`[ref] <online dictionary>`
+ - ``online_currency`` :ref:`[ref] <online currency>`
+ - ``online_url_search`` :ref:`[ref] <online url search>`
+ ======================= =========== ========================================================
+
+.. _engine settings:
+
+Engine ``settings.yml``
+-----------------------
+
+For a more detailed description, see :ref:`settings engine` in the :ref:`settings.yml`.
+
+.. table:: Common options in the engine setup (``settings.yml``)
+ :width: 100%
+
+ ======================= =========== ==================================================
+ argument type information
+ ======================= =========== ==================================================
+ name string name of search-engine
+ engine string name of searxng-engine (file name without ``.py``)
+ enable_http bool enable HTTP (by default only HTTPS is enabled).
+ shortcut string shortcut of search-engine
+ timeout string specific timeout for search-engine
+ display_error_messages boolean display error messages on the web UI
+ proxies dict set proxies for a specific engine
+ (e.g. ``proxies : {http: socks5://proxy:port,
+ https: socks5://proxy:port}``)
+ ======================= =========== ==================================================
+
+.. _engine overrides:
+
+Overrides
+---------
+
+A few of the options have default values in the namespace of the engine's python
+module, but are often overwritten by the settings. If ``None`` is assigned to an
+option in the engine file, it has to be redefined in the settings, otherwise
+SearXNG will not start with that engine (global names with a leading underline can
+be ``None``).
+
+Here is an very simple example of the global names in the namespace of engine's
+module:
+
+.. code:: python
+
+ # engine dependent config
+ categories = ['general']
+ paging = True
+ _non_overwritten_global = 'foo'
+
+
+.. table:: The naming of overrides is arbitrary / recommended overrides are:
+ :width: 100%
+
+ ======================= =========== ===========================================
+ argument type information
+ ======================= =========== ===========================================
+ base_url string base-url, can be overwritten to use same
+ engine on other URL
+ number_of_results int maximum number of results per request
+ language string ISO code of language and country like en_US
+ api_key string api-key if required by engine
+ ======================= =========== ===========================================
+
+.. _engine request:
+
+Making a Request
+================
+
+To perform a search an URL have to be specified. In addition to specifying an
+URL, arguments can be passed to the query.
+
+.. _engine request arguments:
+
+Passed Arguments (request)
+--------------------------
+
+These arguments can be used to construct the search query. Furthermore,
+parameters with default value can be redefined for special purposes.
+
+.. _engine request online:
+
+.. table:: If the ``engine_type`` is :py:obj:`online
+ <searx.search.processors.online.OnlineProcessor.get_params>`
+ :width: 100%
+
+ ====================== ============== ========================================================================
+ argument type default-value, information
+ ====================== ============== ========================================================================
+ url str ``''``
+ method str ``'GET'``
+ headers set ``{}``
+ data set ``{}``
+ cookies set ``{}``
+ verify bool ``True``
+ headers.User-Agent str a random User-Agent
+ category str current category, like ``'general'``
+ safesearch int ``0``, between ``0`` and ``2`` (normal, moderate, strict)
+ time_range Optional[str] ``None``, can be ``day``, ``week``, ``month``, ``year``
+ pageno int current pagenumber
+ searxng_locale str SearXNG's locale selected by user. Specific language code like
+ ``'en'``, ``'en-US'``, or ``'all'`` if unspecified.
+ ====================== ============== ========================================================================
+
+
+.. _engine request online_dictionary:
+
+.. table:: If the ``engine_type`` is :py:obj:`online_dictionary
+ <searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params>`,
+ in addition to the :ref:`online <engine request online>` arguments:
+ :width: 100%
+
+ ====================== ============== ========================================================================
+ argument type default-value, information
+ ====================== ============== ========================================================================
+ from_lang str specific language code like ``'en_US'``
+ to_lang str specific language code like ``'en_US'``
+ query str the text query without the languages
+ ====================== ============== ========================================================================
+
+.. _engine request online_currency:
+
+.. table:: If the ``engine_type`` is :py:obj:`online_currency
+ <searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params>`,
+ in addition to the :ref:`online <engine request online>` arguments:
+ :width: 100%
+
+ ====================== ============== ========================================================================
+ argument type default-value, information
+ ====================== ============== ========================================================================
+ amount float the amount to convert
+ from str ISO 4217 code
+ to str ISO 4217 code
+ from_name str currency name
+ to_name str currency name
+ ====================== ============== ========================================================================
+
+.. _engine request online_url_search:
+
+.. table:: If the ``engine_type`` is :py:obj:`online_url_search
+ <searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params>`,
+ in addition to the :ref:`online <engine request online>` arguments:
+ :width: 100%
+
+ ====================== ============== ========================================================================
+ argument type default-value, information
+ ====================== ============== ========================================================================
+ search_url dict URLs from the search query:
+
+ .. code:: python
+
+ {
+ 'http': str,
+ 'ftp': str,
+ 'data:image': str
+ }
+ ====================== ============== ========================================================================
+
+Specify Request
+---------------
+
+The function :py:func:`def request(query, params):
+<searx.engines.demo_online.request>` always returns the ``params`` variable, the
+following parameters can be used to specify a search request:
+
+.. table::
+ :width: 100%
+
+ =================== =========== ==========================================================================
+ argument type information
+ =================== =========== ==========================================================================
+ url str requested url
+ method str HTTP request method
+ headers set HTTP header information
+ data set HTTP data information
+ cookies set HTTP cookies
+ verify bool Performing SSL-Validity check
+ allow_redirects bool Follow redirects
+ max_redirects int maximum redirects, hard limit
+ soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
+ raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
+ =================== =========== ==========================================================================
+
+
+.. _engine results:
+.. _engine media types:
+
+Result Types (``template``)
+===========================
+
+Each result item of an engine can be of different media-types. Currently the
+following media-types are supported. To set another media-type as
+:ref:`template default`, the parameter ``template`` must be set to the desired
+type.
+
+.. _template default:
+
+``default``
+-----------
+
+.. table:: Parameter of the **default** media type:
+ :width: 100%
+
+ ========================= =====================================================
+ result-parameter information
+ ========================= =====================================================
+ url string, url of the result
+ title string, title of the result
+ content string, general result-text
+ publishedDate :py:class:`datetime.datetime`, time of publish
+ ========================= =====================================================
+
+
+.. _template images:
+
+``images``
+----------
+
+.. list-table:: Parameter of the **images** media type
+ :header-rows: 2
+ :width: 100%
+
+ * - result-parameter
+ - Python type
+ - information
+
+ * - template
+ - :py:class:`str`
+ - is set to ``images.html``
+
+ * - url
+ - :py:class:`str`
+ - url to the result site
+
+ * - title
+ - :py:class:`str`
+ - title of the result
+
+ * - content
+ - :py:class:`str`
+ - description of the image
+
+ * - publishedDate
+ - :py:class:`datetime <datetime.datetime>`
+ - time of publish
+
+ * - img_src
+ - :py:class:`str`
+ - url to the result image
+
+ * - thumbnail_src
+ - :py:class:`str`
+ - url to a small-preview image
+
+ * - resolution
+ - :py:class:`str`
+ - the resolution of the image (e.g. ``1920 x 1080`` pixel)
+
+ * - img_format
+ - :py:class:`str`
+ - the format of the image (e.g. ``png``)
+
+ * - filesize
+ - :py:class:`str`
+ - size of bytes in :py:obj:`human readable <searx.humanize_bytes>` notation
+ (e.g. ``MB`` for 1024 \* 1024 Bytes filesize).
+
+
+.. _template videos:
+
+``videos``
+----------
+
+.. table:: Parameter of the **videos** media type:
+ :width: 100%
+
+ ========================= =====================================================
+ result-parameter information
+ ------------------------- -----------------------------------------------------
+ template is set to ``videos.html``
+ ========================= =====================================================
+ url string, url of the result
+ title string, title of the result
+ content *(not implemented yet)*
+ publishedDate :py:class:`datetime.datetime`, time of publish
+ thumbnail string, url to a small-preview image
+ ========================= =====================================================
+
+
+.. _template torrent:
+
+``torrent``
+-----------
+
+.. _magnetlink: https://en.wikipedia.org/wiki/Magnet_URI_scheme
+
+.. table:: Parameter of the **torrent** media type:
+ :width: 100%
+
+ ========================= =====================================================
+ result-parameter information
+ ------------------------- -----------------------------------------------------
+ template is set to ``torrent.html``
+ ========================= =====================================================
+ url string, url of the result
+ title string, title of the result
+ content string, general result-text
+ publishedDate :py:class:`datetime.datetime`,
+ time of publish *(not implemented yet)*
+ seed int, number of seeder
+ leech int, number of leecher
+ filesize int, size of file in bytes
+ files int, number of files
+ magnetlink string, magnetlink_ of the result
+ torrentfile string, torrentfile of the result
+ ========================= =====================================================
+
+
+.. _template map:
+
+``map``
+-------
+
+.. table:: Parameter of the **map** media type:
+ :width: 100%
+
+ ========================= =====================================================
+ result-parameter information
+ ------------------------- -----------------------------------------------------
+ template is set to ``map.html``
+ ========================= =====================================================
+ url string, url of the result
+ title string, title of the result
+ content string, general result-text
+ publishedDate :py:class:`datetime.datetime`, time of publish
+ latitude latitude of result (in decimal format)
+ longitude longitude of result (in decimal format)
+ boundingbox boundingbox of result (array of 4. values
+ ``[lat-min, lat-max, lon-min, lon-max]``)
+ geojson geojson of result (https://geojson.org/)
+ osm.type type of osm-object (if OSM-Result)
+ osm.id id of osm-object (if OSM-Result)
+ address.name name of object
+ address.road street name of object
+ address.house_number house number of object
+ address.locality city, place of object
+ address.postcode postcode of object
+ address.country country of object
+ ========================= =====================================================
+
+
+.. _template paper:
+
+``paper``
+---------
+
+.. _BibTeX format: https://www.bibtex.com/g/bibtex-format/
+.. _BibTeX field types: https://en.wikipedia.org/wiki/BibTeX#Field_types
+
+.. list-table:: Parameter of the **paper** media type /
+ see `BibTeX field types`_ and `BibTeX format`_
+ :header-rows: 2
+ :width: 100%
+
+ * - result-parameter
+ - Python type
+ - information
+
+ * - template
+ - :py:class:`str`
+ - is set to ``paper.html``
+
+ * - title
+ - :py:class:`str`
+ - title of the result
+
+ * - content
+ - :py:class:`str`
+ - abstract
+
+ * - comments
+ - :py:class:`str`
+ - free text display in italic below the content
+
+ * - tags
+ - :py:class:`List <list>`\ [\ :py:class:`str`\ ]
+ - free tag list
+
+ * - publishedDate
+ - :py:class:`datetime <datetime.datetime>`
+ - last publication date
+
+ * - type
+ - :py:class:`str`
+ - short description of medium type, e.g. *book*, *pdf* or *html* ...
+
+ * - authors
+ - :py:class:`List <list>`\ [\ :py:class:`str`\ ]
+ - list of authors of the work (authors with a "s")
+
+ * - editor
+ - :py:class:`str`
+ - list of editors of a book
+
+ * - publisher
+ - :py:class:`str`
+ - name of the publisher
+
+ * - journal
+ - :py:class:`str`
+ - name of the journal or magazine the article was
+ published in
+
+ * - volume
+ - :py:class:`str`
+ - volume number
+
+ * - pages
+ - :py:class:`str`
+ - page range where the article is
+
+ * - number
+ - :py:class:`str`
+ - number of the report or the issue number for a journal article
+
+ * - doi
+ - :py:class:`str`
+ - DOI number (like ``10.1038/d41586-018-07848-2``)
+
+ * - issn
+ - :py:class:`List <list>`\ [\ :py:class:`str`\ ]
+ - ISSN number like ``1476-4687``
+
+ * - isbn
+ - :py:class:`List <list>`\ [\ :py:class:`str`\ ]
+ - ISBN number like ``9780201896831``
+
+ * - pdf_url
+ - :py:class:`str`
+ - URL to the full article, the PDF version
+
+ * - html_url
+ - :py:class:`str`
+ - URL to full article, HTML version
+
+
+.. _template packages:
+
+``packages``
+------------
+
+.. list-table:: Parameter of the **packages** media type
+ :header-rows: 2
+ :width: 100%
+
+ * - result-parameter
+ - Python type
+ - information
+
+ * - template
+ - :py:class:`str`
+ - is set to ``packages.html``
+
+ * - title
+ - :py:class:`str`
+ - title of the result
+
+ * - content
+ - :py:class:`str`
+ - abstract
+
+ * - package_name
+ - :py:class:`str`
+ - the name of the package
+
+ * - version
+ - :py:class:`str`
+ - the current version of the package
+
+ * - maintainer
+ - :py:class:`str`
+ - the maintainer or author of the project
+
+ * - publishedDate
+ - :py:class:`datetime <datetime.datetime>`
+ - date of latest update or release
+
+ * - tags
+ - :py:class:`List <list>`\ [\ :py:class:`str`\ ]
+ - free tag list
+
+ * - popularity
+ - :py:class:`str`
+ - the popularity of the package, e.g. rating or download count
+
+ * - license_name
+ - :py:class:`str`
+ - the name of the license
+
+ * - license_url
+ - :py:class:`str`
+ - the web location of a license copy
+
+ * - homepage
+ - :py:class:`str`
+ - the url of the project's homepage
+
+ * - source_code_url
+ - :py:class:`str`
+ - the location of the project's source code
diff --git a/_sources/dev/engines/enginelib.rst.txt b/_sources/dev/engines/enginelib.rst.txt
new file mode 100644
index 000000000..34e3250da
--- /dev/null
+++ b/_sources/dev/engines/enginelib.rst.txt
@@ -0,0 +1,22 @@
+.. _searx.enginelib:
+
+==============
+Engine Library
+==============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.enginelib
+ :members:
+
+.. _searx.enginelib.traits:
+
+
+Engine traits
+=============
+
+.. automodule:: searx.enginelib.traits
+ :members:
diff --git a/_sources/dev/engines/engines.rst.txt b/_sources/dev/engines/engines.rst.txt
new file mode 100644
index 000000000..0f2cb1f22
--- /dev/null
+++ b/_sources/dev/engines/engines.rst.txt
@@ -0,0 +1,9 @@
+.. _searx.engines loader:
+
+========================
+SearXNG's engines loader
+========================
+
+.. automodule:: searx.engines
+ :members:
+
diff --git a/_sources/dev/engines/index.rst.txt b/_sources/dev/engines/index.rst.txt
new file mode 100644
index 000000000..88dd874d3
--- /dev/null
+++ b/_sources/dev/engines/index.rst.txt
@@ -0,0 +1,107 @@
+.. _engine implementations:
+
+======================
+Engine Implementations
+======================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. toctree::
+ :caption: Framework Components
+ :maxdepth: 2
+
+ enginelib
+ engines
+ engine_overview
+
+
+Engine Types
+============
+
+The :py:obj:`engine_type <searx.enginelib.Engine.engine_type>` of an engine
+determines which :ref:`search processor <searx.search.processors>` is used by
+the engine.
+
+In this section a list of the engines that are documented is given, a complete
+list of the engines can be found in the source under: :origin:`searx/engines`.
+
+.. _online engines:
+
+Online Engines
+--------------
+
+.. sidebar:: info
+
+ - :py:obj:`processors.online <searx.search.processors.online>`
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ demo/demo_online
+ xpath
+ mediawiki
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ online/*
+
+.. _offline engines:
+
+Offline Engines
+---------------
+
+.. sidebar:: info
+
+ - :py:obj:`processors.offline <searx.search.processors.offline>`
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ offline_concept
+ demo/demo_offline
+ offline/*
+
+.. _online url search:
+
+Online URL Search
+-----------------
+
+.. sidebar:: info
+
+ - :py:obj:`processors.online_url_search <searx.search.processors.online_url_search>`
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ online_url_search/*
+
+.. _online currency:
+
+Online Currency
+---------------
+
+.. sidebar:: info
+
+ - :py:obj:`processors.online_currency <searx.search.processors.online_currency>`
+
+*no engine of this type is documented yet / comming soon*
+
+.. _online dictionary:
+
+Online Dictionary
+-----------------
+
+.. sidebar:: info
+
+ - :py:obj:`processors.online_dictionary <searx.search.processors.online_dictionary>`
+
+*no engine of this type is documented yet / comming soon*
diff --git a/_sources/dev/engines/mediawiki.rst.txt b/_sources/dev/engines/mediawiki.rst.txt
new file mode 100644
index 000000000..ce708f95b
--- /dev/null
+++ b/_sources/dev/engines/mediawiki.rst.txt
@@ -0,0 +1,13 @@
+.. _mediawiki engine:
+
+================
+MediaWiki Engine
+================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.mediawiki
+ :members:
diff --git a/_sources/dev/engines/offline/command-line-engines.rst.txt b/_sources/dev/engines/offline/command-line-engines.rst.txt
new file mode 100644
index 000000000..0a80d698e
--- /dev/null
+++ b/_sources/dev/engines/offline/command-line-engines.rst.txt
@@ -0,0 +1,23 @@
+.. _engine command:
+
+====================
+Command Line Engines
+====================
+
+.. sidebar:: info
+
+ - :origin:`command.py <searx/engines/command.py>`
+ - :ref:`offline engines`
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. sidebar:: info
+
+ Initial sponsored by `Search and Discovery Fund
+ <https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
+
+.. automodule:: searx.engines.command
+ :members:
diff --git a/_sources/dev/engines/offline/nosql-engines.rst.txt b/_sources/dev/engines/offline/nosql-engines.rst.txt
new file mode 100644
index 000000000..76f5cfb61
--- /dev/null
+++ b/_sources/dev/engines/offline/nosql-engines.rst.txt
@@ -0,0 +1,97 @@
+.. _nosql engines:
+
+===============
+NoSQL databases
+===============
+
+.. sidebar:: further read
+
+ - `NoSQL databases <https://en.wikipedia.org/wiki/NoSQL>`_
+ - `redis.io <https://redis.io/>`_
+ - `MongoDB <https://www.mongodb.com>`_
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. sidebar:: info
+
+ Initial sponsored by `Search and Discovery Fund
+ <https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
+
+The following `NoSQL databases`_ are supported:
+
+- :ref:`engine redis_server`
+- :ref:`engine mongodb`
+
+All of the engines above are just commented out in the :origin:`settings.yml
+<searx/settings.yml>`, as you have to set various options and install
+dependencies before using them.
+
+By default, the engines use the ``key-value`` template for displaying results /
+see :origin:`simple <searx/templates/simple/result_templates/key-value.html>`
+theme. If you are not satisfied with the original result layout, you can use
+your own template, set ``result_template`` attribute to ``{template_name}`` and
+place the templates at::
+
+ searx/templates/{theme_name}/result_templates/{template_name}
+
+Furthermore, if you do not wish to expose these engines on a public instance, you
+can still add them and limit the access by setting ``tokens`` as described in
+section :ref:`private engines`.
+
+
+Extra Dependencies
+==================
+
+For using :ref:`engine redis_server` or :ref:`engine mongodb` you need to
+install additional packages in Python's Virtual Environment of your SearXNG
+instance. To switch into the environment (:ref:`searxng-src`) you can use
+:ref:`searxng.sh`::
+
+ $ sudo utils/searxng.sh instance cmd bash
+ (searxng-pyenv)$ pip install ...
+
+
+Configure the engines
+=====================
+
+`NoSQL databases`_ are used for storing arbitrary data without first defining
+their structure.
+
+
+.. _engine redis_server:
+
+Redis Server
+------------
+
+.. _redis: https://github.com/andymccurdy/redis-py#installation
+
+.. sidebar:: info
+
+ - ``pip install`` redis_
+ - redis.io_
+ - :origin:`redis_server.py <searx/engines/redis_server.py>`
+
+.. automodule:: searx.engines.redis_server
+ :members:
+
+
+.. _engine mongodb:
+
+MongoDB
+-------
+
+.. _pymongo: https://github.com/mongodb/mongo-python-driver#installation
+
+.. sidebar:: info
+
+ - ``pip install`` pymongo_
+ - MongoDB_
+ - :origin:`mongodb.py <searx/engines/mongodb.py>`
+
+
+.. automodule:: searx.engines.mongodb
+ :members:
+
diff --git a/_sources/dev/engines/offline/search-indexer-engines.rst.txt b/_sources/dev/engines/offline/search-indexer-engines.rst.txt
new file mode 100644
index 000000000..fa92798cb
--- /dev/null
+++ b/_sources/dev/engines/offline/search-indexer-engines.rst.txt
@@ -0,0 +1,62 @@
+=================
+Local Search APIs
+=================
+
+.. sidebar:: further read
+
+ - `Comparison to alternatives
+ <https://docs.meilisearch.com/learn/what_is_meilisearch/comparison_to_alternatives.html>`_
+
+.. contents::
+ :depth: 1
+ :local:
+ :backlinks: entry
+
+.. sidebar:: info
+
+ Initial sponsored by `Search and Discovery Fund
+ <https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
+
+Administrators might find themselves wanting to integrate locally running search
+engines. The following ones are supported for now:
+
+* `Elasticsearch`_
+* `Meilisearch`_
+* `Solr`_
+
+Each search engine is powerful, capable of full-text search. All of the engines
+above are added to ``settings.yml`` just commented out, as you have to
+``base_url`` for all them.
+
+Please note that if you are not using HTTPS to access these engines, you have to
+enable HTTP requests by setting ``enable_http`` to ``True``.
+
+Furthermore, if you do not want to expose these engines on a public instance,
+you can still add them and limit the access by setting ``tokens`` as described
+in section :ref:`private engines`.
+
+.. _engine meilisearch:
+
+MeiliSearch
+===========
+
+.. automodule:: searx.engines.meilisearch
+ :members:
+
+
+.. _engine elasticsearch:
+
+Elasticsearch
+=============
+
+.. automodule:: searx.engines.elasticsearch
+ :members:
+
+.. _engine solr:
+
+Solr
+====
+
+.. automodule:: searx.engines.solr
+ :members:
+
diff --git a/_sources/dev/engines/offline/sql-engines.rst.txt b/_sources/dev/engines/offline/sql-engines.rst.txt
new file mode 100644
index 000000000..f0f5add0b
--- /dev/null
+++ b/_sources/dev/engines/offline/sql-engines.rst.txt
@@ -0,0 +1,121 @@
+.. _sql engines:
+
+===========
+SQL Engines
+===========
+
+.. sidebar:: further read
+
+ - `SQLite <https://www.sqlite.org/index.html>`_
+ - `PostgreSQL <https://www.postgresql.org>`_
+ - `MySQL <https://www.mysql.com>`_
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. sidebar:: info
+
+ Initial sponsored by `Search and Discovery Fund
+ <https://nlnet.nl/discovery>`_ of `NLnet Foundation <https://nlnet.nl/>`_.
+
+With the *SQL engines* you can bind SQL databases into SearXNG. The following
+Relational Database Management System (RDBMS) are supported:
+
+- :ref:`engine sqlite`
+- :ref:`engine postgresql`
+- :ref:`engine mysql_server`
+
+All of the engines above are just commented out in the :origin:`settings.yml
+<searx/settings.yml>`, as you have to set the required attributes for the
+engines, e.g. ``database:`` ...
+
+.. code:: yaml
+
+ - name: ...
+ engine: {sqlite|postgresql|mysql_server}
+ database: ...
+ result_template: {template_name}
+ query_str: ...
+
+By default, the engines use the ``key-value`` template for displaying results /
+see :origin:`simple <searx/templates/simple/result_templates/key-value.html>`
+theme. If you are not satisfied with the original result layout, you can use
+your own template, set ``result_template`` attribute to ``{template_name}`` and
+place the templates at::
+
+ searx/templates/{theme_name}/result_templates/{template_name}
+
+If you do not wish to expose these engines on a public instance, you can still
+add them and limit the access by setting ``tokens`` as described in section
+:ref:`private engines`.
+
+
+Extra Dependencies
+==================
+
+For using :ref:`engine postgresql` or :ref:`engine mysql_server` you need to
+install additional packages in Python's Virtual Environment of your SearXNG
+instance. To switch into the environment (:ref:`searxng-src`) you can use
+:ref:`searxng.sh`::
+
+ $ sudo utils/searxng.sh instance cmd bash
+ (searxng-pyenv)$ pip install ...
+
+
+Configure the engines
+=====================
+
+The configuration of the new database engines are similar. You must put a valid
+SQL-SELECT query in ``query_str``. At the moment you can only bind at most one
+parameter in your query. By setting the attribute ``limit`` you can define how
+many results you want from the SQL server. Basically, it is the same as the
+``LIMIT`` keyword in SQL.
+
+Please, do not include ``LIMIT`` or ``OFFSET`` in your SQL query as the engines
+rely on these keywords during paging. If you want to configure the number of
+returned results use the option ``limit``.
+
+.. _engine sqlite:
+
+SQLite
+------
+
+.. sidebar:: info
+
+ - :origin:`sqlite.py <searx/engines/sqlite.py>`
+
+.. automodule:: searx.engines.sqlite
+ :members:
+
+
+.. _engine postgresql:
+
+PostgreSQL
+----------
+
+.. _psycopg2: https://www.psycopg.org/install
+
+.. sidebar:: info
+
+ - :origin:`postgresql.py <searx/engines/postgresql.py>`
+ - ``pip install`` `psycopg2-binary <psycopg2>`_
+
+.. automodule:: searx.engines.postgresql
+ :members:
+
+.. _engine mysql_server:
+
+MySQL
+-----
+
+.. sidebar:: info
+
+ - :origin:`mysql_server.py <searx/engines/mysql_server.py>`
+ - ``pip install`` :pypi:`mysql-connector-python <mysql-connector-python>`
+
+
+.. automodule:: searx.engines.mysql_server
+ :members:
+
diff --git a/_sources/dev/engines/offline_concept.rst.txt b/_sources/dev/engines/offline_concept.rst.txt
new file mode 100644
index 000000000..ddb34fc60
--- /dev/null
+++ b/_sources/dev/engines/offline_concept.rst.txt
@@ -0,0 +1,69 @@
+===============
+Offline Concept
+===============
+
+.. sidebar:: offline engines
+
+ - :ref:`demo offline engine`
+ - :ref:`engine command`
+ - :ref:`sql engines`
+ - :ref:`nosql engines`
+ - :py:obj:`searx.search.processors.offline`
+
+To extend the functionality of SearXNG, offline engines are going to be
+introduced. An offline engine is an engine which does not need Internet
+connection to perform a search and does not use HTTP to communicate.
+
+Offline engines can be configured, by adding those to the `engines` list of
+:origin:`settings.yml <searx/settings.yml>`. An example skeleton for offline
+engines can be found in :ref:`demo offline engine` (:origin:`demo_offline.py
+<searx/engines/demo_offline.py>`).
+
+
+Programming Interface
+=====================
+
+:py:func:`init(engine_settings=None) <searx.engines.demo_offline.init>`
+ All offline engines can have their own init function to setup the engine before
+ accepting requests. The function gets the settings from settings.yml as a
+ parameter. This function can be omitted, if there is no need to setup anything
+ in advance.
+
+:py:func:`search(query, params) <searx.engines.demo_offline.searc>`
+ Each offline engine has a function named ``search``. This function is
+ responsible to perform a search and return the results in a presentable
+ format. (Where *presentable* means presentable by the selected result
+ template.)
+
+ The return value is a list of results retrieved by the engine.
+
+Engine representation in ``/config``
+ If an engine is offline, the attribute ``offline`` is set to ``True``.
+
+.. _offline requirements:
+
+Extra Dependencies
+==================
+
+If an offline engine depends on an external tool, SearXNG does not install it by
+default. When an administrator configures such engine and starts the instance,
+the process returns an error with the list of missing dependencies. Also,
+required dependencies will be added to the comment/description of the engine, so
+admins can install packages in advance.
+
+If there is a need to install additional packages in *Python's Virtual
+Environment* of your SearXNG instance you need to switch into the environment
+(:ref:`searxng-src`) first, for this you can use :ref:`searxng.sh`::
+
+ $ sudo utils/searxng.sh instance cmd bash
+ (searxng-pyenv)$ pip install ...
+
+
+Private engines (Security)
+==========================
+
+To limit the access to offline engines, if an instance is available publicly,
+administrators can set token(s) for each of the :ref:`private engines`. If a
+query contains a valid token, then SearXNG performs the requested private
+search. If not, requests from an offline engines return errors.
+
diff --git a/_sources/dev/engines/online/annas_archive.rst.txt b/_sources/dev/engines/online/annas_archive.rst.txt
new file mode 100644
index 000000000..db88e5069
--- /dev/null
+++ b/_sources/dev/engines/online/annas_archive.rst.txt
@@ -0,0 +1,13 @@
+.. _annas_archive engine:
+
+==============
+Anna's Archive
+==============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.annas_archive
+ :members:
diff --git a/_sources/dev/engines/online/archlinux.rst.txt b/_sources/dev/engines/online/archlinux.rst.txt
new file mode 100644
index 000000000..834fffa43
--- /dev/null
+++ b/_sources/dev/engines/online/archlinux.rst.txt
@@ -0,0 +1,14 @@
+.. _archlinux engine:
+
+==========
+Arch Linux
+==========
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.archlinux
+ :members:
+
diff --git a/_sources/dev/engines/online/bing.rst.txt b/_sources/dev/engines/online/bing.rst.txt
new file mode 100644
index 000000000..19c31aa80
--- /dev/null
+++ b/_sources/dev/engines/online/bing.rst.txt
@@ -0,0 +1,43 @@
+.. _bing engines:
+
+============
+Bing Engines
+============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _bing web engine:
+
+Bing WEB
+========
+
+.. automodule:: searx.engines.bing
+ :members:
+
+.. _bing images engine:
+
+Bing Images
+===========
+
+.. automodule:: searx.engines.bing_images
+ :members:
+
+.. _bing videos engine:
+
+Bing Videos
+===========
+
+.. automodule:: searx.engines.bing_videos
+ :members:
+
+.. _bing news engine:
+
+Bing News
+=========
+
+.. automodule:: searx.engines.bing_news
+ :members:
diff --git a/_sources/dev/engines/online/bpb.rst.txt b/_sources/dev/engines/online/bpb.rst.txt
new file mode 100644
index 000000000..f545dba48
--- /dev/null
+++ b/_sources/dev/engines/online/bpb.rst.txt
@@ -0,0 +1,13 @@
+.. _bpb engine:
+
+===
+Bpb
+===
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.bpb
+ :members:
diff --git a/_sources/dev/engines/online/brave.rst.txt b/_sources/dev/engines/online/brave.rst.txt
new file mode 100644
index 000000000..a1c589b9d
--- /dev/null
+++ b/_sources/dev/engines/online/brave.rst.txt
@@ -0,0 +1,13 @@
+.. _brave engine:
+
+=============
+Brave Engines
+=============
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.brave
+ :members:
diff --git a/_sources/dev/engines/online/bt4g.rst.txt b/_sources/dev/engines/online/bt4g.rst.txt
new file mode 100644
index 000000000..980665204
--- /dev/null
+++ b/_sources/dev/engines/online/bt4g.rst.txt
@@ -0,0 +1,14 @@
+.. _bt4g engine:
+
+====
+BT4G
+====
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.bt4g
+ :members:
+
diff --git a/_sources/dev/engines/online/dailymotion.rst.txt b/_sources/dev/engines/online/dailymotion.rst.txt
new file mode 100644
index 000000000..c661172e5
--- /dev/null
+++ b/_sources/dev/engines/online/dailymotion.rst.txt
@@ -0,0 +1,13 @@
+.. _dailymotion engine:
+
+===========
+Dailymotion
+===========
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.dailymotion
+ :members:
diff --git a/_sources/dev/engines/online/duckduckgo.rst.txt b/_sources/dev/engines/online/duckduckgo.rst.txt
new file mode 100644
index 000000000..0f1258ff9
--- /dev/null
+++ b/_sources/dev/engines/online/duckduckgo.rst.txt
@@ -0,0 +1,22 @@
+.. _duckduckgo engines:
+
+==================
+DuckDuckGo Engines
+==================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.duckduckgo
+ :members:
+
+.. automodule:: searx.engines.duckduckgo_extra
+ :members:
+
+.. automodule:: searx.engines.duckduckgo_definitions
+ :members:
+
+.. automodule:: searx.engines.duckduckgo_weather
+ :members:
diff --git a/_sources/dev/engines/online/google.rst.txt b/_sources/dev/engines/online/google.rst.txt
new file mode 100644
index 000000000..9085070bd
--- /dev/null
+++ b/_sources/dev/engines/online/google.rst.txt
@@ -0,0 +1,76 @@
+.. _google engines:
+
+==============
+Google Engines
+==============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _google API:
+
+Google API
+==========
+
+.. _Query Parameter Definitions:
+ https://developers.google.com/custom-search/docs/xml_results#WebSearch_Query_Parameter_Definitions
+
+SearXNG's implementation of the Google API is mainly done in
+:py:obj:`get_google_info <searx.engines.google.get_google_info>`.
+
+For detailed description of the *REST-full* API see: `Query Parameter
+Definitions`_. The linked API documentation can sometimes be helpful during
+reverse engineering. However, we cannot use it in the freely accessible WEB
+services; not all parameters can be applied and some engines are more *special*
+than other (e.g. :ref:`google news engine`).
+
+
+.. _google web engine:
+
+Google WEB
+==========
+
+.. automodule:: searx.engines.google
+ :members:
+
+.. _google autocomplete:
+
+Google Autocomplete
+====================
+
+.. autofunction:: searx.autocomplete.google_complete
+
+.. _google images engine:
+
+Google Images
+=============
+
+.. automodule:: searx.engines.google_images
+ :members:
+
+.. _google videos engine:
+
+Google Videos
+=============
+
+.. automodule:: searx.engines.google_videos
+ :members:
+
+.. _google news engine:
+
+Google News
+===========
+
+.. automodule:: searx.engines.google_news
+ :members:
+
+.. _google scholar engine:
+
+Google Scholar
+==============
+
+.. automodule:: searx.engines.google_scholar
+ :members:
diff --git a/_sources/dev/engines/online/lemmy.rst.txt b/_sources/dev/engines/online/lemmy.rst.txt
new file mode 100644
index 000000000..584246fd1
--- /dev/null
+++ b/_sources/dev/engines/online/lemmy.rst.txt
@@ -0,0 +1,13 @@
+.. _lemmy engine:
+
+=====
+Lemmy
+=====
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.lemmy
+ :members:
diff --git a/_sources/dev/engines/online/loc.rst.txt b/_sources/dev/engines/online/loc.rst.txt
new file mode 100644
index 000000000..2ed76cd81
--- /dev/null
+++ b/_sources/dev/engines/online/loc.rst.txt
@@ -0,0 +1,13 @@
+.. _loc engine:
+
+===================
+Library of Congress
+===================
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.loc
+ :members:
diff --git a/_sources/dev/engines/online/mastodon.rst.txt b/_sources/dev/engines/online/mastodon.rst.txt
new file mode 100644
index 000000000..dc372f121
--- /dev/null
+++ b/_sources/dev/engines/online/mastodon.rst.txt
@@ -0,0 +1,13 @@
+.. _mastodon engine:
+
+========
+Mastodon
+========
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.mastodon
+ :members:
diff --git a/_sources/dev/engines/online/moviepilot.rst.txt b/_sources/dev/engines/online/moviepilot.rst.txt
new file mode 100644
index 000000000..ba35574e5
--- /dev/null
+++ b/_sources/dev/engines/online/moviepilot.rst.txt
@@ -0,0 +1,13 @@
+.. _moviepilot engine:
+
+==========
+Moviepilot
+==========
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.moviepilot
+ :members:
diff --git a/_sources/dev/engines/online/mrs.rst.txt b/_sources/dev/engines/online/mrs.rst.txt
new file mode 100644
index 000000000..671f35ea5
--- /dev/null
+++ b/_sources/dev/engines/online/mrs.rst.txt
@@ -0,0 +1,13 @@
+.. _mrs engine:
+
+=========================
+Matrix Rooms Search (MRS)
+=========================
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.mrs
+ :members:
diff --git a/_sources/dev/engines/online/mullvad_leta.rst.txt b/_sources/dev/engines/online/mullvad_leta.rst.txt
new file mode 100644
index 000000000..63aef019b
--- /dev/null
+++ b/_sources/dev/engines/online/mullvad_leta.rst.txt
@@ -0,0 +1,13 @@
+.. _voidlinux mullvad_leta:
+
+============
+Mullvad-Leta
+============
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.mullvad_leta
+ :members:
diff --git a/_sources/dev/engines/online/mwmbl.rst.txt b/_sources/dev/engines/online/mwmbl.rst.txt
new file mode 100644
index 000000000..8eac7d7c5
--- /dev/null
+++ b/_sources/dev/engines/online/mwmbl.rst.txt
@@ -0,0 +1,27 @@
+.. _Mwmbl engine:
+
+============
+Mwmbl Engine
+============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _mwmbl web engine:
+
+Mwmbl WEB
+=========
+
+.. automodule:: searx.engines.mwmbl
+ :members:
+
+
+.. _mwmbl autocomplete:
+
+Mwmbl Autocomplete
+==================
+
+.. autofunction:: searx.autocomplete.mwmbl
diff --git a/_sources/dev/engines/online/odysee.rst.txt b/_sources/dev/engines/online/odysee.rst.txt
new file mode 100644
index 000000000..75be1ad11
--- /dev/null
+++ b/_sources/dev/engines/online/odysee.rst.txt
@@ -0,0 +1,13 @@
+.. _odysee engine:
+
+======
+Odysee
+======
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.odysee
+ :members:
diff --git a/_sources/dev/engines/online/peertube.rst.txt b/_sources/dev/engines/online/peertube.rst.txt
new file mode 100644
index 000000000..bedf055fb
--- /dev/null
+++ b/_sources/dev/engines/online/peertube.rst.txt
@@ -0,0 +1,27 @@
+.. _peertube engines:
+
+================
+Peertube Engines
+================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _peertube video engine:
+
+Peertube Video
+==============
+
+.. automodule:: searx.engines.peertube
+ :members:
+
+.. _sepiasearch engine:
+
+SepiaSearch
+===========
+
+.. automodule:: searx.engines.sepiasearch
+ :members:
diff --git a/_sources/dev/engines/online/piped.rst.txt b/_sources/dev/engines/online/piped.rst.txt
new file mode 100644
index 000000000..822981056
--- /dev/null
+++ b/_sources/dev/engines/online/piped.rst.txt
@@ -0,0 +1,13 @@
+.. _piped engine:
+
+=====
+Piped
+=====
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.piped
+ :members:
diff --git a/_sources/dev/engines/online/presearch.rst.txt b/_sources/dev/engines/online/presearch.rst.txt
new file mode 100644
index 000000000..59332c354
--- /dev/null
+++ b/_sources/dev/engines/online/presearch.rst.txt
@@ -0,0 +1,13 @@
+.. _engine presearch:
+
+================
+Presearch Engine
+================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.presearch
+ :members:
diff --git a/_sources/dev/engines/online/qwant.rst.txt b/_sources/dev/engines/online/qwant.rst.txt
new file mode 100644
index 000000000..66ad302d1
--- /dev/null
+++ b/_sources/dev/engines/online/qwant.rst.txt
@@ -0,0 +1,13 @@
+.. _qwant engine:
+
+=====
+Qwant
+=====
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.qwant
+ :members:
diff --git a/_sources/dev/engines/online/radio_browser.rst.txt b/_sources/dev/engines/online/radio_browser.rst.txt
new file mode 100644
index 000000000..a150e59c5
--- /dev/null
+++ b/_sources/dev/engines/online/radio_browser.rst.txt
@@ -0,0 +1,13 @@
+.. _RadioBrowser engine:
+
+============
+RadioBrowser
+============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.radio_browser
+ :members:
diff --git a/_sources/dev/engines/online/recoll.rst.txt b/_sources/dev/engines/online/recoll.rst.txt
new file mode 100644
index 000000000..2f1a1e4df
--- /dev/null
+++ b/_sources/dev/engines/online/recoll.rst.txt
@@ -0,0 +1,13 @@
+.. _engine recoll:
+
+=============
+Recoll Engine
+=============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.recoll
+ :members:
diff --git a/_sources/dev/engines/online/seekr.rst.txt b/_sources/dev/engines/online/seekr.rst.txt
new file mode 100644
index 000000000..fcbc7bf82
--- /dev/null
+++ b/_sources/dev/engines/online/seekr.rst.txt
@@ -0,0 +1,13 @@
+.. _seekr engine:
+
+=============
+Seekr Engines
+=============
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.seekr
+ :members:
diff --git a/_sources/dev/engines/online/startpage.rst.txt b/_sources/dev/engines/online/startpage.rst.txt
new file mode 100644
index 000000000..89e3ad10b
--- /dev/null
+++ b/_sources/dev/engines/online/startpage.rst.txt
@@ -0,0 +1,13 @@
+.. _startpage engines:
+
+=================
+Startpage Engines
+=================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.startpage
+ :members:
diff --git a/_sources/dev/engines/online/tagesschau.rst.txt b/_sources/dev/engines/online/tagesschau.rst.txt
new file mode 100644
index 000000000..f850bf99b
--- /dev/null
+++ b/_sources/dev/engines/online/tagesschau.rst.txt
@@ -0,0 +1,13 @@
+.. _tagesschau engine:
+
+==============
+Tagesschau API
+==============
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.tagesschau
+ :members:
diff --git a/_sources/dev/engines/online/torznab.rst.txt b/_sources/dev/engines/online/torznab.rst.txt
new file mode 100644
index 000000000..9056b60d0
--- /dev/null
+++ b/_sources/dev/engines/online/torznab.rst.txt
@@ -0,0 +1,13 @@
+.. _torznab engine:
+
+==============
+Torznab WebAPI
+==============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.torznab
+ :members:
diff --git a/_sources/dev/engines/online/void.rst.txt b/_sources/dev/engines/online/void.rst.txt
new file mode 100644
index 000000000..a1839d4f2
--- /dev/null
+++ b/_sources/dev/engines/online/void.rst.txt
@@ -0,0 +1,13 @@
+.. _voidlinux engine:
+
+==========================
+Void Linux binary packages
+==========================
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.voidlinux
+ :members:
diff --git a/_sources/dev/engines/online/wallhaven.rst.txt b/_sources/dev/engines/online/wallhaven.rst.txt
new file mode 100644
index 000000000..b473293ca
--- /dev/null
+++ b/_sources/dev/engines/online/wallhaven.rst.txt
@@ -0,0 +1,13 @@
+.. _wallhaven engine:
+
+=========
+Wallhaven
+=========
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.wallhaven
+ :members:
diff --git a/_sources/dev/engines/online/wikipedia.rst.txt b/_sources/dev/engines/online/wikipedia.rst.txt
new file mode 100644
index 000000000..d4920f0f6
--- /dev/null
+++ b/_sources/dev/engines/online/wikipedia.rst.txt
@@ -0,0 +1,27 @@
+.. _wikimedia engines:
+
+=========
+Wikimedia
+=========
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _wikipedia engine:
+
+Wikipedia
+=========
+
+.. automodule:: searx.engines.wikipedia
+ :members:
+
+.. _wikidata engine:
+
+Wikidata
+=========
+
+.. automodule:: searx.engines.wikidata
+ :members:
diff --git a/_sources/dev/engines/online/yacy.rst.txt b/_sources/dev/engines/online/yacy.rst.txt
new file mode 100644
index 000000000..9407aca80
--- /dev/null
+++ b/_sources/dev/engines/online/yacy.rst.txt
@@ -0,0 +1,13 @@
+.. _yacy engine:
+
+====
+Yacy
+====
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.yacy
+ :members:
diff --git a/_sources/dev/engines/online/yahoo.rst.txt b/_sources/dev/engines/online/yahoo.rst.txt
new file mode 100644
index 000000000..96c1e2774
--- /dev/null
+++ b/_sources/dev/engines/online/yahoo.rst.txt
@@ -0,0 +1,13 @@
+.. _yahoo engine:
+
+============
+Yahoo Engine
+============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.yahoo
+ :members:
diff --git a/_sources/dev/engines/online/zlibrary.rst.txt b/_sources/dev/engines/online/zlibrary.rst.txt
new file mode 100644
index 000000000..fb197abff
--- /dev/null
+++ b/_sources/dev/engines/online/zlibrary.rst.txt
@@ -0,0 +1,13 @@
+.. _zlibrary engine:
+
+=========
+Z-Library
+=========
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.zlibrary
+ :members:
diff --git a/_sources/dev/engines/online_url_search/tineye.rst.txt b/_sources/dev/engines/online_url_search/tineye.rst.txt
new file mode 100644
index 000000000..3f4db7e0e
--- /dev/null
+++ b/_sources/dev/engines/online_url_search/tineye.rst.txt
@@ -0,0 +1,14 @@
+.. _tineye engine:
+
+======
+Tineye
+======
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.tineye
+ :members:
+
diff --git a/_sources/dev/engines/xpath.rst.txt b/_sources/dev/engines/xpath.rst.txt
new file mode 100644
index 000000000..42c4d47b6
--- /dev/null
+++ b/_sources/dev/engines/xpath.rst.txt
@@ -0,0 +1,14 @@
+.. _xpath engine:
+
+============
+XPath Engine
+============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.engines.xpath
+ :members:
+
diff --git a/_sources/dev/index.rst.txt b/_sources/dev/index.rst.txt
new file mode 100644
index 000000000..09be9de5e
--- /dev/null
+++ b/_sources/dev/index.rst.txt
@@ -0,0 +1,18 @@
+=======================
+Developer documentation
+=======================
+
+.. toctree::
+ :maxdepth: 2
+
+ quickstart
+ rtm_asdf
+ contribution_guide
+ engines/index
+ search_api
+ plugins
+ translation
+ lxcdev
+ makefile
+ reST
+ searxng_extra/index
diff --git a/_sources/dev/lxcdev.rst.txt b/_sources/dev/lxcdev.rst.txt
new file mode 100644
index 000000000..79716ae57
--- /dev/null
+++ b/_sources/dev/lxcdev.rst.txt
@@ -0,0 +1,438 @@
+.. _lxcdev:
+
+==============================
+Developing in Linux Containers
+==============================
+
+.. _LXC: https://linuxcontainers.org/lxc/introduction/
+
+In this article we will show, how you can make use of Linux Containers (LXC_) in
+*distributed and heterogeneous development cycles* (TL;DR; jump to the
+:ref:`lxcdev summary`).
+
+.. sidebar:: Audience
+
+ This blog post is written for experienced admins and developers. Readers
+ should have a serious meaning about the terms: *distributed*, *merge* and
+ *linux container*.
+
+ **hint**
+
+ If you have issues with the internet connectivity of your containers read
+ section :ref:`internet connectivity docker`.
+
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+Motivation
+==========
+
+Most often in our development cycle, we edit the sources and run some test
+and/or builds by using ``make`` :ref:`[ref] <makefile>` before we commit. This
+cycle is simple and perfect but might fail in some aspects we should not
+overlook.
+
+ **The environment in which we run all our development processes matters!**
+
+The :ref:`makefile` and the :ref:`make install` encapsulate a lot for us, but
+these tools do not have access to all prerequisites. For example, there may
+have dependencies on packages that are installed on developer's desktop, but
+usually are not preinstalled on a server or client system. Another example is;
+settings have been made to the software on developer's desktop that would never
+be set on a *production* system.
+
+ **Linux Containers are isolate environments**, we use them to not mix up all
+ the prerequisites from various projects on developer's desktop.
+
+The scripts from :ref:`searx_utils` can divide in those to install and maintain
+software
+
+- :ref:`searxng.sh`
+
+and the script
+
+- :ref:`lxc.sh`
+
+with we can scale our installation, maintenance or even development tasks over a
+stack of isolated containers / what we call the:
+
+- :ref:`searxng lxc suite`
+
+.. _lxcdev install searxng:
+
+Gentlemen, start your engines!
+==============================
+
+.. _LXD: https://linuxcontainers.org/lxd/introduction/
+.. _archlinux: https://www.archlinux.org/
+
+Before you can start with containers, you need to install and initiate LXD_
+once:
+
+.. tabs::
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ snap install lxd
+ $ lxd init --auto
+
+And you need to clone from origin or if you have your own fork, clone from your
+fork:
+
+.. tabs::
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ cd ~/Downloads
+ $ git clone https://github.com/searxng/searxng.git searxng
+ $ cd searxng
+
+.. sidebar:: The ``searxng-archlinux`` container
+
+ is the base of all our exercises here.
+
+The :ref:`lxc-searxng.env` consists of several images, see ``export
+LXC_SUITE=(...`` near by :origin:`utils/lxc-searxng.env#L19`.
+For this blog post we exercise on a archlinux_ image. The container of this
+image is named ``searxng-archlinux``.
+
+Lets build the container, but be sure that this container does not already
+exists, so first lets remove possible old one:
+
+.. tabs::
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh remove searxng-archlinux
+ $ sudo -H ./utils/lxc.sh build searxng-archlinux
+
+
+.. sidebar:: further read
+
+ - :ref:`lxc.sh install suite`
+ - :ref:`installation nginx`
+
+To install the complete :ref:`SearXNG suite <searxng lxc suite>` and the HTTP
+proxy :ref:`installation nginx` into the archlinux container run:
+
+.. tabs::
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh install suite searxng-archlinux
+ $ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
+ $ sudo ./utils/lxc.sh show suite | grep SEARXNG_URL
+ ...
+ [searxng-archlinux] SEARXNG_URL : http://n.n.n.140/searxng
+
+.. sidebar:: Fully functional SearXNG suite
+
+ From here on you have a fully functional SearXNG suite (including a
+ :ref:`redis db`).
+
+In such a SearXNG suite admins can maintain and access the debug log of the
+services quite easy.
+
+In the example above the SearXNG instance in the container is wrapped to
+``http://n.n.n.140/searxng`` to the HOST system. Note, on your HOST system, the
+IP of your ``searxng-archlinux`` container is different to this example. To
+test the instance in the container from outside of the container, in your WEB
+browser on your desktop just open the URL reported in your installation
+
+.. _working in containers:
+
+In containers, work as usual
+============================
+
+Usually you open a root-bash using ``sudo -H bash``. In case of LXC containers
+open the root-bash in the container is done by the ``./utils/lxc.sh cmd
+searxng-archlinux`` command:
+
+.. tabs::
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux bash
+ INFO: [searxng-archlinux] bash
+ [root@searxng-archlinux SearXNG]$
+
+The prompt ``[root@searxng-archlinux ...]`` signals, that you are the root user
+in the container (GUEST). To debug the running SearXNG instance use:
+
+.. tabs::
+
+ .. group-tab:: ``[root@searxng-archlinux SearXNG]`` (GUEST)
+
+ .. code:: bash
+
+ $ ./utils/searxng.sh instance inspect
+ ...
+ use [CTRL-C] to stop monitoring the log
+ ...
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searxng.sh instance inspect
+ ...
+ use [CTRL-C] to stop monitoring the log
+ ...
+
+
+Back in the browser on your desktop open the service http://n.n.n.140/searxng
+and run your application tests while the debug log is shown in the terminal from
+above. You can stop monitoring using ``CTRL-C``, this also disables the *"debug
+option"* in SearXNG's settings file and restarts the SearXNG uwsgi application.
+
+Another point we have to notice is that the service :ref:`SearXNG <searxng.sh>`
+runs under dedicated system user account with the same name (compare
+:ref:`create searxng user`). To get a login shell from these accounts, simply
+call:
+
+.. tabs::
+
+ .. group-tab:: ``[root@searxng-archlinux SearXNG]`` (GUEST)
+
+ .. code:: bash
+
+ $ ./utils/searxng.sh instance cmd bash -l
+ (searx-pyenv) [searxng@searxng-archlinux ~]$ pwd
+ /usr/local/searxng
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searxng.sh instance cmd bash -l
+ INFO: [searxng-archlinux] ./utils/searxng.sh instance cmd bash -l
+ (searx-pyenv) [searxng@searxng-archlinux ~]$ pwd
+ /usr/local/searxng
+
+The prompt ``[searxng@searxng-archlinux]`` signals that you are logged in as system
+user ``searxng`` in the ``searxng-archlinux`` container and the python *virtualenv*
+``(searxng-pyenv)`` environment is activated.
+
+
+Wrap production into developer suite
+====================================
+
+In this section we will see how to change the *"Fully functional SearXNG suite"*
+from a LXC container (which is quite ready for production) into a developer
+suite. For this, we have to keep an eye on the :ref:`installation basic`:
+
+- SearXNG setup in: ``/etc/searxng/settings.yml``
+- SearXNG user's home: ``/usr/local/searxng``
+- virtualenv in: ``/usr/local/searxng/searxng-pyenv``
+- SearXNG software in: ``/usr/local/searxng/searxng-src``
+
+With the use of the :ref:`searxng.sh` the SearXNG service was installed as
+:ref:`uWSGI application <searxng uwsgi>`. To maintain this service, we can use
+``systemctl`` (compare :ref:`uWSGI maintenance`).
+
+.. tabs::
+
+ .. group-tab:: uwsgi@searxng
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux systemctl stop uwsgi@searxng
+
+With the command above, we stopped the SearXNG uWSGI-App in the archlinux
+container.
+
+The uWSGI-App for the archlinux distros is configured in
+:origin:`utils/templates/etc/uwsgi/apps-archlinux/searxng.ini`, from where at
+least you should attend the settings of ``uid``, ``chdir``, ``env`` and
+``http``::
+
+ env = SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml
+ http = 127.0.0.1:8888
+
+ chdir = /usr/local/searxng/searxng-src/searx
+ virtualenv = /usr/local/searxng/searxng-pyenv
+ pythonpath = /usr/local/searxng/searxng-src
+
+If you have read the :ref:`Good to know` you remember, that each container
+shares the root folder of the repository and the command ``utils/lxc.sh cmd``
+handles relative path names **transparent**.
+
+To wrap the SearXNG installation in the container into a developer one, we
+simple have to create a symlink to the **transparent** repository from the
+desktop. Now lets replace the repository at ``searxng-src`` in the container
+with the working tree from outside of the container:
+
+.. tabs::
+
+ .. group-tab:: ``[root@searxng-archlinux SearXNG]`` (GUEST)
+
+ .. code:: bash
+
+ $ mv /usr/local/searxng/searxng-src /usr/local/searxng/searxng-src.old
+ $ ln -s /share/SearXNG/ /usr/local/searxng/searxng-src
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
+ mv /usr/local/searxng/searxng-src /usr/local/searxng/searxng-src.old
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux \
+ ln -s /share/SearXNG/ /usr/local/searxng/searxng-src
+
+Now we can develop as usual in the working tree of our desktop system. Every
+time the software was changed, you have to restart the SearXNG service (in the
+container):
+
+.. tabs::
+
+ .. group-tab:: uwsgi@searxng
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux systemctl restart uwsgi@searxng
+
+
+Remember: :ref:`working in containers` .. here are just some examples from my
+daily usage:
+
+To *inspect* the SearXNG instance (already described above):
+
+.. tabs::
+
+ .. group-tab:: ``[root@searxng-archlinux SearXNG]`` (GUEST)
+
+ .. code:: bash
+
+ $ ./utils/searx.sh inspect service
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searx.sh inspect service
+
+Run :ref:`makefile`, e.g. to test inside the container:
+
+.. tabs::
+
+ .. group-tab:: ``[root@searxng-archlinux SearXNG]`` (GUEST)
+
+ .. code:: bash
+
+ $ make test
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux make test
+
+
+
+To install all prerequisites needed for a :ref:`buildhosts`:
+
+.. tabs::
+
+ .. group-tab:: ``[root@searxng-archlinux SearXNG]`` (GUEST)
+
+ .. code:: bash
+
+ $ ./utils/searxng.sh install buildhost
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ./utils/searxng.sh install buildhost
+
+
+To build the docs on a buildhost :ref:`buildhosts`:
+
+.. tabs::
+
+ .. group-tab:: ``[root@searxng-archlinux SearXNG]`` (GUEST)
+
+ .. code:: bash
+
+ $ make docs.html
+
+ .. group-tab:: desktop (HOST)
+
+ .. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux make docs.html
+
+
+.. _lxcdev summary:
+
+Summary
+=======
+
+We build up a fully functional SearXNG suite in a archlinux container:
+
+.. code:: bash
+
+ $ sudo -H ./utils/lxc.sh build searxng-archlinux
+ $ sudo -H ./utils/lxc.sh install suite searxng-archlinux
+ ...
+ Developer install? (wraps source from HOST into the running instance) [YES/no]
+
+To wrap the suite into a developer one answer ``YES`` (or press Enter).
+
+.. code:: text
+
+ link SearXNG's sources to: /share/SearXNG
+ =========================================
+
+ mv -f "/usr/local/searxng/searxng-src" "/usr/local/searxng/searxng-src.backup"
+ ln -s "/share/SearXNG" "/usr/local/searxng/searxng-src"
+ ls -ld /usr/local/searxng/searxng-src
+ |searxng| lrwxrwxrwx 1 searxng searxng ... /usr/local/searxng/searxng-src -> /share/SearXNG
+
+On code modification the instance has to be restarted (see :ref:`uWSGI
+maintenance`):
+
+.. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux systemctl restart uwsgi@searxng
+
+To access HTTP from the desktop we installed nginx for the services inside the
+container:
+
+.. code:: bash
+
+ $ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
+
+To get information about the SearxNG suite in the archlinux container we can
+use:
+
+.. code:: text
+
+ $ sudo -H ./utils/lxc.sh show suite searxng-archlinux
+ [searxng-archlinux] INFO: (eth0) docs-live: http:///n.n.n.140:8080/
+ [searxng-archlinux] INFO: (eth0) IPv6: http://[fd42:555b:2af9:e121:216:3eff:fe5b:1744]
+ [searxng-archlinux] uWSGI:
+ [searxng-archlinux] SEARXNG_UWSGI_SOCKET : /usr/local/searxng/run/socket
+ [searxng-archlinux] environment /usr/local/searxng/searxng-src/utils/brand.env:
+ [searxng-archlinux] GIT_URL : https://github.com/searxng/searxng
+ [searxng-archlinux] GIT_BRANCH : master
+ [searxng-archlinux] SEARXNG_URL : http:///n.n.n.140/searxng
+ [searxng-archlinux] SEARXNG_PORT : 8888
+ [searxng-archlinux] SEARXNG_BIND_ADDRESS : 127.0.0.1
+
diff --git a/_sources/dev/makefile.rst.txt b/_sources/dev/makefile.rst.txt
new file mode 100644
index 000000000..3c3b2bf3b
--- /dev/null
+++ b/_sources/dev/makefile.rst.txt
@@ -0,0 +1,383 @@
+.. _makefile:
+
+=======================
+Makefile & ``./manage``
+=======================
+
+.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
+
+All relevant build and development tasks are implemented in the
+:origin:`./manage <manage>` script and for CI or IDE integration a small
+:origin:`Makefile` wrapper is available. If you are not familiar with
+Makefiles, we recommend to read gnu-make_ introduction.
+
+.. sidebar:: build environment
+
+ Before looking deeper at the targets, first read about :ref:`make
+ install`.
+
+ To install developer requirements follow :ref:`buildhosts`.
+
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+The usage is simple, just type ``make {target-name}`` to *build* a target.
+Calling the ``help`` target gives a first overview (``make help``):
+
+.. tabs::
+
+ .. group-tab:: ``make``
+
+ .. program-output:: bash -c "cd ..; make --no-print-directory help"
+
+
+ .. group-tab:: ``./manage``
+
+ The Makefile targets are implemented for comfort, if you can do without
+ tab-completion and need to have a more granular control, use
+ :origin:`manage` without the Makefile wrappers.
+
+ .. code:: sh
+
+ $ ./manage help
+
+.. _make install:
+
+Python environment (``make install``)
+=====================================
+
+.. sidebar:: activate environment
+
+ ``source ./local/py3/bin/activate``
+
+We do no longer need to build up the virtualenv manually. Jump into your git
+working tree and release a ``make install`` to get a virtualenv with a
+*developer install* of SearXNG (:origin:`setup.py`). ::
+
+ $ cd ~/searxng-clone
+ $ make install
+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
+ ...
+ PYENV [install] pip install -e 'searx[test]'
+ ...
+ Successfully installed searxng-2023.7.19+a446dea1b
+
+If you release ``make install`` multiple times the installation will only
+rebuild if the sha256 sum of the *requirement files* fails. With other words:
+the check fails if you edit the requirements listed in
+:origin:`requirements-dev.txt` and :origin:`requirements.txt`). ::
+
+ $ make install
+ PYENV OK
+ PYENV [virtualenv] requirements.sha256 failed
+ [virtualenv] - 6cea6eb6def9e14a18bf32f8a3e... ./requirements-dev.txt
+ [virtualenv] - 471efef6c73558e391c3adb35f4... ./requirements.txt
+ ...
+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
+ ...
+ PYENV [install] pip install -e 'searx[test]'
+ ...
+ Successfully installed searxng-2023.7.19+a446dea1b
+
+.. sidebar:: drop environment
+
+ To get rid of the existing environment before re-build use :ref:`clean target
+ <make clean>` first.
+
+If you think, something goes wrong with your ./local environment or you change
+the :origin:`setup.py` file, you have to call :ref:`make clean`.
+
+.. _make node.env:
+
+Node.js environment (``make node.env``)
+=======================================
+
+.. _Node.js: https://nodejs.org/
+.. _nvm: https://github.com/nvm-sh
+.. _npm: https://www.npmjs.com/
+
+.. jinja:: searx
+
+ Node.js_ version {{version.node}} or higher is required to build the themes.
+ If the requirement is not met, the build chain uses nvm_ (Node Version
+ Manager) to install latest LTS of Node.js_ locally: there is no need to
+ install nvm_ or npm_ on your system.
+
+To install NVM_ and Node.js_ in once you can use :ref:`make nvm.nodejs`.
+
+.. _make nvm:
+
+NVM ``make nvm.install nvm.status``
+-----------------------------------
+
+Use ``make nvm.status`` to get the current status of your Node.js_ and nvm_
+setup.
+
+.. tabs::
+
+ .. group-tab:: nvm.install
+
+ .. code:: sh
+
+ $ LANG=C make nvm.install
+ INFO: install (update) NVM at ./searxng/.nvm
+ INFO: clone: https://github.com/nvm-sh/nvm.git
+ || Cloning into './searxng/.nvm'...
+ INFO: checkout v0.39.4
+ || HEAD is now at 8fbf8ab v0.39.4
+
+ .. group-tab:: nvm.status (ubu2004)
+
+ Here is the output you will typically get on a Ubuntu 20.04 system which
+ serves only a `no longer active <https://nodejs.org/en/about/releases/>`_
+ Release `Node.js v10.19.0 <https://packages.ubuntu.com/focal/nodejs>`_.
+
+ .. code:: sh
+
+ $ make nvm.status
+ INFO: Node.js is installed at /usr/bin/node
+ INFO: Node.js is version v10.19.0
+ WARN: minimal Node.js version is 16.13.0
+ INFO: npm is installed at /usr/bin/npm
+ INFO: npm is version 6.14.4
+ WARN: NVM is not installed
+
+.. _make nvm.nodejs:
+
+``make nvm.nodejs``
+-------------------
+
+Install latest Node.js_ LTS locally (uses nvm_)::
+
+ $ make nvm.nodejs
+ INFO: install (update) NVM at /share/searxng/.nvm
+ INFO: clone: https://github.com/nvm-sh/nvm.git
+ ...
+ Downloading and installing node v16.13.0...
+ ...
+ INFO: Node.js is installed at searxng/.nvm/versions/node/v16.13.0/bin/node
+ INFO: Node.js is version v16.13.0
+ INFO: npm is installed at searxng/.nvm/versions/node/v16.13.0/bin/npm
+ INFO: npm is version 8.1.0
+ INFO: NVM is installed at searxng/.nvm
+
+.. _make run:
+
+``make run``
+============
+
+To get up a running a developer instance simply call ``make run``. This enables
+*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
+instance and opens the URL in your favorite WEB browser (:man:`xdg-open`)::
+
+ $ make run
+
+Changes to theme's HTML templates (jinja2) are instant. Changes to the CSS & JS
+sources of the theme need to be rebuild. You can do that by running::
+
+ $ make themes.all
+
+Alternatively to ``themes.all`` you can run *live builds* of the theme you are
+modify (:ref:`make themes`)::
+
+ $ LIVE_THEME=simple make run
+
+.. _make format.python:
+
+``make format.python``
+======================
+
+Format Python source code using `Black code style`_. See ``$BLACK_OPTIONS``
+and ``$BLACK_TARGETS`` in :origin:`Makefile`.
+
+.. attention::
+
+ We stuck at Black 22.12.0, please read comment in PR `Bump black from 22.12.0
+ to 23.1.0`_
+
+.. _Bump black from 22.12.0 to 23.1.0:
+ https://github.com/searxng/searxng/pull/2159#pullrequestreview-1284094735
+
+.. _Black code style:
+ https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html
+
+.. _make clean:
+
+``make clean``
+==============
+
+Drops all intermediate files, all builds, but keep sources untouched. Before
+calling ``make clean`` stop all processes using the :ref:`make install` or
+:ref:`make node.env`. ::
+
+ $ make clean
+ CLEAN pyenv
+ PYENV [virtualenv] drop local/py3
+ CLEAN docs -- build/docs dist/docs
+ CLEAN themes -- locally installed npm dependencies
+ ...
+ CLEAN test stuff
+ CLEAN common files
+
+.. _make docs:
+
+``make docs``
+=============
+
+Target ``docs`` builds the documentation:
+
+.. code:: bash
+
+ $ make docs
+ HTML ./docs --> file://
+ DOCS build build/docs/includes
+ ...
+ The HTML pages are in dist/docs.
+
+.. _make docs.clean:
+
+``make docs.clean docs.live``
+----------------------------------
+
+We describe the usage of the ``doc.*`` targets in the :ref:`How to contribute /
+Documentation <contrib docs>` section. If you want to edit the documentation
+read our :ref:`make docs.live` section. If you are working in your own brand,
+adjust your :ref:`settings brand`.
+
+
+.. _make docs.gh-pages:
+
+``make docs.gh-pages``
+----------------------
+
+To deploy on github.io first adjust your :ref:`settings brand`. For any
+further read :ref:`deploy on github.io`.
+
+.. _make test:
+
+``make test``
+=============
+
+Runs a series of tests: :ref:`make test.pylint`, ``test.pep8``, ``test.unit``
+and ``test.robot``. You can run tests selective, e.g.::
+
+ $ make test.pep8 test.unit test.shell
+ TEST test.pep8 OK
+ ...
+ TEST test.unit OK
+ ...
+ TEST test.shell OK
+
+.. _make test.shell:
+
+``make test.shell``
+-------------------
+
+:ref:`sh lint` / if you have changed some bash scripting run this test before
+commit.
+
+.. _make test.pylint:
+
+``make test.pylint``
+--------------------
+
+.. _Pylint: https://www.pylint.org/
+
+Pylint_ is known as one of the best source-code, bug and quality checker for the
+Python programming language. The pylint profile used in the SearXNG project is
+found in project's root folder :origin:`.pylintrc`.
+
+.. _make search.checker:
+
+``make search.checker.{engine name}``
+=====================================
+
+To check all engines::
+
+ make search.checker
+
+To check a engine with whitespace in the name like *google news* replace space
+by underline::
+
+ make search.checker.google_news
+
+To see HTTP requests and more use SEARXNG_DEBUG::
+
+ make SEARXNG_DEBUG=1 search.checker.google_news
+
+.. _3xx: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection
+
+To filter out HTTP redirects (3xx_)::
+
+ make SEARXNG_DEBUG=1 search.checker.google_news | grep -A1 "HTTP/1.1\" 3[0-9][0-9]"
+ ...
+ Engine google news Checking
+ https://news.google.com:443 "GET /search?q=life&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0
+ https://news.google.com:443 "GET /search?q=life&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None
+ --
+ https://news.google.com:443 "GET /search?q=computer&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0
+ https://news.google.com:443 "GET /search?q=computer&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None
+ --
+
+.. _make themes:
+
+``make themes.*``
+=================
+
+.. sidebar:: further read
+
+ - :ref:`devquickstart`
+
+The :origin:`Makefile` targets ``make theme.*`` cover common tasks to build the
+theme(s). The ``./manage themes.*`` command line can be used to convenient run
+common theme build tasks.
+
+.. program-output:: bash -c "cd ..; ./manage themes.help"
+
+To get live builds while modifying CSS & JS use (:ref:`make run`):
+
+.. code:: sh
+
+ $ LIVE_THEME=simple make run
+
+.. _make static.build:
+
+``make static.build.*``
+=======================
+
+.. sidebar:: further read
+
+ - :ref:`devquickstart`
+
+The :origin:`Makefile` targets ``static.build.*`` cover common tasks to build (a
+commit of) the static files. The ``./manage static.build..*`` command line
+can be used to convenient run common build tasks of the static files.
+
+.. program-output:: bash -c "cd ..; ./manage static.help"
+
+
+.. _manage redis.help:
+
+``./manage redis.help``
+=======================
+
+The ``./manage redis.*`` command line can be used to convenient run common Redis
+tasks (:ref:`Redis developer notes`).
+
+.. program-output:: bash -c "cd ..; ./manage redis.help"
+
+
+.. _manage go.help:
+
+``./manage go.help``
+====================
+
+The ``./manage go.*`` command line can be used to convenient run common `go
+(wiki)`_ tasks.
+
+.. _go (wiki): https://en.wikipedia.org/wiki/Go_(programming_language)
+
+.. program-output:: bash -c "cd ..; ./manage go.help"
diff --git a/_sources/dev/plugins.rst.txt b/_sources/dev/plugins.rst.txt
new file mode 100644
index 000000000..fb3201e66
--- /dev/null
+++ b/_sources/dev/plugins.rst.txt
@@ -0,0 +1,106 @@
+.. _dev plugin:
+
+=======
+Plugins
+=======
+
+.. sidebar:: Further reading ..
+
+ - :ref:`plugins generic`
+
+Plugins can extend or replace functionality of various components of searx.
+
+Example plugin
+==============
+
+.. code:: python
+
+ name = 'Example plugin'
+ description = 'This plugin extends the suggestions with the word "example"'
+ default_on = False # disabled by default
+
+ # attach callback to the post search hook
+ # request: flask request object
+ # ctx: the whole local context of the post search hook
+ def post_search(request, search):
+ search.result_container.suggestions.add('example')
+ return True
+
+External plugins
+================
+
+SearXNG supports *external plugins* / there is no need to install one, SearXNG
+runs out of the box. But to demonstrate; in the example below we install the
+SearXNG plugins from *The Green Web Foundation* `[ref]
+<https://www.thegreenwebfoundation.org/news/searching-the-green-web-with-searx/>`__:
+
+.. code:: bash
+
+ $ sudo utils/searxng.sh instance cmd bash -c
+ (searxng-pyenv)$ pip install git+https://github.com/return42/tgwf-searx-plugins
+
+In the :ref:`settings.yml` activate the ``plugins:`` section and add module
+``only_show_green_results`` from ``tgwf-searx-plugins``.
+
+.. code:: yaml
+
+ plugins:
+ ...
+ - only_show_green_results
+ ...
+
+
+Plugin entry points
+===================
+
+Entry points (hooks) define when a plugin runs. Right now only three hooks are
+implemented. So feel free to implement a hook if it fits the behaviour of your
+plugin. A plugin doesn't need to implement all the hooks.
+
+
+.. py:function:: pre_search(request, search) -> bool
+
+ Runs BEFORE the search request.
+
+ `search.result_container` can be changed.
+
+ Return a boolean:
+
+ * True to continue the search
+ * False to stop the search
+
+ :param flask.request request:
+ :param searx.search.SearchWithPlugins search:
+ :return: False to stop the search
+ :rtype: bool
+
+
+.. py:function:: post_search(request, search) -> None
+
+ Runs AFTER the search request.
+
+ :param flask.request request: Flask request.
+ :param searx.search.SearchWithPlugins search: Context.
+
+
+.. py:function:: on_result(request, search, result) -> bool
+
+ Runs for each result of each engine.
+
+ `result` can be changed.
+
+ If `result["url"]` is defined, then `result["parsed_url"] = urlparse(result['url'])`
+
+ .. warning::
+ `result["url"]` can be changed, but `result["parsed_url"]` must be updated too.
+
+ Return a boolean:
+
+ * True to keep the result
+ * False to remove the result
+
+ :param flask.request request:
+ :param searx.search.SearchWithPlugins search:
+ :param typing.Dict result: Result, see - :ref:`engine results`
+ :return: True to keep the result
+ :rtype: bool
diff --git a/_sources/dev/quickstart.rst.txt b/_sources/dev/quickstart.rst.txt
new file mode 100644
index 000000000..c45c24491
--- /dev/null
+++ b/_sources/dev/quickstart.rst.txt
@@ -0,0 +1,82 @@
+.. _devquickstart:
+
+======================
+Development Quickstart
+======================
+
+.. _npm: https://www.npmjs.com/
+.. _Node.js: https://nodejs.org/
+
+
+.. sidebar:: further read
+
+ - :ref:`makefile`
+ - :ref:`buildhosts`
+
+SearXNG loves developers; Developers do not need to worry about tool chains, the
+usual developer tasks can be comfortably executed via :ref:`make <makefile>`.
+
+Don't hesitate, just clone SearXNG's sources and start hacking right now ..
+
+.. code:: bash
+
+ git clone https://github.com/searxng/searxng.git searxng
+
+Here is how a minimal workflow looks like:
+
+1. *start* hacking
+2. *run* your code: :ref:`make run`
+3. *format & test* your code: :ref:`make format.python` and :ref:`make test`
+
+If you think at some point something fails, go back to *start*. Otherwise,
+choose a meaningful commit message and we are happy to receive your pull
+request. To not end in *wild west* we have some directives, please pay attention
+to our ":ref:`how to contribute`" guideline.
+
+.. sidebar:: further read
+
+ - :ref:`make nvm`
+ - :ref:`make themes`
+
+If you implement themes, you will need to setup a :ref:`Node.js environment
+<make node.env>`: ``make node.env``
+
+Before you call *make run* (2.), you need to compile the modified styles and
+JavaScript: ``make themes.all``
+
+Alternatively you can also compile selective the theme you have modified,
+e.g. the *simple* theme.
+
+.. code:: bash
+
+ make themes.simple
+
+.. tip::
+
+ To get live builds while modifying CSS & JS use: ``LIVE_THEME=simple make run``
+
+.. sidebar:: further read
+
+ - :ref:`make static.build`
+
+If you finished your *tests* you can start to commit your changes. To separate
+the modified source code from the build products first run:
+
+.. code:: bash
+
+ make static.build.restore
+
+This will restore the old build products and only your changes of the code
+remain in the working tree which can now be added & committed. When all sources
+are committed, you can commit the build products simply by:
+
+.. code:: bash
+
+ make static.build.commit
+
+Committing the build products should be the last step, just before you send us
+your PR. There is also a make target to rewind this last build commit:
+
+.. code:: bash
+
+ make static.build.drop
diff --git a/_sources/dev/reST.rst.txt b/_sources/dev/reST.rst.txt
new file mode 100644
index 000000000..e539617b7
--- /dev/null
+++ b/_sources/dev/reST.rst.txt
@@ -0,0 +1,1438 @@
+.. _reST primer:
+
+===========
+reST primer
+===========
+
+.. sidebar:: KISS_ and readability_
+
+ Instead of defining more and more roles, we at SearXNG encourage our
+ contributors to follow principles like KISS_ and readability_.
+
+We at SearXNG are using reStructuredText (aka reST_) markup for all kind of
+documentation. With the builders from the Sphinx_ project a HTML output is
+generated and deployed at docs.searxng.org_. For build prerequisites read
+:ref:`docs build`.
+
+.. _docs.searxng.org: https://docs.searxng.org/
+
+The source files of SearXNG's documentation are located at :origin:`docs`.
+Sphinx assumes source files to be encoded in UTF-8 by default. Run :ref:`make
+docs.live <make docs.live>` to build HTML while editing.
+
+.. sidebar:: Further reading
+
+ - Sphinx-Primer_
+ - `Sphinx markup constructs`_
+ - reST_, docutils_, `docutils FAQ`_
+ - Sphinx_, `sphinx-doc FAQ`_
+ - `sphinx config`_, doctree_
+ - `sphinx cross references`_
+ - linuxdoc_
+ - intersphinx_
+ - sphinx-jinja_
+ - `Sphinx's autodoc`_
+ - `Sphinx's Python domain`_, `Sphinx's C domain`_
+ - SVG_, ImageMagick_
+ - DOT_, `Graphviz's dot`_, Graphviz_
+
+
+.. contents::
+ :depth: 3
+ :local:
+ :backlinks: entry
+
+Sphinx_ and reST_ have their place in the python ecosystem. Over that reST is
+used in popular projects, e.g the Linux kernel documentation `[kernel doc]`_.
+
+.. _[kernel doc]: https://www.kernel.org/doc/html/latest/doc-guide/sphinx.html
+
+.. sidebar:: Content matters
+
+ The readability_ of the reST sources has its value, therefore we recommend to
+ make sparse usage of reST markup / .. content matters!
+
+**reST** is a plaintext markup language, its markup is *mostly* intuitive and
+you will not need to learn much to produce well formed articles with. I use the
+word *mostly*: like everything in live, reST has its advantages and
+disadvantages, some markups feel a bit grumpy (especially if you are used to
+other plaintext markups).
+
+Soft skills
+===========
+
+Before going any deeper into the markup let's face on some **soft skills** a
+trained author brings with, to reach a well feedback from readers:
+
+- Documentation is dedicated to an audience and answers questions from the
+ audience point of view.
+- Don't detail things which are general knowledge from the audience point of
+ view.
+- Limit the subject, use cross links for any further reading.
+
+To be more concrete what a *point of view* means. In the (:origin:`docs`)
+folder we have three sections (and the *blog* folder), each dedicate to a
+different group of audience.
+
+User's POV: :origin:`docs/user`
+ A typical user knows about search engines and might have heard about
+ meta crawlers and privacy.
+
+Admin's POV: :origin:`docs/admin`
+ A typical Admin knows about setting up services on a linux system, but he does
+ not know all the pros and cons of a SearXNG setup.
+
+Developer's POV: :origin:`docs/dev`
+ Depending on the readability_ of code, a typical developer is able to read and
+ understand source code. Describe what a item aims to do (e.g. a function).
+ If the chronological order matters, describe it. Name the *out-of-limits
+ conditions* and all the side effects a external developer will not know.
+
+.. _reST inline markup:
+
+Basic inline markup
+===================
+
+.. sidebar:: Inline markup
+
+ - :ref:`reST roles`
+ - :ref:`reST smart ref`
+
+Basic inline markup is done with asterisks and backquotes. If asterisks or
+backquotes appear in running text and could be confused with inline markup
+delimiters, they have to be escaped with a backslash (``\*pointer``).
+
+.. table:: basic inline markup
+ :widths: 4 3 7
+
+ ================================================ ==================== ========================
+ description rendered markup
+ ================================================ ==================== ========================
+ one asterisk for emphasis *italics* ``*italics*``
+ two asterisks for strong emphasis **boldface** ``**boldface**``
+ backquotes for code samples and literals ``foo()`` ````foo()````
+ quote asterisks or backquotes \*foo is a pointer ``\*foo is a pointer``
+ ================================================ ==================== ========================
+
+.. _reST basic structure:
+
+Basic article structure
+=======================
+
+The basic structure of an article makes use of heading adornments to markup
+chapter, sections and subsections.
+
+.. _reST template:
+
+reST template
+-------------
+
+reST template for an simple article:
+
+.. code:: reST
+
+ .. _doc refname:
+
+ ==============
+ Document title
+ ==============
+
+ Lorem ipsum dolor sit amet, consectetur adipisici elit .. Further read
+ :ref:`chapter refname`.
+
+ .. _chapter refname:
+
+ Chapter
+ =======
+
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquid ex ea commodi consequat ...
+
+ .. _section refname:
+
+ Section
+ -------
+
+ lorem ..
+
+ .. _subsection refname:
+
+ Subsection
+ ~~~~~~~~~~
+
+ lorem ..
+
+
+Headings
+--------
+
+#. title - with overline for document title:
+
+ .. code:: reST
+
+ ==============
+ Document title
+ ==============
+
+
+#. chapter - with anchor named ``anchor name``:
+
+ .. code:: reST
+
+ .. _anchor name:
+
+ Chapter
+ =======
+
+#. section
+
+ .. code:: reST
+
+ Section
+ -------
+
+#. subsection
+
+ .. code:: reST
+
+ Subsection
+ ~~~~~~~~~~
+
+
+
+Anchors & Links
+===============
+
+.. _reST anchor:
+
+Anchors
+-------
+
+.. _ref role:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref
+
+To refer a point in the documentation a anchor is needed. The :ref:`reST
+template <reST template>` shows an example where a chapter titled *"Chapters"*
+gets an anchor named ``chapter title``. Another example from *this* document,
+where the anchor named ``reST anchor``:
+
+.. code:: reST
+
+ .. _reST anchor:
+
+ Anchors
+ -------
+
+ To refer a point in the documentation a anchor is needed ...
+
+To refer anchors use the `ref role`_ markup:
+
+.. code:: reST
+
+ Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
+ bar <reST anchor>`.
+
+.. admonition:: ``:ref:`` role
+ :class: rst-example
+
+ Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
+ bar <reST anchor>`.
+
+.. _reST ordinary ref:
+
+Link ordinary URL
+-----------------
+
+If you need to reference external URLs use *named* hyperlinks to maintain
+readability of reST sources. Here is a example taken from *this* article:
+
+.. code:: reST
+
+ .. _Sphinx Field Lists:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
+
+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
+ readable.
+
+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
+ Lists
+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
+
+.. admonition:: Named hyperlink
+ :class: rst-example
+
+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
+ readable.
+
+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
+ Lists
+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
+
+
+.. _reST smart ref:
+
+Smart refs
+----------
+
+With the power of sphinx.ext.extlinks_ and intersphinx_ referencing external
+content becomes smart.
+
+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
+ :widths: 4 3 7
+
+ ========================== ================================== ====================================
+ refer ... rendered example markup
+ ========================== ================================== ====================================
+ :rst:role:`rfc` :rfc:`822` ``:rfc:`822```
+ :rst:role:`pep` :pep:`8` ``:pep:`8```
+ sphinx.ext.extlinks_
+ --------------------------------------------------------------------------------------------------
+ project's wiki article :wiki:`Offline-engines` ``:wiki:`Offline-engines```
+ to docs public URL :docs:`dev/reST.html` ``:docs:`dev/reST.html```
+ files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
+ pull request :pull:`4` ``:pull:`4```
+ patch :patch:`af2cae6` ``:patch:`af2cae6```
+ PyPi package :pypi:`httpx` ``:pypi:`httpx```
+ manual page man :man:`bash` ``:man:`bash```
+ intersphinx_
+ --------------------------------------------------------------------------------------------------
+ external anchor :ref:`python:and` ``:ref:`python:and```
+ external doc anchor :doc:`jinja:templates` ``:doc:`jinja:templates```
+ python code object :py:obj:`datetime.datetime` ``:py:obj:`datetime.datetime```
+ flask code object :py:obj:`flask.Flask` ``:py:obj:`flask.Flask```
+ ========================== ================================== ====================================
+
+
+Intersphinx is configured in :origin:`docs/conf.py`:
+
+.. code:: python
+
+ intersphinx_mapping = {
+ "python": ("https://docs.python.org/3/", None),
+ "flask": ("https://flask.palletsprojects.com/", None),
+ "jinja": ("https://jinja.palletsprojects.com/", None),
+ "linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
+ "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
+ }
+
+
+To list all anchors of the inventory (e.g. ``python``) use:
+
+.. code:: sh
+
+ $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
+ ...
+ $ python -m sphinx.ext.intersphinx https://docs.searxng.org/objects.inv
+ ...
+
+Literal blocks
+==============
+
+The simplest form of :duref:`literal-blocks` is a indented block introduced by
+two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
+code` directive. To include literals from external files use
+:rst:dir:`literalinclude` or :ref:`kernel-include <kernel-include-directive>`
+directive (latter one expands environment variables in the path name).
+
+.. _reST literal:
+
+``::``
+------
+
+.. code:: reST
+
+ ::
+
+ Literal block
+
+ Lorem ipsum dolor::
+
+ Literal block
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore ::
+
+ Literal block
+
+.. admonition:: Literal block
+ :class: rst-example
+
+ ::
+
+ Literal block
+
+ Lorem ipsum dolor::
+
+ Literal block
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore ::
+
+ Literal block
+
+
+.. _reST code:
+
+``code-block``
+--------------
+
+.. _pygments: https://pygments.org/languages/
+
+.. sidebar:: Syntax highlighting
+
+ is handled by pygments_.
+
+The :rst:dir:`code-block` directive is a variant of the :dudir:`code` directive
+with additional options. To learn more about code literals visit
+:ref:`sphinx:code-examples`.
+
+.. code-block:: reST
+
+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
+
+ .. code-block:: Python
+ :caption: python code block
+ :name: stats-handle
+
+ @app.route('/stats', methods=['GET'])
+ def stats():
+ """Render engine statistics page."""
+ stats = get_engines_stats()
+ return render(
+ 'stats.html'
+ , stats = stats )
+
+.. code-block:: reST
+
+.. admonition:: Code block
+ :class: rst-example
+
+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
+
+ .. code-block:: Python
+ :caption: python code block
+ :name: stats-handle
+
+ @app.route('/stats', methods=['GET'])
+ def stats():
+ """Render engine statistics page."""
+ stats = get_engines_stats()
+ return render(
+ 'stats.html'
+ , stats = stats )
+
+Unicode substitution
+====================
+
+The :dudir:`unicode directive <unicode-character-codes>` converts Unicode
+character codes (numerical values) to characters. This directive can only be
+used within a substitution definition.
+
+.. code-block:: reST
+
+ .. |copy| unicode:: 0xA9 .. copyright sign
+ .. |(TM)| unicode:: U+2122
+
+ Trademark |(TM)| and copyright |copy| glyphs.
+
+.. admonition:: Unicode
+ :class: rst-example
+
+ .. |copy| unicode:: 0xA9 .. copyright sign
+ .. |(TM)| unicode:: U+2122
+
+ Trademark |(TM)| and copyright |copy| glyphs.
+
+
+.. _reST roles:
+
+Roles
+=====
+
+.. sidebar:: Further reading
+
+ - `Sphinx Roles`_
+ - :doc:`sphinx:usage/restructuredtext/domains`
+
+
+A *custom interpreted text role* (:duref:`ref <roles>`) is an inline piece of
+explicit markup. It signifies that that the enclosed text should be interpreted
+in a specific way.
+
+The general markup is one of:
+
+.. code:: reST
+
+ :rolename:`ref-name`
+ :rolename:`ref text <ref-name>`
+
+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
+ :widths: 4 3 7
+
+ ========================== ================================== ====================================
+ role rendered example markup
+ ========================== ================================== ====================================
+ :rst:role:`guilabel` :guilabel:`&Cancel` ``:guilabel:`&Cancel```
+ :rst:role:`kbd` :kbd:`C-x C-f` ``:kbd:`C-x C-f```
+ :rst:role:`menuselection` :menuselection:`Open --> File` ``:menuselection:`Open --> File```
+ :rst:role:`download` :download:`this file <reST.rst>` ``:download:`this file <reST.rst>```
+ math_ :math:`a^2 + b^2 = c^2` ``:math:`a^2 + b^2 = c^2```
+ :rst:role:`ref` :ref:`svg image example` ``:ref:`svg image example```
+ :rst:role:`command` :command:`ls -la` ``:command:`ls -la```
+ :durole:`emphasis` :emphasis:`italic` ``:emphasis:`italic```
+ :durole:`strong` :strong:`bold` ``:strong:`bold```
+ :durole:`literal` :literal:`foo()` ``:literal:`foo()```
+ :durole:`subscript` H\ :sub:`2`\ O ``H\ :sub:`2`\ O``
+ :durole:`superscript` E = mc\ :sup:`2` ``E = mc\ :sup:`2```
+ :durole:`title-reference` :title:`Time` ``:title:`Time```
+ ========================== ================================== ====================================
+
+Figures & Images
+================
+
+.. sidebar:: Image processing
+
+ With the directives from :ref:`linuxdoc <linuxdoc:kfigure>` the build process
+ is flexible. To get best results in the generated output format, install
+ ImageMagick_ and Graphviz_.
+
+SearXNG's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scalable here means;
+scalable in sense of the build process. Normally in absence of a converter
+tool, the build process will break. From the authors POV it’s annoying to care
+about the build process when handling with images, especially since he has no
+access to the build process. With :ref:`linuxdoc:kfigure` the build process
+continues and scales output quality in dependence of installed image processors.
+
+If you want to add an image, you should use the ``kernel-figure`` (inheritance
+of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`)
+directives. E.g. to insert a figure with a scalable image format use SVG
+(:ref:`svg image example`):
+
+.. code:: reST
+
+ .. _svg image example:
+
+ .. kernel-figure:: svg_image.svg
+ :alt: SVG image example
+
+ Simple SVG image
+
+ To refer the figure, a caption block is needed: :ref:`svg image example`.
+
+.. _svg image example:
+
+.. kernel-figure:: svg_image.svg
+ :alt: SVG image example
+
+ Simple SVG image.
+
+To refer the figure, a caption block is needed: :ref:`svg image example`.
+
+DOT files (aka Graphviz)
+------------------------
+
+With :ref:`linuxdoc:kernel-figure` reST support for **DOT** formatted files is
+given.
+
+- `Graphviz's dot`_
+- DOT_
+- Graphviz_
+
+A simple example is shown in :ref:`dot file example`:
+
+.. code:: reST
+
+ .. _dot file example:
+
+ .. kernel-figure:: hello.dot
+ :alt: hello world
+
+ DOT's hello world example
+
+.. admonition:: hello.dot
+ :class: rst-example
+
+ .. _dot file example:
+
+ .. kernel-figure:: hello.dot
+ :alt: hello world
+
+ DOT's hello world example
+
+``kernel-render`` DOT
+---------------------
+
+Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
+:ref:`linuxdoc:kernel-render` directive. A simple example of embedded DOT_ is
+shown in figure :ref:`dot render example`:
+
+.. code:: reST
+
+ .. _dot render example:
+
+ .. kernel-render:: DOT
+ :alt: digraph
+ :caption: Embedded DOT (Graphviz) code
+
+ digraph foo {
+ "bar" -> "baz";
+ }
+
+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
+ render example`.
+
+Please note :ref:`build tools <linuxdoc:kfigure_build_tools>`. If Graphviz_ is
+installed, you will see an vector image. If not, the raw markup is inserted as
+*literal-block*.
+
+.. admonition:: kernel-render DOT
+ :class: rst-example
+
+ .. _dot render example:
+
+ .. kernel-render:: DOT
+ :alt: digraph
+ :caption: Embedded DOT (Graphviz) code
+
+ digraph foo {
+ "bar" -> "baz";
+ }
+
+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
+ render example`.
+
+``kernel-render`` SVG
+---------------------
+
+A simple example of embedded SVG_ is shown in figure :ref:`svg render example`:
+
+.. code:: reST
+
+ .. _svg render example:
+
+ .. kernel-render:: SVG
+ :caption: Embedded **SVG** markup
+ :alt: so-nw-arrow
+..
+
+ .. code:: xml
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ baseProfile="full" width="70px" height="40px"
+ viewBox="0 0 700 400"
+ >
+ <line x1="180" y1="370"
+ x2="500" y2="50"
+ stroke="black" stroke-width="15px"
+ />
+ <polygon points="585 0 525 25 585 50"
+ transform="rotate(135 525 25)"
+ />
+ </svg>
+
+.. admonition:: kernel-render SVG
+ :class: rst-example
+
+ .. _svg render example:
+
+ .. kernel-render:: SVG
+ :caption: Embedded **SVG** markup
+ :alt: so-nw-arrow
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ baseProfile="full" width="70px" height="40px"
+ viewBox="0 0 700 400"
+ >
+ <line x1="180" y1="370"
+ x2="500" y2="50"
+ stroke="black" stroke-width="15px"
+ />
+ <polygon points="585 0 525 25 585 50"
+ transform="rotate(135 525 25)"
+ />
+ </svg>
+
+
+
+
+.. _reST lists:
+
+List markups
+============
+
+Bullet list
+-----------
+
+List markup (:duref:`ref <bullet-lists>`) is simple:
+
+.. code:: reST
+
+ - This is a bulleted list.
+
+ 1. Nested lists are possible, but be aware that they must be separated from
+ the parent list items by blank line
+ 2. Second item of nested list
+
+ - It has two items, the second
+ item uses two lines.
+
+ #. This is a numbered list.
+ #. It has two items too.
+
+.. admonition:: bullet list
+ :class: rst-example
+
+ - This is a bulleted list.
+
+ 1. Nested lists are possible, but be aware that they must be separated from
+ the parent list items by blank line
+ 2. Second item of nested list
+
+ - It has two items, the second
+ item uses two lines.
+
+ #. This is a numbered list.
+ #. It has two items too.
+
+
+Horizontal list
+---------------
+
+The :rst:dir:`.. hlist:: <hlist>` transforms a bullet list into a more compact
+list.
+
+.. code:: reST
+
+ .. hlist::
+
+ - first list item
+ - second list item
+ - third list item
+ ...
+
+.. admonition:: hlist
+ :class: rst-example
+
+ .. hlist::
+
+ - first list item
+ - second list item
+ - third list item
+ - next list item
+ - next list item xxxx
+ - next list item yyyy
+ - next list item zzzz
+
+
+Definition list
+---------------
+
+.. sidebar:: Note ..
+
+ - the term cannot have more than one line of text
+
+ - there is **no blank line between term and definition block** // this
+ distinguishes definition lists (:duref:`ref <definition-lists>`) from block
+ quotes (:duref:`ref <block-quotes>`).
+
+Each definition list (:duref:`ref <definition-lists>`) item contains a term,
+optional classifiers and a definition. A term is a simple one-line word or
+phrase. Optional classifiers may follow the term on the same line, each after
+an inline ' : ' (**space, colon, space**). A definition is a block indented
+relative to the term, and may contain multiple paragraphs and other body
+elements. There may be no blank line between a term line and a definition block
+(*this distinguishes definition lists from block quotes*). Blank lines are
+required before the first and after the last definition list item, but are
+optional in-between.
+
+Definition lists are created as follows:
+
+.. code:: reST
+
+ term 1 (up to a line of text)
+ Definition 1.
+
+ See the typo : this line is not a term!
+
+ And this is not term's definition. **There is a blank line** in between
+ the line above and this paragraph. That's why this paragraph is taken as
+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
+
+ term 2
+ Definition 2, paragraph 1.
+
+ Definition 2, paragraph 2.
+
+ term 3 : classifier
+ Definition 3.
+
+ term 4 : classifier one : classifier two
+ Definition 4.
+
+.. admonition:: definition list
+ :class: rst-example
+
+ term 1 (up to a line of text)
+ Definition 1.
+
+ See the typo : this line is not a term!
+
+ And this is not term's definition. **There is a blank line** in between
+ the line above and this paragraph. That's why this paragraph is taken as
+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
+
+
+ term 2
+ Definition 2, paragraph 1.
+
+ Definition 2, paragraph 2.
+
+ term 3 : classifier
+ Definition 3.
+
+ term 4 : classifier one : classifier two
+
+
+Quoted paragraphs
+-----------------
+
+Quoted paragraphs (:duref:`ref <block-quotes>`) are created by just indenting
+them more than the surrounding paragraphs. Line blocks (:duref:`ref
+<line-blocks>`) are a way of preserving line breaks:
+
+.. code:: reST
+
+ normal paragraph ...
+ lorem ipsum.
+
+ Quoted paragraph ...
+ lorem ipsum.
+
+ | These lines are
+ | broken exactly like in
+ | the source file.
+
+
+.. admonition:: Quoted paragraph and line block
+ :class: rst-example
+
+ normal paragraph ...
+ lorem ipsum.
+
+ Quoted paragraph ...
+ lorem ipsum.
+
+ | These lines are
+ | broken exactly like in
+ | the source file.
+
+
+.. _reST field list:
+
+Field Lists
+-----------
+
+.. _Sphinx Field Lists:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
+
+.. sidebar:: bibliographic fields
+
+ First lines fields are bibliographic fields, see `Sphinx Field Lists`_.
+
+Field lists are used as part of an extension syntax, such as options for
+directives, or database-like records meant for further processing. Field lists
+are mappings from field names to field bodies. They marked up like this:
+
+.. code:: reST
+
+ :fieldname: Field content
+ :foo: first paragraph in field foo
+
+ second paragraph in field foo
+
+ :bar: Field content
+
+.. admonition:: Field List
+ :class: rst-example
+
+ :fieldname: Field content
+ :foo: first paragraph in field foo
+
+ second paragraph in field foo
+
+ :bar: Field content
+
+
+They are commonly used in Python documentation:
+
+.. code:: python
+
+ def my_function(my_arg, my_other_arg):
+ """A function just for me.
+
+ :param my_arg: The first of my arguments.
+ :param my_other_arg: The second of my arguments.
+
+ :returns: A message (just for me, of course).
+ """
+
+Further list blocks
+-------------------
+
+- field lists (:duref:`ref <field-lists>`, with caveats noted in
+ :ref:`reST field list`)
+- option lists (:duref:`ref <option-lists>`)
+- quoted literal blocks (:duref:`ref <quoted-literal-blocks>`)
+- doctest blocks (:duref:`ref <doctest-blocks>`)
+
+
+Admonitions
+===========
+
+Sidebar
+-------
+
+Sidebar is an eye catcher, often used for admonitions pointing further stuff or
+site effects. Here is the source of the sidebar :ref:`on top of this page <reST
+primer>`.
+
+.. code:: reST
+
+ .. sidebar:: KISS_ and readability_
+
+ Instead of defining more and more roles, we at SearXNG encourage our
+ contributors to follow principles like KISS_ and readability_.
+
+Generic admonition
+------------------
+
+The generic :dudir:`admonition <admonitions>` needs a title:
+
+.. code:: reST
+
+ .. admonition:: generic admonition title
+
+ lorem ipsum ..
+
+
+.. admonition:: generic admonition title
+
+ lorem ipsum ..
+
+
+Specific admonitions
+--------------------
+
+Specific admonitions: :dudir:`hint`, :dudir:`note`, :dudir:`tip` :dudir:`attention`,
+:dudir:`caution`, :dudir:`danger`, :dudir:`error`, , :dudir:`important`, and
+:dudir:`warning` .
+
+.. code:: reST
+
+ .. hint::
+
+ lorem ipsum ..
+
+ .. note::
+
+ lorem ipsum ..
+
+ .. warning::
+
+ lorem ipsum ..
+
+
+.. hint::
+
+ lorem ipsum ..
+
+.. note::
+
+ lorem ipsum ..
+
+.. tip::
+
+ lorem ipsum ..
+
+.. attention::
+
+ lorem ipsum ..
+
+.. caution::
+
+ lorem ipsum ..
+
+.. danger::
+
+ lorem ipsum ..
+
+.. important::
+
+ lorem ipsum ..
+
+.. error::
+
+ lorem ipsum ..
+
+.. warning::
+
+ lorem ipsum ..
+
+
+Tables
+======
+
+.. sidebar:: Nested tables
+
+ Nested tables are ugly! Not all builder support nested tables, don't use
+ them!
+
+ASCII-art tables like :ref:`reST simple table` and :ref:`reST grid table` might
+be comfortable for readers of the text-files, but they have huge disadvantages
+in the creation and modifying. First, they are hard to edit. Think about
+adding a row or a column to a ASCII-art table or adding a paragraph in a cell,
+it is a nightmare on big tables.
+
+
+.. sidebar:: List tables
+
+ For meaningful patch and diff use :ref:`reST flat table`.
+
+Second the diff of modifying ASCII-art tables is not meaningful, e.g. widening a
+cell generates a diff in which also changes are included, which are only
+ascribable to the ASCII-art. Anyway, if you prefer ASCII-art for any reason,
+here are some helpers:
+
+* `Emacs Table Mode`_
+* `Online Tables Generator`_
+
+.. _reST simple table:
+
+Simple tables
+-------------
+
+:duref:`Simple tables <simple-tables>` allow *colspan* but not *rowspan*. If
+your table need some metadata (e.g. a title) you need to add the ``.. table::
+directive`` :dudir:`(ref) <table>` in front and place the table in its body:
+
+.. code:: reST
+
+ .. table:: foo gate truth table
+ :widths: grid
+ :align: left
+
+ ====== ====== ======
+ Inputs Output
+ ------------- ------
+ A B A or B
+ ====== ====== ======
+ False
+ --------------------
+ True
+ --------------------
+ True False True
+ (foo)
+ ------ ------ ------
+ False True
+ (foo)
+ ====== =============
+
+.. admonition:: Simple ASCII table
+ :class: rst-example
+
+ .. table:: foo gate truth table
+ :widths: grid
+ :align: left
+
+ ====== ====== ======
+ Inputs Output
+ ------------- ------
+ A B A or B
+ ====== ====== ======
+ False
+ --------------------
+ True
+ --------------------
+ True False True
+ (foo)
+ ------ ------ ------
+ False True
+ (foo)
+ ====== =============
+
+
+
+.. _reST grid table:
+
+Grid tables
+-----------
+
+:duref:`Grid tables <grid-tables>` allow colspan *colspan* and *rowspan*:
+
+.. code:: reST
+
+ .. table:: grid table example
+ :widths: 1 1 5
+
+ +------------+------------+-----------+
+ | Header 1 | Header 2 | Header 3 |
+ +============+============+===========+
+ | body row 1 | column 2 | column 3 |
+ +------------+------------+-----------+
+ | body row 2 | Cells may span columns.|
+ +------------+------------+-----------+
+ | body row 3 | Cells may | - Cells |
+ +------------+ span rows. | - contain |
+ | body row 4 | | - blocks. |
+ +------------+------------+-----------+
+
+.. admonition:: ASCII grid table
+ :class: rst-example
+
+ .. table:: grid table example
+ :widths: 1 1 5
+
+ +------------+------------+-----------+
+ | Header 1 | Header 2 | Header 3 |
+ +============+============+===========+
+ | body row 1 | column 2 | column 3 |
+ +------------+------------+-----------+
+ | body row 2 | Cells may span columns.|
+ +------------+------------+-----------+
+ | body row 3 | Cells may | - Cells |
+ +------------+ span rows. | - contain |
+ | body row 4 | | - blocks. |
+ +------------+------------+-----------+
+
+
+.. _reST flat table:
+
+flat-table
+----------
+
+The ``flat-table`` is a further developed variant of the :ref:`list tables
+<linuxdoc:list-table-directives>`. It is a double-stage list similar to the
+:dudir:`list-table` with some additional features:
+
+column-span: ``cspan``
+ with the role ``cspan`` a cell can be extended through additional columns
+
+row-span: ``rspan``
+ with the role ``rspan`` a cell can be extended through additional rows
+
+auto-span:
+ spans rightmost cell of a table row over the missing cells on the right side
+ of that table-row. With Option ``:fill-cells:`` this behavior can changed
+ from *auto span* to *auto fill*, which automatically inserts (empty) cells
+ instead of spanning the last cell.
+
+options:
+ :header-rows: [int] count of header rows
+ :stub-columns: [int] count of stub columns
+ :widths: [[int] [int] ... ] widths of columns
+ :fill-cells: instead of auto-span missing cells, insert missing cells
+
+roles:
+ :cspan: [int] additional columns (*morecols*)
+ :rspan: [int] additional rows (*morerows*)
+
+The example below shows how to use this markup. The first level of the staged
+list is the *table-row*. In the *table-row* there is only one markup allowed,
+the list of the cells in this *table-row*. Exception are *comments* ( ``..`` )
+and *targets* (e.g. a ref to :ref:`row 2 of table's body <row body 2>`).
+
+.. code:: reST
+
+ .. flat-table:: ``flat-table`` example
+ :header-rows: 2
+ :stub-columns: 1
+ :widths: 1 1 1 1 2
+
+ * - :rspan:`1` head / stub
+ - :cspan:`3` head 1.1-4
+
+ * - head 2.1
+ - head 2.2
+ - head 2.3
+ - head 2.4
+
+ * .. row body 1 / this is a comment
+
+ - row 1
+ - :rspan:`2` cell 1-3.1
+ - cell 1.2
+ - cell 1.3
+ - cell 1.4
+
+ * .. Comments and targets are allowed on *table-row* stage.
+ .. _`row body 2`:
+
+ - row 2
+ - cell 2.2
+ - :rspan:`1` :cspan:`1`
+ cell 2.3 with a span over
+
+ * col 3-4 &
+ * row 2-3
+
+ * - row 3
+ - cell 3.2
+
+ * - row 4
+ - cell 4.1
+ - cell 4.2
+ - cell 4.3
+ - cell 4.4
+
+ * - row 5
+ - cell 5.1 with automatic span to right end
+
+ * - row 6
+ - cell 6.1
+ - ..
+
+
+.. admonition:: List table
+ :class: rst-example
+
+ .. flat-table:: ``flat-table`` example
+ :header-rows: 2
+ :stub-columns: 1
+ :widths: 1 1 1 1 2
+
+ * - :rspan:`1` head / stub
+ - :cspan:`3` head 1.1-4
+
+ * - head 2.1
+ - head 2.2
+ - head 2.3
+ - head 2.4
+
+ * .. row body 1 / this is a comment
+
+ - row 1
+ - :rspan:`2` cell 1-3.1
+ - cell 1.2
+ - cell 1.3
+ - cell 1.4
+
+ * .. Comments and targets are allowed on *table-row* stage.
+ .. _`row body 2`:
+
+ - row 2
+ - cell 2.2
+ - :rspan:`1` :cspan:`1`
+ cell 2.3 with a span over
+
+ * col 3-4 &
+ * row 2-3
+
+ * - row 3
+ - cell 3.2
+
+ * - row 4
+ - cell 4.1
+ - cell 4.2
+ - cell 4.3
+ - cell 4.4
+
+ * - row 5
+ - cell 5.1 with automatic span to right end
+
+ * - row 6
+ - cell 6.1
+ - ..
+
+
+CSV table
+---------
+
+CSV table might be the choice if you want to include CSV-data from a outstanding
+(build) process into your documentation.
+
+.. code:: reST
+
+ .. csv-table:: CSV table example
+ :header: .. , Column 1, Column 2
+ :widths: 2 5 5
+ :stub-columns: 1
+ :file: csv_table.txt
+
+Content of file ``csv_table.txt``:
+
+.. literalinclude:: csv_table.txt
+
+.. admonition:: CSV table
+ :class: rst-example
+
+ .. csv-table:: CSV table example
+ :header: .. , Column 1, Column 2
+ :widths: 3 5 5
+ :stub-columns: 1
+ :file: csv_table.txt
+
+Templating
+==========
+
+.. sidebar:: Build environment
+
+ All *generic-doc* tasks are running in the :ref:`make install`.
+
+Templating is suitable for documentation which is created generic at the build
+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
+install` (with SearXNG modules installed). We use this e.g. to build chapter:
+:ref:`configured engines`. Below the jinja directive from the
+:origin:`docs/admin/engines.rst` is shown:
+
+.. literalinclude:: ../user/configured_engines.rst
+ :language: reST
+ :start-after: .. _configured engines:
+
+The context for the template is selected in the line ``.. jinja:: searx``. In
+sphinx's build configuration (:origin:`docs/conf.py`) the ``searx`` context
+contains the ``engines`` and ``plugins``.
+
+.. code:: py
+
+ import searx.search
+ import searx.engines
+ import searx.plugins
+ searx.search.initialize()
+ jinja_contexts = {
+ 'searx': {
+ 'engines': searx.engines.engines,
+ 'plugins': searx.plugins.plugins
+ },
+ }
+
+
+Tabbed views
+============
+
+.. _sphinx-tabs: https://github.com/djungelorm/sphinx-tabs
+.. _basic-tabs: https://github.com/djungelorm/sphinx-tabs#basic-tabs
+.. _group-tabs: https://github.com/djungelorm/sphinx-tabs#group-tabs
+.. _code-tabs: https://github.com/djungelorm/sphinx-tabs#code-tabs
+
+With `sphinx-tabs`_ extension we have *tabbed views*. To provide installation
+instructions with one tab per distribution we use the `group-tabs`_ directive,
+others are basic-tabs_ and code-tabs_. Below a *group-tab* example from
+:ref:`docs build` is shown:
+
+.. literalinclude:: ../admin/buildhosts.rst
+ :language: reST
+ :start-after: .. SNIP sh lint requirements
+ :end-before: .. SNAP sh lint requirements
+
+.. _math:
+
+Math equations
+==============
+
+.. _Mathematics: https://en.wikibooks.org/wiki/LaTeX/Mathematics
+.. _amsmath user guide:
+ http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/macros/latex/required/amsmath/amsldoc.pdf
+
+.. sidebar:: About LaTeX
+
+ - `amsmath user guide`_
+ - Mathematics_
+ - :ref:`docs build`
+
+The input language for mathematics is LaTeX markup using the :ctan:`amsmath`
+package.
+
+To embed LaTeX markup in reST documents, use role :rst:role:`:math: <math>` for
+inline and directive :rst:dir:`.. math:: <math>` for block markup.
+
+.. code:: reST
+
+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
+ is shown.
+
+ .. math::
+ :label: schroedinger general
+
+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle.
+
+.. admonition:: LaTeX math equation
+ :class: rst-example
+
+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
+ is shown.
+
+ .. math::
+ :label: schroedinger general
+
+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle.
+
+
+The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
+(*displaystyle*) used in a inline markup or another fraction.
+
+.. code:: reST
+
+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
+ ``\dfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
+
+.. admonition:: Line spacing
+ :class: rst-example
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+ voluptua. ...
+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+ voluptua. ...
+ ``\tfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
+
+
+.. _KISS: https://en.wikipedia.org/wiki/KISS_principle
+
+.. _readability: https://docs.python-guide.org/writing/style/
+.. _Sphinx-Primer:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
+.. _reST: https://docutils.sourceforge.io/rst.html
+.. _Sphinx Roles:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
+.. _Sphinx: https://www.sphinx-doc.org
+.. _`sphinx-doc FAQ`: https://www.sphinx-doc.org/en/stable/faq.html
+.. _Sphinx markup constructs:
+ https://www.sphinx-doc.org/en/stable/markup/index.html
+.. _`sphinx cross references`:
+ https://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
+.. _sphinx.ext.extlinks:
+ https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
+.. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
+.. _sphinx config: https://www.sphinx-doc.org/en/stable/config.html
+.. _Sphinx's autodoc: https://www.sphinx-doc.org/en/stable/ext/autodoc.html
+.. _Sphinx's Python domain:
+ https://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
+.. _Sphinx's C domain:
+ https://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
+.. _doctree:
+ https://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
+.. _docutils: http://docutils.sourceforge.net/docs/index.html
+.. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
+.. _linuxdoc: https://return42.github.io/linuxdoc
+.. _jinja: https://jinja.palletsprojects.com/
+.. _sphinx-jinja: https://github.com/tardyp/sphinx-jinja
+.. _SVG: https://www.w3.org/TR/SVG11/expanded-toc.html
+.. _DOT: https://graphviz.gitlab.io/_pages/doc/info/lang.html
+.. _`Graphviz's dot`: https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf
+.. _Graphviz: https://graphviz.gitlab.io
+.. _ImageMagick: https://www.imagemagick.org
+
+.. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
+.. _`Online Tables Generator`: https://www.tablesgenerator.com/text_tables
+.. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
diff --git a/_sources/dev/rtm_asdf.rst.txt b/_sources/dev/rtm_asdf.rst.txt
new file mode 100644
index 000000000..69180ef4e
--- /dev/null
+++ b/_sources/dev/rtm_asdf.rst.txt
@@ -0,0 +1,121 @@
+==================
+Runtime Management
+==================
+
+The runtimes are managed with asdf and are activated in this project via the
+`.tool-versions <.tool-versions>`_. If you have not yet installed asdf_, then
+chapter :ref:`introduce asdf` may be of help to you.
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+Get started
+===========
+
+If you have asdf installed you can install the runtimes of this project by:
+
+.. code:: bash
+
+ $ cd /path/to/searxng
+ $ asdf install # will install runtimes listed in .tool-versions
+ ...
+
+Manage Versions
+===============
+
+If you want to perform a ``test`` with special runtime versions of nodejs,
+python or shellcheck, you can patch the ``.tool-versions``:
+
+.. code:: diff
+
+ --- a/.tool-versions
+ +++ b/.tool-versions
+ @@ -1,2 +1,2 @@
+ -python 3.12.0
+ -shellcheck 0.9.0
+ +python 3.11.6
+ +shellcheck 0.8.0
+
+To install use ``asdf install`` again. If the runtime tools have changed, any
+existing (nodejs and python) environments should be cleaned up with a ``make
+clean``.
+
+.. code:: bash
+
+ $ asdf install
+ ...
+ $ make clean test
+
+
+.. _introduce asdf:
+
+Introduce asdf
+==============
+
+To `download asdf`_ and `install asdf`_:
+
+.. code:: bash
+
+ $ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch <version>
+ $ echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
+ $ echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc
+
+Start a new shell and try to `install plugins`_:
+
+.. code:: bash
+
+ $ asdf plugin-list-all | grep -E '(golang|python|nodejs|shellcheck).git'
+ golang https://github.com/asdf-community/asdf-golang.git
+ nodejs https://github.com/asdf-vm/asdf-nodejs.git
+ python https://github.com/danhper/asdf-python.git
+ shellcheck https://github.com/luizm/asdf-shellcheck.git
+
+ $ asdf plugin add golang https://github.com/asdf-community/asdf-golang.git
+ $ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
+ $ asdf plugin add python https://github.com/danhper/asdf-python.git
+ $ asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+
+Each plugin has dependencies, to compile runtimes visit the URLs from above and
+look out for the dependencies you need to install on your OS, on Debian for the
+runtimes listed above you will need:
+
+.. code:: bash
+
+ $ sudo apt update
+ $ sudo apt install \
+ dirmngr gpg curl gawk coreutils build-essential libssl-dev zlib1g-dev \
+ libbz2-dev libreadline-dev libsqlite3-dev \
+ libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
+
+With dependencies installed you can install/compile runtimes:
+
+.. code:: bash
+
+ $ asdf install golang latest
+ $ asdf install nodejs latest
+ $ asdf install python latest
+ $ asdf install shellcheck latest
+
+Python will be compiled and will take a while.
+
+In the repository the version is defined in `.tool-versions`_. Outside the
+repository, its recommended that the runtime should use the versions of the OS
+(`Fallback to System Version`_) / if not already done register the system
+versions global:
+
+.. code:: bash
+
+ $ cd /
+ $ asdf global golang system
+ $ asdf global nodejs system
+ $ asdf global python system
+ $ asdf global shellcheck system
+
+.. _asdf: https://asdf-vm.com/
+.. _download asdf: https://asdf-vm.com/guide/getting-started.html#_2-download-asdf
+.. _install asdf: https://asdf-vm.com/guide/getting-started.html#_3-install-asdf
+.. _install plugins: https://asdf-vm.com/guide/getting-started.html#install-the-plugin
+.. _Fallback to System Version: https://asdf-vm.com/manage/versions.html#fallback-to-system-version
diff --git a/_sources/dev/search_api.rst.txt b/_sources/dev/search_api.rst.txt
new file mode 100644
index 000000000..56272d341
--- /dev/null
+++ b/_sources/dev/search_api.rst.txt
@@ -0,0 +1,124 @@
+.. _search API:
+
+==========
+Search API
+==========
+
+The search supports both ``GET`` and ``POST``.
+
+Furthermore, two endpoints ``/`` and ``/search`` are available for querying.
+
+
+``GET /``
+
+``GET /search``
+
+Parameters
+==========
+
+.. sidebar:: Further reading ..
+
+ - :ref:`engines-dev`
+ - :ref:`settings.yml`
+ - :ref:`configured engines`
+
+``q`` : required
+ The search query. This string is passed to external search services. Thus,
+ SearXNG supports syntax of each search service. For example, ``site:github.com
+ SearXNG`` is a valid query for Google. However, if simply the query above is
+ passed to any search engine which does not filter its results based on this
+ syntax, you might not get the results you wanted.
+
+ See more at :ref:`search-syntax`
+
+``categories`` : optional
+ Comma separated list, specifies the active search categories (see
+ :ref:`configured engines`)
+
+``engines`` : optional
+ Comma separated list, specifies the active search engines (see
+ :ref:`configured engines`).
+
+``language`` : default from :ref:`settings search`
+ Code of the language.
+
+``pageno`` : default ``1``
+ Search page number.
+
+``time_range`` : optional
+ [ ``day``, ``month``, ``year`` ]
+
+ Time range of search for engines which support it. See if an engine supports
+ time range search in the preferences page of an instance.
+
+``format`` : optional
+ [ ``json``, ``csv``, ``rss`` ]
+
+ Output format of results. Format needs to be activated in :ref:`settings
+ search`.
+
+``results_on_new_tab`` : default ``0``
+ [ ``0``, ``1`` ]
+
+ Open search results on new tab.
+
+``image_proxy`` : default from :ref:`settings server`
+ [ ``True``, ``False`` ]
+
+ Proxy image results through SearXNG.
+
+``autocomplete`` : default from :ref:`settings search`
+ [ ``google``, ``dbpedia``, ``duckduckgo``, ``mwmbl``, ``startpage``,
+ ``wikipedia``, ``stract``, ``swisscows``, ``qwant`` ]
+
+ Service which completes words as you type.
+
+``safesearch`` : default from :ref:`settings search`
+ [ ``0``, ``1``, ``2`` ]
+
+ Filter search results of engines which support safe search. See if an engine
+ supports safe search in the preferences page of an instance.
+
+``theme`` : default ``simple``
+ [ ``simple`` ]
+
+ Theme of instance.
+
+ Please note, available themes depend on an instance. It is possible that an
+ instance administrator deleted, created or renamed themes on their instance.
+ See the available options in the preferences page of the instance.
+
+``enabled_plugins`` : optional
+ List of enabled plugins.
+
+ :default:
+ ``Hash_plugin``, ``Self_Information``,
+ ``Tracker_URL_remover``, ``Ahmia_blacklist``
+
+ :values:
+ .. enabled by default
+
+ ``Hash_plugin``, ``Self_Information``,
+ ``Tracker_URL_remover``, ``Ahmia_blacklist``,
+
+ .. disabled by default
+
+ ``Hostname_replace``, ``Open_Access_DOI_rewrite``,
+ ``Vim-like_hotkeys``, ``Tor_check_plugin``
+
+``disabled_plugins``: optional
+ List of disabled plugins.
+
+ :default:
+ ``Hostname_replace``, ``Open_Access_DOI_rewrite``,
+ ``Vim-like_hotkeys``, ``Tor_check_plugin``
+
+ :values:
+ see values from ``enabled_plugins``
+
+``enabled_engines`` : optional : *all* :origin:`engines <searx/engines>`
+ List of enabled engines.
+
+``disabled_engines`` : optional : *all* :origin:`engines <searx/engines>`
+ List of disabled engines.
+
diff --git a/_sources/dev/searxng_extra/index.rst.txt b/_sources/dev/searxng_extra/index.rst.txt
new file mode 100644
index 000000000..7bca3c0d4
--- /dev/null
+++ b/_sources/dev/searxng_extra/index.rst.txt
@@ -0,0 +1,14 @@
+.. _searxng_extra:
+
+=============================
+Tooling box ``searxng_extra``
+=============================
+
+In the folder :origin:`searxng_extra/` we maintain some tools useful for CI and
+developers.
+
+.. toctree::
+ :maxdepth: 2
+
+ update
+ standalone_searx.py
diff --git a/_sources/dev/searxng_extra/standalone_searx.py.rst.txt b/_sources/dev/searxng_extra/standalone_searx.py.rst.txt
new file mode 100644
index 000000000..7cbbccfde
--- /dev/null
+++ b/_sources/dev/searxng_extra/standalone_searx.py.rst.txt
@@ -0,0 +1,9 @@
+
+.. _standalone_searx.py:
+
+=====================================
+``searxng_extra/standalone_searx.py``
+=====================================
+
+.. automodule:: searxng_extra.standalone_searx
+ :members:
diff --git a/_sources/dev/searxng_extra/update.rst.txt b/_sources/dev/searxng_extra/update.rst.txt
new file mode 100644
index 000000000..dc3b06744
--- /dev/null
+++ b/_sources/dev/searxng_extra/update.rst.txt
@@ -0,0 +1,98 @@
+=========================
+``searxng_extra/update/``
+=========================
+
+:origin:`[source] <searxng_extra/update/__init__.py>`
+
+Scripts to update static data in :origin:`searx/data/`
+
+.. _update_ahmia_blacklist.py:
+
+``update_ahmia_blacklist.py``
+=============================
+
+:origin:`[source] <searxng_extra/update/update_ahmia_blacklist.py>`
+
+.. automodule:: searxng_extra.update.update_ahmia_blacklist
+ :members:
+
+
+``update_currencies.py``
+========================
+
+:origin:`[source] <searxng_extra/update/update_currencies.py>`
+
+.. automodule:: searxng_extra.update.update_currencies
+ :members:
+
+``update_engine_descriptions.py``
+=================================
+
+:origin:`[source] <searxng_extra/update/update_engine_descriptions.py>`
+
+.. automodule:: searxng_extra.update.update_engine_descriptions
+ :members:
+
+
+``update_external_bangs.py``
+============================
+
+:origin:`[source] <searxng_extra/update/update_external_bangs.py>`
+
+.. automodule:: searxng_extra.update.update_external_bangs
+ :members:
+
+
+``update_firefox_version.py``
+=============================
+
+:origin:`[source] <searxng_extra/update/update_firefox_version.py>`
+
+.. automodule:: searxng_extra.update.update_firefox_version
+ :members:
+
+
+``update_engine_traits.py``
+===========================
+
+:origin:`[source] <searxng_extra/update/update_engine_traits.py>`
+
+.. automodule:: searxng_extra.update.update_engine_traits
+ :members:
+
+
+``update_osm_keys_tags.py``
+===========================
+
+:origin:`[source] <searxng_extra/update/update_osm_keys_tags.py>`
+
+.. automodule:: searxng_extra.update.update_osm_keys_tags
+ :members:
+
+
+``update_pygments.py``
+======================
+
+:origin:`[source] <searxng_extra/update/update_pygments.py>`
+
+.. automodule:: searxng_extra.update.update_pygments
+ :members:
+
+.. _update_locales.py:
+
+``update_locales.py``
+=====================
+
+:origin:`[source] <searxng_extra/update/update_locales.py>`
+
+.. automodule:: searxng_extra.update.update_locales
+ :members:
+
+
+``update_wikidata_units.py``
+============================
+
+:origin:`[source] <searxng_extra/update/update_wikidata_units.py>`
+
+.. automodule:: searxng_extra.update.update_wikidata_units
+ :members:
diff --git a/_sources/dev/translation.rst.txt b/_sources/dev/translation.rst.txt
new file mode 100644
index 000000000..57c76a0c1
--- /dev/null
+++ b/_sources/dev/translation.rst.txt
@@ -0,0 +1,81 @@
+.. _translation:
+
+===========
+Translation
+===========
+
+.. _translate.codeberg.org: https://translate.codeberg.org/projects/searxng/
+.. _Weblate: https://docs.weblate.org
+.. _translations branch: https://github.com/searxng/searxng/tree/translations
+.. _orphan branch: https://git-scm.com/docs/git-checkout#Documentation/git-checkout.txt---orphanltnewbranchgt
+.. _Weblate repository: https://translate.codeberg.org/projects/searxng/searxng/#repository
+.. _wlc: https://docs.weblate.org/en/latest/wlc.html
+
+.. |translated| image:: https://translate.codeberg.org/widgets/searxng/-/searxng/svg-badge.svg
+ :target: https://translate.codeberg.org/projects/searxng/
+
+.. sidebar:: |translated|
+
+ - :ref:`searx.babel_extract`
+ - Weblate_
+ - SearXNG `translations branch`_
+ - SearXNG `Weblate repository`_
+ - Weblate Client: wlc_
+ - Babel Command-Line: `pybabel <http://babel.pocoo.org/en/latest/cmdline.html>`_
+ - `weblate workflow <https://docs.weblate.org/en/latest/workflows.html>`_
+
+Translation takes place on translate.codeberg.org_.
+
+Translations which has been added by translators on the translate.codeberg.org_ UI are
+committed to Weblate's counterpart of the SearXNG *origin* repository which is
+located at ``https://translate.codeberg.org/git/searxng/searxng``.
+
+There is no need to clone this repository, :ref:`SearXNG Weblate workflow` take
+care of the synchronization with the *origin*. To avoid merging commits from
+the counterpart directly on the ``master`` branch of *SearXNG origin*, a *pull
+request* (PR) is created by this workflow.
+
+Weblate monitors the `translations branch`_, not the ``master`` branch. This
+branch is an `orphan branch`_, decoupled from the master branch (we already know
+orphan branches from the ``gh-pages``). The `translations branch`_ contains
+only the
+
+- ``translation/messages.pot`` and the
+- ``translation/*/messages.po`` files, nothing else.
+
+
+.. _SearXNG Weblate workflow:
+
+.. figure:: translation.svg
+
+ SearXNG's PR workflow to be in sync with Weblate
+
+Sync from *origin* to *weblate*: using ``make weblate.push.translations``
+ For each commit on the ``master`` branch of SearXNG *origin* the GitHub job
+ :origin:`babel / Update translations branch
+ <.github/workflows/integration.yml>` checks for updated translations.
+
+Sync from *weblate* to *origin*: using ``make weblate.translations.commit``
+ Every Friday, the GitHub workflow :origin:`babel / create PR for additions from
+ weblate <.github/workflows/translations-update.yml>` creates a PR with the
+ updated translation files:
+
+ - ``translation/messages.pot``,
+ - ``translation/*/messages.po`` and
+ - ``translation/*/messages.mo``
+
+wlc
+===
+
+.. _wlc configuration: https://docs.weblate.org/en/latest/wlc.html#wlc-config
+.. _API key: https://translate.codeberg.org/accounts/profile/#api
+
+All weblate integration is done by GitHub workflows, but if you want to use wlc_,
+copy this content into `wlc configuration`_ in your HOME ``~/.config/weblate``
+
+.. code-block:: ini
+
+ [keys]
+ https://translate.codeberg.org/api/ = APIKEY
+
+Replace ``APIKEY`` by your `API key`_.
diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt
new file mode 100644
index 000000000..3db54734a
--- /dev/null
+++ b/_sources/index.rst.txt
@@ -0,0 +1,54 @@
+==================
+Welcome to SearXNG
+==================
+
+ *Search without being tracked.*
+
+SearXNG is a free internet metasearch engine which aggregates results from more
+than 70 search services. Users are neither tracked nor profiled. Additionally,
+SearXNG can be used over Tor for online anonymity.
+
+Get started with SearXNG by using one of the instances listed at searx.space_.
+If you don't trust anyone, you can set up your own, see :ref:`installation`.
+
+.. sidebar:: features
+
+ - :ref:`self hosted <installation>`
+ - :ref:`no user tracking / no profiling <SearXNG protect privacy>`
+ - script & cookies are optional
+ - secure, encrypted connections
+ - :ref:`about 130 search engines <configured engines>`
+ - `about 60 translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
+ - about 100 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_
+ - :ref:`easy integration of search engines <demo online engine>`
+ - professional development: `CI <https://github.com/searxng/searxng/actions>`_,
+ `quality assurance <https://dev.searxng.org/>`_ &
+ `automated tested UI <https://dev.searxng.org/screenshots.html>`_
+
+.. sidebar:: be a part
+
+ SearXNG is driven by an open community, come join us! Don't hesitate, no
+ need to be an *expert*, everyone can contribute:
+
+ - `help to improve translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
+ - `discuss with the community <https://matrix.to/#/#searxng:matrix.org>`_
+ - report bugs & suggestions
+ - ...
+
+.. sidebar:: the origin
+
+ SearXNG development has been started in the middle of 2021 as a fork of the
+ searx project.
+
+
+.. toctree::
+ :maxdepth: 2
+
+ user/index
+ own-instance
+ admin/index
+ dev/index
+ utils/index
+ src/index
+
+.. _searx.space: https://searx.space
diff --git a/_sources/own-instance.rst.txt b/_sources/own-instance.rst.txt
new file mode 100644
index 000000000..62099ce23
--- /dev/null
+++ b/_sources/own-instance.rst.txt
@@ -0,0 +1,86 @@
+===========================
+Why use a private instance?
+===========================
+
+.. sidebar:: Is it worth to run my own instance?
+
+ \.\. is a common question among SearXNG users. Before answering this
+ question, see what options a SearXNG user has.
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+Public instances are open to everyone who has access to its URL. Usually, these
+are operated by unknown parties (from the users' point of view). Private
+instances can be used by a select group of people. It is for example a SearXNG of
+group of friends or a company which can be accessed through VPN. Also it can be
+single user one which runs on the user's laptop.
+
+To gain more insight on how these instances work let's dive into how SearXNG
+protects its users.
+
+.. _SearXNG protect privacy:
+
+How does SearXNG protect privacy?
+=================================
+
+SearXNG protects the privacy of its users in multiple ways regardless of the type
+of the instance (private, public). Removal of private data from search requests
+comes in three forms:
+
+ 1. removal of private data from requests going to search services
+ 2. not forwarding anything from a third party services through search services
+ (e.g. advertisement)
+ 3. removal of private data from requests going to the result pages
+
+Removing private data means not sending cookies to external search engines and
+generating a random browser profile for every request. Thus, it does not matter
+if a public or private instance handles the request, because it is anonymized in
+both cases. IP addresses will be the IP of the instance. But SearXNG can be
+configured to use proxy or Tor. `Result proxy
+<https://github.com/asciimoo/morty>`__ is supported, too.
+
+SearXNG does not serve ads or tracking content unlike most search services. So
+private data is not forwarded to third parties who might monetize it. Besides
+protecting users from search services, both referring page and search query are
+hidden from visited result pages.
+
+
+What are the consequences of using public instances?
+----------------------------------------------------
+
+If someone uses a public instance, they have to trust the administrator of that
+instance. This means that the user of the public instance does not know whether
+their requests are logged, aggregated and sent or sold to a third party.
+
+Also, public instances without proper protection are more vulnerable to abusing
+the search service, In this case the external service in exchange returns
+CAPTCHAs or bans the IP of the instance. Thus, search requests return less
+results.
+
+I see. What about private instances?
+------------------------------------
+
+If users run their :ref:`own instances <installation>`, everything is in their
+control: the source code, logging settings and private data. Unknown instance
+administrators do not have to be trusted.
+
+Furthermore, as the default settings of their instance is editable, there is no
+need to use cookies to tailor SearXNG to their needs. So preferences will not be
+reset to defaults when clearing browser cookies. As settings are stored on
+their computer, it will not be accessible to others as long as their computer is
+not compromised.
+
+Conclusion
+==========
+
+Always use an instance which is operated by people you trust. The privacy
+features of SearXNG are available to users no matter what kind of instance they
+use.
+
+If someone is on the go or just wants to try SearXNG for the first time public
+instances are the best choices. Additionally, public instance are making a
+world a better place, because those who cannot or do not want to run an
+instance, have access to a privacy respecting search service.
diff --git a/_sources/src/index.rst.txt b/_sources/src/index.rst.txt
new file mode 100644
index 000000000..fd16e7635
--- /dev/null
+++ b/_sources/src/index.rst.txt
@@ -0,0 +1,13 @@
+===========
+Source-Code
+===========
+
+This is a partial documentation of our source code. We are not aiming to document
+every item from the source code, but we will add documentation when requested.
+
+
+.. toctree::
+ :maxdepth: 2
+ :glob:
+
+ searx.*
diff --git a/_sources/src/searx.babel_extract.rst.txt b/_sources/src/searx.babel_extract.rst.txt
new file mode 100644
index 000000000..741d67fc1
--- /dev/null
+++ b/_sources/src/searx.babel_extract.rst.txt
@@ -0,0 +1,8 @@
+.. _searx.babel_extract:
+
+===============================
+Custom message extractor (i18n)
+===============================
+
+.. automodule:: searx.babel_extract
+ :members:
diff --git a/_sources/src/searx.botdetection.rst.txt b/_sources/src/searx.botdetection.rst.txt
new file mode 100644
index 000000000..04cb81dfd
--- /dev/null
+++ b/_sources/src/searx.botdetection.rst.txt
@@ -0,0 +1,62 @@
+.. _botdetection:
+
+=============
+Bot Detection
+=============
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.botdetection
+ :members:
+
+.. _botdetection ip_lists:
+
+IP lists
+========
+
+.. automodule:: searx.botdetection.ip_lists
+ :members:
+
+
+.. _botdetection rate limit:
+
+Rate limit
+==========
+
+.. automodule:: searx.botdetection.ip_limit
+ :members:
+
+.. automodule:: searx.botdetection.link_token
+ :members:
+
+
+.. _botdetection probe headers:
+
+Probe HTTP headers
+==================
+
+.. automodule:: searx.botdetection.http_accept
+ :members:
+
+.. automodule:: searx.botdetection.http_accept_encoding
+ :members:
+
+.. automodule:: searx.botdetection.http_accept_language
+ :members:
+
+.. automodule:: searx.botdetection.http_connection
+ :members:
+
+.. automodule:: searx.botdetection.http_user_agent
+ :members:
+
+.. _botdetection config:
+
+Config
+======
+
+.. automodule:: searx.botdetection.config
+ :members:
diff --git a/_sources/src/searx.exceptions.rst.txt b/_sources/src/searx.exceptions.rst.txt
new file mode 100644
index 000000000..72117e148
--- /dev/null
+++ b/_sources/src/searx.exceptions.rst.txt
@@ -0,0 +1,8 @@
+.. _searx.exceptions:
+
+==================
+SearXNG Exceptions
+==================
+
+.. automodule:: searx.exceptions
+ :members:
diff --git a/_sources/src/searx.infopage.rst.txt b/_sources/src/searx.infopage.rst.txt
new file mode 100644
index 000000000..243e5b0bd
--- /dev/null
+++ b/_sources/src/searx.infopage.rst.txt
@@ -0,0 +1,8 @@
+.. _searx.infopage:
+
+================
+Online ``/info``
+================
+
+.. automodule:: searx.infopage
+ :members:
diff --git a/_sources/src/searx.locales.rst.txt b/_sources/src/searx.locales.rst.txt
new file mode 100644
index 000000000..9882e7890
--- /dev/null
+++ b/_sources/src/searx.locales.rst.txt
@@ -0,0 +1,15 @@
+.. _searx.locales:
+
+=======
+Locales
+=======
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. automodule:: searx.locales
+ :members:
+
+
diff --git a/_sources/src/searx.plugins.tor_check.rst.txt b/_sources/src/searx.plugins.tor_check.rst.txt
new file mode 100644
index 000000000..905328ebf
--- /dev/null
+++ b/_sources/src/searx.plugins.tor_check.rst.txt
@@ -0,0 +1,9 @@
+.. _tor check plugin:
+
+================
+Tor check plugin
+================
+
+.. automodule:: searx.plugins.tor_check
+ :members:
+
diff --git a/_sources/src/searx.plugins.unit_converter.rst.txt b/_sources/src/searx.plugins.unit_converter.rst.txt
new file mode 100644
index 000000000..48d495d80
--- /dev/null
+++ b/_sources/src/searx.plugins.unit_converter.rst.txt
@@ -0,0 +1,9 @@
+.. _unit converter plugin:
+
+=====================
+Unit converter plugin
+=====================
+
+.. automodule:: searx.plugins.unit_converter
+ :members:
+
diff --git a/_sources/src/searx.redisdb.rst.txt b/_sources/src/searx.redisdb.rst.txt
new file mode 100644
index 000000000..625378c91
--- /dev/null
+++ b/_sources/src/searx.redisdb.rst.txt
@@ -0,0 +1,8 @@
+.. _redis db:
+
+========
+Redis DB
+========
+
+.. automodule:: searx.redisdb
+ :members:
diff --git a/_sources/src/searx.redislib.rst.txt b/_sources/src/searx.redislib.rst.txt
new file mode 100644
index 000000000..b4604574c
--- /dev/null
+++ b/_sources/src/searx.redislib.rst.txt
@@ -0,0 +1,8 @@
+.. _searx.redis:
+
+=============
+Redis Library
+=============
+
+.. automodule:: searx.redislib
+ :members:
diff --git a/_sources/src/searx.search.processors.rst.txt b/_sources/src/searx.search.processors.rst.txt
new file mode 100644
index 000000000..3bb4c44bc
--- /dev/null
+++ b/_sources/src/searx.search.processors.rst.txt
@@ -0,0 +1,47 @@
+.. _searx.search.processors:
+
+=================
+Search processors
+=================
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+Abstract processor class
+========================
+
+.. automodule:: searx.search.processors.abstract
+ :members:
+
+Offline processor
+=================
+
+.. automodule:: searx.search.processors.offline
+ :members:
+
+Online processor
+================
+
+.. automodule:: searx.search.processors.online
+ :members:
+
+Online currency processor
+=========================
+
+.. automodule:: searx.search.processors.online_currency
+ :members:
+
+Online dictionary processor
+===========================
+
+.. automodule:: searx.search.processors.online_dictionary
+ :members:
+
+Online URL search processor
+===========================
+
+.. automodule:: searx.search.processors.online_url_search
+ :members:
diff --git a/_sources/src/searx.search.rst.txt b/_sources/src/searx.search.rst.txt
new file mode 100644
index 000000000..ad76d4183
--- /dev/null
+++ b/_sources/src/searx.search.rst.txt
@@ -0,0 +1,38 @@
+.. _searx.search:
+
+======
+Search
+======
+
+.. autoclass:: searx.search.EngineRef
+ :members:
+
+.. autoclass:: searx.search.SearchQuery
+ :members:
+
+.. autoclass:: searx.search.Search
+
+ .. attribute:: search_query
+ :type: searx.search.SearchQuery
+
+ .. attribute:: result_container
+ :type: searx.results.ResultContainer
+
+ .. automethod:: search() -> searx.results.ResultContainer
+
+.. autoclass:: searx.search.SearchWithPlugins
+ :members:
+
+ .. attribute:: search_query
+ :type: searx.search.SearchQuery
+
+ .. attribute:: result_container
+ :type: searx.results.ResultContainer
+
+ .. attribute:: ordered_plugin_list
+ :type: typing.List
+
+ .. attribute:: request
+ :type: flask.request
+
+ .. automethod:: search() -> searx.results.ResultContainer
diff --git a/_sources/src/searx.utils.rst.txt b/_sources/src/searx.utils.rst.txt
new file mode 100644
index 000000000..6496700c1
--- /dev/null
+++ b/_sources/src/searx.utils.rst.txt
@@ -0,0 +1,8 @@
+.. _searx.utils:
+
+=================================
+Utility functions for the engines
+=================================
+
+.. automodule:: searx.utils
+ :members:
diff --git a/_sources/user/about.rst.txt b/_sources/user/about.rst.txt
new file mode 100644
index 000000000..08f1a068e
--- /dev/null
+++ b/_sources/user/about.rst.txt
@@ -0,0 +1,4 @@
+.. _about SearXNG:
+
+.. include:: about.md
+ :parser: myst_parser.sphinx_
diff --git a/_sources/user/configured_engines.rst.txt b/_sources/user/configured_engines.rst.txt
new file mode 100644
index 000000000..c32a264ed
--- /dev/null
+++ b/_sources/user/configured_engines.rst.txt
@@ -0,0 +1,89 @@
+.. _configured engines:
+
+==================
+Configured Engines
+==================
+
+.. sidebar:: Further reading ..
+
+ - :ref:`settings categories_as_tabs`
+ - :ref:`engines-dev`
+ - :ref:`settings engine`
+ - :ref:`general engine configuration`
+
+.. jinja:: searx
+
+ SearXNG supports {{engines | length}} search engines of which
+ {{enabled_engine_count}} are enabled by default.
+
+ Engines can be assigned to multiple :ref:`categories <engine categories>`.
+ The UI displays the tabs that are configured in :ref:`categories_as_tabs
+ <settings categories_as_tabs>`. In addition to these UI categories (also
+ called *tabs*), engines can be queried by their name or the categories they
+ belong to, by using a :ref:`\!bing syntax <search-syntax>`.
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+.. jinja:: searx
+
+ {% for category, engines in categories_as_tabs.items() %}
+
+ tab ``!{{category.replace(' ', '_')}}``
+ ---------------------------------------
+
+ {% for group, group_bang, engines in engines | group_engines_in_tab %}
+
+ {% if loop.length > 1 %}
+ {% if group_bang %}group ``{{group_bang}}``{% else %}{{group}}{% endif %}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ {% endif %}
+
+ .. flat-table::
+ :header-rows: 2
+ :stub-columns: 1
+ :widths: 10 1 10 1 1 1 1 1 1 1
+
+ * - :cspan:`5` Engines configured by default (in :ref:`settings.yml <engine settings>`)
+ - :cspan:`3` :ref:`Supported features <engine file>`
+
+ * - Name
+ - !bang
+ - Module
+ - Disabled
+ - Timeout
+ - Weight
+ - Paging
+ - Locale
+ - Safe search
+ - Time range
+
+ {% for mod in engines %}
+
+ * - `{{mod.name}} <{{mod.about and mod.about.website}}>`_
+ {%- if mod.about and mod.about.language %}
+ ({{mod.about.language | upper}})
+ {%- endif %}
+ - ``!{{mod.shortcut}}``
+ - {%- if 'searx.engines.' + mod.__name__ in documented_modules %}
+ :py:mod:`~searx.engines.{{mod.__name__}}`
+ {%- else %}
+ :origin:`{{mod.__name__}} <searx/engines/{{mod.__name__}}.py>`
+ {%- endif %}
+ - {{(mod.disabled and "y") or ""}}
+ - {{mod.timeout}}
+ - {{mod.weight or 1 }}
+ {% if mod.engine_type == 'online' %}
+ - {{(mod.paging and "y") or ""}}
+ - {{(mod.language_support and "y") or ""}}
+ - {{(mod.safesearch and "y") or ""}}
+ - {{(mod.time_range_support and "y") or ""}}
+ {% else %}
+ - :cspan:`3` not applicable ({{mod.engine_type}})
+ {% endif %}
+
+ {% endfor %}
+ {% endfor %}
+ {% endfor %}
diff --git a/_sources/user/index.rst.txt b/_sources/user/index.rst.txt
new file mode 100644
index 000000000..705fd3f9e
--- /dev/null
+++ b/_sources/user/index.rst.txt
@@ -0,0 +1,15 @@
+================
+User information
+================
+
+.. contents::
+ :depth: 3
+ :local:
+ :backlinks: entry
+
+.. toctree::
+ :maxdepth: 2
+
+ search-syntax
+ configured_engines
+ about
diff --git a/_sources/user/search-syntax.rst.txt b/_sources/user/search-syntax.rst.txt
new file mode 100644
index 000000000..3acddd6e3
--- /dev/null
+++ b/_sources/user/search-syntax.rst.txt
@@ -0,0 +1,4 @@
+.. _search-syntax:
+
+.. include:: search-syntax.md
+ :parser: myst_parser.sphinx_
diff --git a/_sources/utils/index.rst.txt b/_sources/utils/index.rst.txt
new file mode 100644
index 000000000..b570b07e6
--- /dev/null
+++ b/_sources/utils/index.rst.txt
@@ -0,0 +1,31 @@
+.. _searx_utils:
+.. _toolboxing:
+
+==================
+DevOps tooling box
+==================
+
+In the folder :origin:`utils/` we maintain some tools useful for administrators
+and developers.
+
+.. toctree::
+ :maxdepth: 2
+
+ searxng.sh
+ lxc.sh
+
+Common command environments
+===========================
+
+The scripts in our tooling box often dispose of common environments:
+
+.. _FORCE_TIMEOUT:
+
+``FORCE_TIMEOUT`` : environment
+ Sets timeout for interactive prompts. If you want to run a script in batch
+ job, with defaults choices, set ``FORCE_TIMEOUT=0``. By example; to install a
+ SearXNG server and nginx proxy on all containers of the :ref:`SearXNG suite
+ <lxc-searxng.env>` use::
+
+ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install all
+ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
diff --git a/_sources/utils/lxc.sh.rst.txt b/_sources/utils/lxc.sh.rst.txt
new file mode 100644
index 000000000..fae302c90
--- /dev/null
+++ b/_sources/utils/lxc.sh.rst.txt
@@ -0,0 +1,295 @@
+
+.. _snap: https://snapcraft.io
+.. _snapcraft LXD: https://snapcraft.io/lxd
+.. _LXC/LXD Image Server: https://uk.images.linuxcontainers.org/
+.. _LXC: https://linuxcontainers.org/lxc/introduction/
+.. _LXD: https://linuxcontainers.org/lxd/introduction/
+.. _`LXD@github`: https://github.com/lxc/lxd
+
+.. _archlinux: https://www.archlinux.org/
+
+.. _lxc.sh:
+
+================
+``utils/lxc.sh``
+================
+
+With the use of *Linux Containers* (LXC_) we can scale our tasks over a stack of
+containers, what we call the: *lxc suite*. The :ref:`lxc-searxng.env` is
+loaded by default, every time you start the ``lxc.sh`` script (*you do not need
+to care about*).
+
+.. sidebar:: further reading
+
+ - snap_, `snapcraft LXD`_
+ - LXC_, LXD_
+ - `LXC/LXD Image Server`_
+ - `LXD@github`_
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _lxd install:
+
+Install LXD
+===========
+
+Before you can start with containers, you need to install and initiate LXD_
+once::
+
+ $ snap install lxd
+ $ lxd init --auto
+
+To make use of the containers from the *SearXNG suite*, you have to build the
+:ref:`LXC suite containers <lxc.sh help>` initial. But be warned, **this might
+take some time**::
+
+ $ sudo -H ./utils/lxc.sh build
+
+.. sidebar:: hint
+
+ If you have issues with the internet connectivity of your containers read
+ section :ref:`internet connectivity docker`.
+
+A cup of coffee later, your LXC suite is build up and you can run whatever task
+you want / in a selected or even in all :ref:`LXC suite containers <lxc.sh
+help>`.
+
+.. _internet connectivity docker:
+
+Internet Connectivity & Docker
+------------------------------
+
+.. sidebar:: further read
+
+ - `Docker blocking network of existing LXC containers <https://github.com/docker/for-linux/issues/103>`__
+ - `Docker and IPtables (fralef.me) <https://fralef.me/docker-and-iptables.html>`__
+ - `Docker and iptables (docker.com) <https://docs.docker.com/network/iptables/#docker-on-a-router/>`__
+
+There is a conflict in the ``iptables`` setup of Docker & LXC. If you have
+docker installed, you may find that the internet connectivity of your LXD
+containers no longer work.
+
+Whenever docker is started (reboot) it sets the iptables policy for the
+``FORWARD`` chain to ``DROP`` `[ref]
+<https://docs.docker.com/network/iptables/#docker-on-a-router>`__::
+
+ $ sudo -H iptables-save | grep FORWARD
+ :FORWARD ACCEPT [7048:7851230]
+ :FORWARD DROP [7048:7851230]
+
+A handy solution of this problem might be to reset the policy for the
+``FORWARD`` chain after the network has been initialized. For this create a
+file in the ``if-up`` section of the network (``/etc/network/if-up.d/iptable``)
+and insert the following lines::
+
+ #!/bin/sh
+ iptables -F FORWARD
+ iptables -P FORWARD ACCEPT
+
+Don't forget to set the execution bit::
+
+ sudo chmod ugo+x /etc/network/if-up.d/iptable
+
+Reboot your system and check the iptables rules::
+
+ $ sudo -H iptables-save | grep FORWARD
+ :FORWARD ACCEPT [7048:7851230]
+ :FORWARD ACCEPT [7048:7851230]
+
+
+.. _searxng lxc suite:
+
+SearXNG LXC suite
+=================
+
+The intention of the *SearXNG LXC suite* is to build up a suite of containers
+for development tasks or :ref:`buildhosts <Setup SearXNG buildhost>` with a very
+small set of simple commands. At the end of the ``--help`` output the SearXNG
+suite from the :ref:`lxc-searxng.env` is introduced::
+
+ $ sudo -H ./utils/lxc.sh --help
+ ...
+ LXC suite: searxng
+ Suite includes installation of SearXNG
+ images: ubu2004 ubu2204 fedora35 archlinux
+ containers: searxng-ubu2004 searxng-ubu2204 searxng-fedora35 searxng-archlinux
+
+As shown above there are images and containers build up on this images. To show
+more info about the containers in the *SearXNG LXC suite* call ``show suite``.
+If this is the first time you make use of the SearXNG LXC suite, no containers
+are installed and the output is::
+
+ $ sudo -H ./utils/lxc.sh show suite
+
+ LXC suite (searxng-*)
+ =====================
+
+ +------+-------+------+------+------+-----------+
+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+ +------+-------+------+------+------+-----------+
+
+ WARN: container searxng-ubu2004 does not yet exists
+ WARN: container searxng-ubu2204 does not yet exists
+ WARN: container searxng-fedora35 does not yet exists
+ WARN: container searxng-archlinux does not yet exists
+
+If you do not want to run a command or a build in all containers, **you can
+build just one**. Here by example in the container that is build upon the
+*archlinux* image::
+
+ $ sudo -H ./utils/lxc.sh build searxng-archlinux
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux pwd
+
+Otherwise, to apply a command to all containers you can use::
+
+ $ sudo -H ./utils/lxc.sh build
+ $ sudo -H ./utils/lxc.sh cmd -- ls -la .
+
+Running commands
+----------------
+
+**Inside containers, you can run scripts** from the :ref:`toolboxing` or run
+what ever command you need. By example, to start a bash use::
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux bash
+ INFO: [searxng-archlinux] bash
+ [root@searxng-archlinux SearXNG]#
+
+.. _Good to know:
+
+Good to know
+------------
+
+Each container shares the root folder of the repository and the command
+``utils/lxc.sh cmd`` **handle relative path names transparent**::
+
+ $ pwd
+ /share/SearXNG
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux pwd
+ INFO: [searxng-archlinux] pwd
+ /share/SearXNG
+
+The path ``/share/SearXNG`` will be different on your HOST system. The commands
+in the container are executed by the ``root`` inside of the container. Compare
+output of::
+
+ $ ls -li Makefile
+ 47712402 -rw-rw-r-- 1 markus markus 2923 Apr 19 13:52 Makefile
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux ls -li Makefile
+ INFO: [searxng-archlinux] ls -li Makefile
+ 47712402 -rw-rw-r-- 1 root root 2923 Apr 19 11:52 Makefile
+ ...
+
+Since the path ``/share/SearXNG`` of the HOST system is wrapped into the
+container under the same name, the shown ``Makefile`` (inode ``47712402``) in
+the output is always the identical ``/share/SearXNG/Makefile`` from the HOST
+system. In the example shown above the owner of the path in the container is
+the ``root`` user of the container (and the timezone in the container is
+different to HOST system).
+
+
+.. _lxc.sh install suite:
+
+Install suite
+-------------
+
+.. sidebar:: further read
+
+ - :ref:`working in containers`
+ - :ref:`FORCE_TIMEOUT <FORCE_TIMEOUT>`
+
+To install the complete :ref:`SearXNG suite <lxc-searxng.env>` into **all** LXC_
+containers leave the container argument empty and run::
+
+ $ sudo -H ./utils/lxc.sh build
+ $ sudo -H ./utils/lxc.sh install suite
+
+To *build & install* suite only in one container you can use by example::
+
+ $ sudo -H ./utils/lxc.sh build searxng-archlinux
+ $ sudo -H ./utils/lxc.sh install suite searxng-archlinux
+
+The command above installs a SearXNG suite (see :ref:`installation scripts`).
+To :ref:`install a nginx <installation nginx>` reverse proxy (or alternatively
+use :ref:`apache <installation apache>`)::
+
+ $ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
+
+Same operation just in one container of the suite::
+
+ $ sudo -H ./utils/lxc.sh cmd searxng-archlinux FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
+
+The :ref:`FORCE_TIMEOUT <FORCE_TIMEOUT>` environment is set to zero to run the
+script without user interaction.
+
+To get the IP (URL) of the SearXNG service in the containers use ``show suite``
+command. To test instances from containers just open the URLs in your
+WEB-Browser::
+
+ $ sudo ./utils/lxc.sh show suite | grep SEARXNG_URL
+
+ [searxng-ubu2110] SEARXNG_URL : http://n.n.n.170/searxng
+ [searxng-ubu2004] SEARXNG_URL : http://n.n.n.160/searxng
+ [searxnggfedora35] SEARXNG_URL : http://n.n.n.150/searxng
+ [searxng-archlinux] SEARXNG_URL : http://n.n.n.140/searxng
+
+Clean up
+--------
+
+If there comes the time you want to **get rid off all** the containers and
+**clean up local images** just type::
+
+ $ sudo -H ./utils/lxc.sh remove
+ $ sudo -H ./utils/lxc.sh remove images
+
+
+.. _Setup SearXNG buildhost:
+
+Setup SearXNG buildhost
+=======================
+
+You can **install the SearXNG buildhost environment** into one or all containers.
+The installation procedure to set up a :ref:`build host<buildhosts>` takes its
+time. Installation in all containers will take more time (time for another cup
+of coffee). ::
+
+ sudo -H ./utils/lxc.sh cmd -- ./utils/searxng.sh install buildhost
+
+To build (live) documentation inside a archlinux_ container::
+
+ sudo -H ./utils/lxc.sh cmd searxng-archlinux make docs.clean docs.live
+ ...
+ [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
+
+To get IP of the container and the port number *live docs* is listening::
+
+ $ sudo ./utils/lxc.sh show suite | grep docs.live
+ ...
+ [searxng-archlinux] INFO: (eth0) docs.live: http://n.n.n.140:8080/
+
+
+.. _lxc.sh help:
+
+Command Help
+============
+
+The ``--help`` output of the script is largely self-explanatory:
+
+.. program-output:: ../utils/lxc.sh --help
+
+
+.. _lxc-searxng.env:
+
+SearXNG suite config
+====================
+
+The SearXNG suite is defined in the file :origin:`utils/lxc-searxng.env`:
+
+.. literalinclude:: ../../utils/lxc-searxng.env
+ :language: bash
diff --git a/_sources/utils/searxng.sh.rst.txt b/_sources/utils/searxng.sh.rst.txt
new file mode 100644
index 000000000..bedc1ba4c
--- /dev/null
+++ b/_sources/utils/searxng.sh.rst.txt
@@ -0,0 +1,42 @@
+
+.. _searxng.sh:
+
+====================
+``utils/searxng.sh``
+====================
+
+To simplify the installation and maintenance of a SearXNG instance you can use the
+script :origin:`utils/searxng.sh`.
+
+.. sidebar:: further reading
+
+ - :ref:`architecture`
+ - :ref:`installation`
+ - :ref:`installation nginx`
+ - :ref:`installation apache`
+
+.. contents::
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+Install
+=======
+
+In most cases you will install SearXNG simply by running the command:
+
+.. code:: bash
+
+ sudo -H ./utils/searx.sh install all
+
+The installation is described in chapter :ref:`installation basic`.
+
+.. _searxng.sh overview:
+
+Command Help
+============
+
+The ``--help`` output of the script is largely self-explanatory:
+
+.. program-output:: ../utils/searxng.sh --help
diff --git a/_static/basic.css b/_static/basic.css
new file mode 100644
index 000000000..f316efcb4
--- /dev/null
+++ b/_static/basic.css
@@ -0,0 +1,925 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+div.section::after {
+ display: block;
+ content: '';
+ clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+ word-wrap: break-word;
+ overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+ overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ float: left;
+ width: 80%;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ float: left;
+ width: 20%;
+ border-left: none;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li p.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+ min-width: 360px;
+ max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+
+a.headerlink {
+ visibility: hidden;
+}
+
+a:visited {
+ color: #551A8B;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-default {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+ clear: right;
+ overflow-x: auto;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+ clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+ margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+ display: block;
+ content: '';
+ clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.align-default {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+ margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+ margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+ margin: 0.5em;
+ padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+ padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+ margin: 1em 0;
+}
+
+table.hlist td {
+ vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.sig-name {
+ font-size: 1.1em;
+}
+
+code.descname {
+ font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.sig-param.n {
+ font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+ font-family: unset;
+}
+
+.sig.c .k, .sig.c .kt,
+.sig.cpp .k, .sig.cpp .kt {
+ color: #0033B3;
+}
+
+.sig.c .m,
+.sig.cpp .m {
+ color: #1750EB;
+}
+
+.sig.c .s, .sig.c .sc,
+.sig.cpp .s, .sig.cpp .sc {
+ color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+ margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+ margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+ margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+ margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+ margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+ float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+ padding-right: 0.5em;
+}
+aside.footnote > p {
+ margin-left: 2em;
+}
+div.citation > p {
+ margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+ margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+ content: "";
+ clear: both;
+}
+
+dl.field-list {
+ display: grid;
+ grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+ font-weight: bold;
+ word-break: break-word;
+ padding-left: 0.5em;
+ padding-right: 5px;
+}
+
+dl.field-list > dd {
+ padding-left: 0.5em;
+ margin-top: 0em;
+ margin-left: 0em;
+ margin-bottom: 0em;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd > :first-child {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+.sig dd {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.sig dl {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+ background-color: #fbe54e;
+}
+
+rect.highlighted {
+ fill: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+.classifier:before {
+ font-style: normal;
+ margin: 0 0.5em;
+ content: ":";
+ display: inline-block;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+.translated {
+ background-color: rgba(207, 255, 207, 0.2)
+}
+
+.untranslated {
+ background-color: rgba(255, 207, 207, 0.2)
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+ clear: both;
+}
+
+span.pre {
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ -webkit-hyphens: none;
+ hyphens: none;
+ white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+ margin: 1em 0;
+}
+
+td.linenos pre {
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ display: block;
+}
+
+table.highlighttable tbody {
+ display: block;
+}
+
+table.highlighttable tr {
+ display: flex;
+}
+
+table.highlighttable td {
+ margin: 0;
+ padding: 0;
+}
+
+table.highlighttable td.linenos {
+ padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+ flex: 1;
+ overflow: hidden;
+}
+
+.highlight .hll {
+ display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+ margin: 0;
+}
+
+div.code-block-caption + div {
+ margin-top: 0;
+}
+
+div.code-block-caption {
+ margin-top: 1em;
+ padding: 2px 5px;
+ font-size: small;
+}
+
+div.code-block-caption code {
+ background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp { /* gp: Generic.Prompt */
+ user-select: none;
+ -webkit-user-select: text; /* Safari fallback only */
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ margin: 1em 0;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+span.eqno a.headerlink {
+ position: absolute;
+ z-index: 1;
+}
+
+div.math:hover a.headerlink {
+ visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+} \ No newline at end of file
diff --git a/_static/doctools.js b/_static/doctools.js
new file mode 100644
index 000000000..4d67807d1
--- /dev/null
+++ b/_static/doctools.js
@@ -0,0 +1,156 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ *
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+ "TEXTAREA",
+ "INPUT",
+ "SELECT",
+ "BUTTON",
+]);
+
+const _ready = (callback) => {
+ if (document.readyState !== "loading") {
+ callback();
+ } else {
+ document.addEventListener("DOMContentLoaded", callback);
+ }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+ init: () => {
+ Documentation.initDomainIndexTable();
+ Documentation.initOnKeyListeners();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS: {},
+ PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+ LOCALE: "unknown",
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext: (string) => {
+ const translated = Documentation.TRANSLATIONS[string];
+ switch (typeof translated) {
+ case "undefined":
+ return string; // no translation
+ case "string":
+ return translated; // translation exists
+ default:
+ return translated[0]; // (singular, plural) translation tuple exists
+ }
+ },
+
+ ngettext: (singular, plural, n) => {
+ const translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated !== "undefined")
+ return translated[Documentation.PLURAL_EXPR(n)];
+ return n === 1 ? singular : plural;
+ },
+
+ addTranslations: (catalog) => {
+ Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+ Documentation.PLURAL_EXPR = new Function(
+ "n",
+ `return (${catalog.plural_expr})`
+ );
+ Documentation.LOCALE = catalog.locale;
+ },
+
+ /**
+ * helper function to focus on search bar
+ */
+ focusSearchBar: () => {
+ document.querySelectorAll("input[name=q]")[0]?.focus();
+ },
+
+ /**
+ * Initialise the domain index toggle buttons
+ */
+ initDomainIndexTable: () => {
+ const toggler = (el) => {
+ const idNumber = el.id.substr(7);
+ const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+ if (el.src.substr(-9) === "minus.png") {
+ el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+ toggledRows.forEach((el) => (el.style.display = "none"));
+ } else {
+ el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+ toggledRows.forEach((el) => (el.style.display = ""));
+ }
+ };
+
+ const togglerElements = document.querySelectorAll("img.toggler");
+ togglerElements.forEach((el) =>
+ el.addEventListener("click", (event) => toggler(event.currentTarget))
+ );
+ togglerElements.forEach((el) => (el.style.display = ""));
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+ },
+
+ initOnKeyListeners: () => {
+ // only install a listener if it is really needed
+ if (
+ !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
+ !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+ )
+ return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+ if (!event.shiftKey) {
+ switch (event.key) {
+ case "ArrowLeft":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const prevLink = document.querySelector('link[rel="prev"]');
+ if (prevLink && prevLink.href) {
+ window.location.href = prevLink.href;
+ event.preventDefault();
+ }
+ break;
+ case "ArrowRight":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const nextLink = document.querySelector('link[rel="next"]');
+ if (nextLink && nextLink.href) {
+ window.location.href = nextLink.href;
+ event.preventDefault();
+ }
+ break;
+ }
+ }
+
+ // some keyboard layouts may need Shift to get /
+ switch (event.key) {
+ case "/":
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+ Documentation.focusSearchBar();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/_static/documentation_options.js b/_static/documentation_options.js
new file mode 100644
index 000000000..91e2d98bf
--- /dev/null
+++ b/_static/documentation_options.js
@@ -0,0 +1,13 @@
+const DOCUMENTATION_OPTIONS = {
+ VERSION: '2024.5.10+ffb1001f8',
+ LANGUAGE: 'en',
+ COLLAPSE_INDEX: false,
+ BUILDER: 'html',
+ FILE_SUFFIX: '.html',
+ LINK_SUFFIX: '.html',
+ HAS_SOURCE: true,
+ SOURCELINK_SUFFIX: '.txt',
+ NAVIGATION_WITH_KEYS: false,
+ SHOW_SEARCH_SUMMARY: true,
+ ENABLE_SEARCH_SHORTCUTS: true,
+}; \ No newline at end of file
diff --git a/_static/file.png b/_static/file.png
new file mode 100644
index 000000000..a858a410e
--- /dev/null
+++ b/_static/file.png
Binary files differ
diff --git a/_static/language_data.js b/_static/language_data.js
new file mode 100644
index 000000000..367b8ed81
--- /dev/null
+++ b/_static/language_data.js
@@ -0,0 +1,199 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
+
+
+/* Non-minified version is copied as a separate JS file, if available */
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+ var step2list = {
+ ational: 'ate',
+ tional: 'tion',
+ enci: 'ence',
+ anci: 'ance',
+ izer: 'ize',
+ bli: 'ble',
+ alli: 'al',
+ entli: 'ent',
+ eli: 'e',
+ ousli: 'ous',
+ ization: 'ize',
+ ation: 'ate',
+ ator: 'ate',
+ alism: 'al',
+ iveness: 'ive',
+ fulness: 'ful',
+ ousness: 'ous',
+ aliti: 'al',
+ iviti: 'ive',
+ biliti: 'ble',
+ logi: 'log'
+ };
+
+ var step3list = {
+ icate: 'ic',
+ ative: '',
+ alize: 'al',
+ iciti: 'ic',
+ ical: 'ic',
+ ful: '',
+ ness: ''
+ };
+
+ var c = "[^aeiou]"; // consonant
+ var v = "[aeiouy]"; // vowel
+ var C = c + "[^aeiouy]*"; // consonant sequence
+ var V = v + "[aeiou]*"; // vowel sequence
+
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
+ var s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ this.stemWord = function (w) {
+ var stem;
+ var suffix;
+ var firstch;
+ var origword = w;
+
+ if (w.length < 3)
+ return w;
+
+ var re;
+ var re2;
+ var re3;
+ var re4;
+
+ firstch = w.substr(0,1);
+ if (firstch == "y")
+ w = firstch.toUpperCase() + w.substr(1);
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w))
+ w = w.replace(re,"$1$2");
+ else if (re2.test(w))
+ w = w.replace(re2,"$1$2");
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w))
+ w = w + "e";
+ else if (re3.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ else if (re4.test(w))
+ w = w + "e";
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem))
+ w = stem + "i";
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step2list[suffix];
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step3list[suffix];
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem))
+ w = stem;
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem))
+ w = stem;
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+ w = stem;
+ }
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+ if (firstch == "y")
+ w = firstch.toLowerCase() + w.substr(1);
+ return w;
+ }
+}
+
diff --git a/_static/minus.png b/_static/minus.png
new file mode 100644
index 000000000..d96755fda
--- /dev/null
+++ b/_static/minus.png
Binary files differ
diff --git a/_static/plus.png b/_static/plus.png
new file mode 100644
index 000000000..7107cec93
--- /dev/null
+++ b/_static/plus.png
Binary files differ
diff --git a/_static/pocoo.css b/_static/pocoo.css
new file mode 100644
index 000000000..4f14b31ee
--- /dev/null
+++ b/_static/pocoo.css
@@ -0,0 +1,525 @@
+@import url("basic.css");
+
+/* -- page layout --------------------------------------------------- */
+
+body {
+ font-family: 'Garamond', 'Georgia', serif;
+ font-size: 17px;
+ background-color: #fff;
+ color: #3e4349;
+ margin: 0;
+ padding: 0;
+}
+
+div.related {
+ max-width: 1140px;
+ margin: 10px auto;
+
+ /* displayed on mobile */
+ display: none;
+}
+
+div.document {
+ max-width: 1140px;
+ margin: 10px auto;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 220px;
+}
+
+div.body {
+ min-width: initial;
+ max-width: initial;
+ padding: 0 30px;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 10px;
+}
+
+div.sphinxsidebar {
+ width: 220px;
+ font-size: 14px;
+ line-height: 1.5;
+ color: #444;
+}
+
+div.sphinxsidebar li {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+div.sphinxsidebar li:hover {
+ overflow: visible;
+}
+
+div.sphinxsidebar a,
+div.sphinxsidebar a code {
+ color: #444;
+ border-color: #444;
+}
+
+div.sphinxsidebar a:hover {
+ background-color:#fff;
+}
+
+div.sphinxsidebar p.logo {
+ margin: 0;
+ text-align: center;
+}
+
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+ font-size: 24px;
+ color: #444;
+}
+
+div.sphinxsidebar p.logo a,
+div.sphinxsidebar h3 a,
+div.sphinxsidebar p.logo a:hover,
+div.sphinxsidebar h3 a:hover {
+ border: none;
+}
+
+div.sphinxsidebar p,
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+ margin: 10px 0;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px 0;
+ padding: 0;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #999;
+ font-size: 1em;
+}
+
+div.footer {
+ max-width: 1140px;
+ margin: 20px auto;
+ font-size: 14px;
+ text-align: right;
+ color: #888;
+}
+
+div.footer a {
+ color: #888;
+ border-color: #888;
+}
+
+/* -- quick search -------------------------------------------------- */
+
+div.sphinxsidebar #searchbox form {
+ display: flex;
+}
+
+div.sphinxsidebar #searchbox form > div {
+ display: flex;
+ flex: 1 1 auto;
+}
+
+div.sphinxsidebar #searchbox input[type=text] {
+ flex: 1 1 auto;
+ width: 1% !important;
+}
+
+div.sphinxsidebar #searchbox input[type=submit] {
+ border-left-width: 0;
+}
+
+/* -- versions ------------------------------------------------------ */
+
+div.sphinxsidebar ul.versions a.current {
+ font-style: italic;
+ border-bottom: 1px solid #000;
+ color: #000;
+}
+
+div.sphinxsidebar ul.versions span.note {
+ color: #999;
+}
+
+/* -- version warning ----------------------------------------------- */
+
+p.version-warning {
+ top: 10px;
+ position: sticky;
+
+ margin: 10px 0;
+ padding: 5px 10px;
+ border-radius: 4px;
+
+ letter-spacing: 1px;
+ color: #fff;
+ text-shadow: 0 0 2px #000;
+ text-align: center;
+
+ background: #d40 repeating-linear-gradient(
+ 135deg,
+ transparent,
+ transparent 56px,
+ rgba(255, 255, 255, 0.2) 56px,
+ rgba(255, 255, 255, 0.2) 112px
+ );
+}
+
+p.version-warning a {
+ color: #fff;
+ border-color: #fff;
+}
+
+/* -- body styles --------------------------------------------------- */
+
+a {
+ text-decoration: underline;
+ text-decoration-style: dotted;
+ text-decoration-color: #000;
+ text-decoration-thickness: 1px;
+}
+
+a:hover {
+ text-decoration-style: solid;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: normal;
+ margin: 30px 0 10px;
+ padding: 0;
+ color: black;
+}
+
+div.body h1 {
+ font-size: 240%;
+}
+
+div.body h2 {
+ font-size: 180%;
+}
+
+div.body h3 {
+ font-size: 150%;
+}
+
+div.body h4 {
+ font-size: 130%;
+}
+
+div.body h5 {
+ font-size: 100%;
+}
+
+div.body h6 {
+ font-size: 100%;
+}
+
+div.body h1:first-of-type {
+ margin-top: 0;
+}
+
+a.headerlink {
+ color: #ddd;
+ margin: 0 0.2em;
+ padding: 0 0.2em;
+ border: none;
+}
+
+a.headerlink:hover {
+ color: #444;
+}
+
+div.body p,
+div.body dd,
+div.body li {
+ line-height: 1.4;
+}
+
+img.screenshot {
+ box-shadow: 2px 2px 4px #eee;
+}
+
+hr {
+ border: 1px solid #999;
+}
+
+blockquote {
+ margin: 0 0 0 30px;
+ padding: 0;
+}
+
+ul, ol {
+ margin: 10px 0 10px 30px;
+ padding: 0;
+}
+
+a.footnote-reference {
+ font-size: 0.7em;
+ vertical-align: top;
+}
+
+/* -- admonitions --------------------------------------------------- */
+
+div.admonition,
+div.topic {
+ background-color: #fafafa;
+ margin: 10px -10px;
+ padding: 10px;
+ border-top: 1px solid #ccc;
+ border-right: none;
+ border-bottom: 1px solid #ccc;
+ border-left: none;
+}
+
+div.admonition p.admonition-title,
+div.topic p.topic-title {
+ font-weight: normal;
+ font-size: 24px;
+ margin: 0 0 10px 0;
+ padding: 0;
+ line-height: 1;
+ display: inline;
+}
+
+p.admonition-title::after {
+ content: ":";
+}
+
+div.admonition p.last,
+div.topic p:last-child {
+ margin-bottom: 0;
+}
+
+div.danger, div.error {
+ background-color: #fff0f0;
+ border-color: #ffb0b0;
+}
+
+div.seealso {
+ background-color: #fffff0;
+ border-color: #f0f0a8;
+}
+
+/* -- changelog ----------------------------------------------------- */
+
+details.changelog summary {
+ cursor: pointer;
+ font-style: italic;
+ margin-bottom: 10px;
+}
+
+/* -- search highlight ---------------------------------------------- */
+
+dt:target,
+.footnote:target,
+span.highlighted {
+ background-color: #ffdf80;
+}
+
+rect.highlighted {
+ fill: #ffdf80;
+}
+
+/* -- code displays ------------------------------------------------- */
+
+pre, code {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.9em;
+}
+
+pre {
+ margin: 0;
+ padding: 0;
+ line-height: 1.3;
+}
+
+div.literal-block-wrapper {
+ padding: 10px 0 0;
+}
+
+div.code-block-caption {
+ padding: 0;
+}
+
+div.highlight, div.literal-block-wrapper div.highlight {
+ margin: 10px -10px;
+ padding: 10px;
+}
+
+code {
+ color: #222;
+ background: #e8eff0;
+}
+
+/* -- tables -------------------------------------------------------- */
+
+table.docutils {
+ border: 1px solid #888;
+ box-shadow: 2px 2px 4px #eee;
+}
+
+table.docutils td,
+table.docutils th {
+ border: 1px solid #888;
+ padding: 0.25em 0.7em;
+}
+
+table.field-list,
+table.footnote {
+ border: none;
+ box-shadow: none;
+}
+
+table.footnote {
+ margin: 15px 0;
+ width: 100%;
+ border: 1px solid #eee;
+ background-color: #fafafa;
+ font-size: 0.9em;
+}
+
+table.footnote + table.footnote {
+ margin-top: -15px;
+ border-top: none;
+}
+
+table.field-list th {
+ padding: 0 0.8em 0 0;
+}
+
+table.field-list td {
+ padding: 0;
+}
+
+table.footnote td.label {
+ width: 0;
+ padding: 0.3em 0 0.3em 0.5em;
+}
+
+table.footnote td {
+ padding: 0.3em 0.5em;
+}
+
+/* -- responsive screen --------------------------------------------- */
+
+@media screen and (max-width: 1139px) {
+ p.version-warning {
+ margin: 10px;
+ }
+
+ div.footer {
+ margin: 20px 10px;
+ }
+}
+
+/* -- small screen -------------------------------------------------- */
+
+@media screen and (max-width: 767px) {
+ body {
+ padding: 0 20px;
+ }
+
+ div.related {
+ display: block;
+ }
+
+ p.version-warning {
+ margin: 10px 0;
+ }
+
+ div.documentwrapper {
+ float: none;
+ }
+
+ div.bodywrapper {
+ margin: 0;
+ }
+
+ div.body {
+ min-height: 0;
+ padding: 0;
+ }
+
+ div.sphinxsidebar {
+ float: none;
+ width: 100%;
+ margin: 0 -20px -10px;
+ padding: 0 20px;
+ background-color: #333;
+ color: #ccc;
+ }
+
+ div.sphinxsidebar a,
+ div.sphinxsidebar a code,
+ div.sphinxsidebar h3,
+ div.sphinxsidebar h4,
+ div.footer a {
+ color: #ccc;
+ border-color: #ccc;
+ }
+
+ div.sphinxsidebar p.logo {
+ display: none;
+ }
+
+ div.sphinxsidebar ul.versions a.current {
+ border-bottom-color: #fff;
+ color: #fff;
+ }
+
+ div.footer {
+ text-align: left;
+ margin: 0 -20px;
+ padding: 20px;
+ background-color: #333;
+ color: #ccc;
+ }
+}
+
+/* https://github.com/twbs/bootstrap/blob
+ /0e8831505ac845f3102fa2c5996a7141c9ab01ee
+ /scss/mixins/_screen-reader.scss */
+.hide-header > h1:first-child {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0;
+}
+
+/* -- sphinx-tabs -------------------------------------------------- */
+
+.sphinx-tabs {
+ margin-bottom: 0;
+}
+
+.sphinx-tabs .ui.menu {
+ font-family: 'Garamond', 'Georgia', serif !important;
+}
+
+.sphinx-tabs .ui.attached.menu {
+ border-bottom: none
+}
+
+.sphinx-tabs .ui.tabular.menu .item {
+ border-bottom: 2px solid transparent;
+ border-left: none;
+ border-right: none;
+ border-top: none;
+ padding: .3em 0.6em;
+}
+
+.sphinx-tabs .ui.attached.segment, .ui.segment {
+ border: 0;
+ padding: 0;
+}
diff --git a/_static/pygments.css b/_static/pygments.css
new file mode 100644
index 000000000..57c7df37b
--- /dev/null
+++ b/_static/pygments.css
@@ -0,0 +1,84 @@
+pre { line-height: 125%; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #f8f8f8; }
+.highlight .c { color: #8f5902; font-style: italic } /* Comment */
+.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
+.highlight .g { color: #000000 } /* Generic */
+.highlight .k { color: #004461; font-weight: bold } /* Keyword */
+.highlight .l { color: #000000 } /* Literal */
+.highlight .n { color: #000000 } /* Name */
+.highlight .o { color: #582800 } /* Operator */
+.highlight .x { color: #000000 } /* Other */
+.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
+.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #8f5902 } /* Comment.Preproc */
+.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #a40000 } /* Generic.Deleted */
+.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
+.highlight .ges { color: #000000 } /* Generic.EmphStrong */
+.highlight .gr { color: #ef2929 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #745334 } /* Generic.Prompt */
+.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
+.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
+.highlight .ld { color: #000000 } /* Literal.Date */
+.highlight .m { color: #990000 } /* Literal.Number */
+.highlight .s { color: #4e9a06 } /* Literal.String */
+.highlight .na { color: #c4a000 } /* Name.Attribute */
+.highlight .nb { color: #004461 } /* Name.Builtin */
+.highlight .nc { color: #000000 } /* Name.Class */
+.highlight .no { color: #000000 } /* Name.Constant */
+.highlight .nd { color: #888888 } /* Name.Decorator */
+.highlight .ni { color: #ce5c00 } /* Name.Entity */
+.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #000000 } /* Name.Function */
+.highlight .nl { color: #f57900 } /* Name.Label */
+.highlight .nn { color: #000000 } /* Name.Namespace */
+.highlight .nx { color: #000000 } /* Name.Other */
+.highlight .py { color: #000000 } /* Name.Property */
+.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #000000 } /* Name.Variable */
+.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
+.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */
+.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */
+.highlight .mb { color: #990000 } /* Literal.Number.Bin */
+.highlight .mf { color: #990000 } /* Literal.Number.Float */
+.highlight .mh { color: #990000 } /* Literal.Number.Hex */
+.highlight .mi { color: #990000 } /* Literal.Number.Integer */
+.highlight .mo { color: #990000 } /* Literal.Number.Oct */
+.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
+.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
+.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
+.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */
+.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
+.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
+.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
+.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
+.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
+.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
+.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
+.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
+.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #000000 } /* Name.Function.Magic */
+.highlight .vc { color: #000000 } /* Name.Variable.Class */
+.highlight .vg { color: #000000 } /* Name.Variable.Global */
+.highlight .vi { color: #000000 } /* Name.Variable.Instance */
+.highlight .vm { color: #000000 } /* Name.Variable.Magic */
+.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file
diff --git a/_static/searchtools.js b/_static/searchtools.js
new file mode 100644
index 000000000..92da3f8b2
--- /dev/null
+++ b/_static/searchtools.js
@@ -0,0 +1,619 @@
+/*
+ * searchtools.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for the full-text search.
+ *
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+ var Scorer = {
+ // Implement the following function to further tweak the score for each result
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
+ // and returns the new score.
+ /*
+ score: result => {
+ const [docname, title, anchor, descr, score, filename] = result
+ return score
+ },
+ */
+
+ // query matches the full name of an object
+ objNameMatch: 11,
+ // or matches in the last dotted part of the object name
+ objPartialMatch: 6,
+ // Additive scores depending on the priority of the object
+ objPrio: {
+ 0: 15, // used to be importantResults
+ 1: 5, // used to be objectResults
+ 2: -5, // used to be unimportantResults
+ },
+ // Used when the priority is not in the mapping.
+ objPrioDefault: 0,
+
+ // query found in title
+ title: 15,
+ partialTitle: 7,
+ // query found in terms
+ term: 5,
+ partialTerm: 2,
+ };
+}
+
+const _removeChildren = (element) => {
+ while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _displayItem = (item, searchTerms, highlightTerms) => {
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+ const contentRoot = document.documentElement.dataset.content_root;
+
+ const [docName, title, anchor, descr, score, _filename] = item;
+
+ let listItem = document.createElement("li");
+ let requestUrl;
+ let linkUrl;
+ if (docBuilder === "dirhtml") {
+ // dirhtml builder
+ let dirname = docName + "/";
+ if (dirname.match(/\/index\/$/))
+ dirname = dirname.substring(0, dirname.length - 6);
+ else if (dirname === "index/") dirname = "";
+ requestUrl = contentRoot + dirname;
+ linkUrl = requestUrl;
+ } else {
+ // normal html builders
+ requestUrl = contentRoot + docName + docFileSuffix;
+ linkUrl = docName + docLinkSuffix;
+ }
+ let linkEl = listItem.appendChild(document.createElement("a"));
+ linkEl.href = linkUrl + anchor;
+ linkEl.dataset.score = score;
+ linkEl.innerHTML = title;
+ if (descr) {
+ listItem.appendChild(document.createElement("span")).innerHTML =
+ " (" + descr + ")";
+ // highlight search terms in the description
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+ }
+ else if (showSearchSummary)
+ fetch(requestUrl)
+ .then((responseData) => responseData.text())
+ .then((data) => {
+ if (data)
+ listItem.appendChild(
+ Search.makeSearchSummary(data, searchTerms, anchor)
+ );
+ // highlight search terms in the summary
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+ });
+ Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+ Search.stopPulse();
+ Search.title.innerText = _("Search Results");
+ if (!resultCount)
+ Search.status.innerText = Documentation.gettext(
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+ );
+ else
+ Search.status.innerText = _(
+ "Search finished, found ${resultCount} page(s) matching the search query."
+ ).replace('${resultCount}', resultCount);
+};
+const _displayNextItem = (
+ results,
+ resultCount,
+ searchTerms,
+ highlightTerms,
+) => {
+ // results left, load the summary and display it
+ // this is intended to be dynamic (don't sub resultsCount)
+ if (results.length) {
+ _displayItem(results.pop(), searchTerms, highlightTerms);
+ setTimeout(
+ () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
+ 5
+ );
+ }
+ // search finished, update title and status message
+ else _finishSearch(resultCount);
+};
+// Helper function used by query() to order search results.
+// Each input is an array of [docname, title, anchor, descr, score, filename].
+// Order the results by score (in opposite order of appearance, since the
+// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
+const _orderResultsByScoreThenName = (a, b) => {
+ const leftScore = a[4];
+ const rightScore = b[4];
+ if (leftScore === rightScore) {
+ // same score: sort alphabetically
+ const leftTitle = a[1].toLowerCase();
+ const rightTitle = b[1].toLowerCase();
+ if (leftTitle === rightTitle) return 0;
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+ }
+ return leftScore > rightScore ? 1 : -1;
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+ var splitQuery = (query) => query
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+ .filter(term => term) // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+ _index: null,
+ _queued_query: null,
+ _pulse_status: -1,
+
+ htmlToText: (htmlString, anchor) => {
+ const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+ for (const removalQuery of [".headerlinks", "script", "style"]) {
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
+ }
+ if (anchor) {
+ const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
+ if (anchorContent) return anchorContent.textContent;
+
+ console.warn(
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
+ );
+ }
+
+ // if anchor not specified or not found, fall back to main content
+ const docContent = htmlElement.querySelector('[role="main"]');
+ if (docContent) return docContent.textContent;
+
+ console.warn(
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
+ );
+ return "";
+ },
+
+ init: () => {
+ const query = new URLSearchParams(window.location.search).get("q");
+ document
+ .querySelectorAll('input[name="q"]')
+ .forEach((el) => (el.value = query));
+ if (query) Search.performSearch(query);
+ },
+
+ loadIndex: (url) =>
+ (document.body.appendChild(document.createElement("script")).src = url),
+
+ setIndex: (index) => {
+ Search._index = index;
+ if (Search._queued_query !== null) {
+ const query = Search._queued_query;
+ Search._queued_query = null;
+ Search.query(query);
+ }
+ },
+
+ hasIndex: () => Search._index !== null,
+
+ deferQuery: (query) => (Search._queued_query = query),
+
+ stopPulse: () => (Search._pulse_status = -1),
+
+ startPulse: () => {
+ if (Search._pulse_status >= 0) return;
+
+ const pulse = () => {
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+ };
+ pulse();
+ },
+
+ /**
+ * perform a search for something (or wait until index is loaded)
+ */
+ performSearch: (query) => {
+ // create the required interface elements
+ const searchText = document.createElement("h2");
+ searchText.textContent = _("Searching");
+ const searchSummary = document.createElement("p");
+ searchSummary.classList.add("search-summary");
+ searchSummary.innerText = "";
+ const searchList = document.createElement("ul");
+ searchList.classList.add("search");
+
+ const out = document.getElementById("search-results");
+ Search.title = out.appendChild(searchText);
+ Search.dots = Search.title.appendChild(document.createElement("span"));
+ Search.status = out.appendChild(searchSummary);
+ Search.output = out.appendChild(searchList);
+
+ const searchProgress = document.getElementById("search-progress");
+ // Some themes don't use the search progress node
+ if (searchProgress) {
+ searchProgress.innerText = _("Preparing search...");
+ }
+ Search.startPulse();
+
+ // index already loaded, the browser was quick!
+ if (Search.hasIndex()) Search.query(query);
+ else Search.deferQuery(query);
+ },
+
+ _parseQuery: (query) => {
+ // stem the search terms and add them to the correct list
+ const stemmer = new Stemmer();
+ const searchTerms = new Set();
+ const excludedTerms = new Set();
+ const highlightTerms = new Set();
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+ splitQuery(query.trim()).forEach((queryTerm) => {
+ const queryTermLower = queryTerm.toLowerCase();
+
+ // maybe skip this "word"
+ // stopwords array is from language_data.js
+ if (
+ stopwords.indexOf(queryTermLower) !== -1 ||
+ queryTerm.match(/^\d+$/)
+ )
+ return;
+
+ // stem the word
+ let word = stemmer.stemWord(queryTermLower);
+ // select the correct list
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
+ else {
+ searchTerms.add(word);
+ highlightTerms.add(queryTermLower);
+ }
+ });
+
+ if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
+ localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
+ }
+
+ // console.debug("SEARCH: searching for:");
+ // console.info("required: ", [...searchTerms]);
+ // console.info("excluded: ", [...excludedTerms]);
+
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
+ },
+
+ /**
+ * execute search (requires search index to be loaded)
+ */
+ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+ const allTitles = Search._index.alltitles;
+ const indexEntries = Search._index.indexentries;
+
+ // Collect multiple result groups to be sorted separately and then ordered.
+ // Each is an array of [docname, title, anchor, descr, score, filename].
+ const normalResults = [];
+ const nonMainIndexResults = [];
+
+ _removeChildren(document.getElementById("search-progress"));
+
+ const queryLower = query.toLowerCase().trim();
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
+ if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
+ for (const [file, id] of foundTitles) {
+ let score = Math.round(100 * queryLower.length / title.length)
+ normalResults.push([
+ docNames[file],
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
+ id !== null ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ }
+ }
+
+ // search for explicit entries in index directives
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+ if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
+ for (const [file, id, isMain] of foundEntries) {
+ const score = Math.round(100 * queryLower.length / entry.length);
+ const result = [
+ docNames[file],
+ titles[file],
+ id ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ ];
+ if (isMain) {
+ normalResults.push(result);
+ } else {
+ nonMainIndexResults.push(result);
+ }
+ }
+ }
+ }
+
+ // lookup as object
+ objectTerms.forEach((term) =>
+ normalResults.push(...Search.performObjectSearch(term, objectTerms))
+ );
+
+ // lookup as search terms in fulltext
+ normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+
+ // let the scorer override scores with a custom scoring function
+ if (Scorer.score) {
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
+ }
+
+ // Sort each group of results by score and then alphabetically by name.
+ normalResults.sort(_orderResultsByScoreThenName);
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
+
+ // Combine the result groups in (reverse) order.
+ // Non-main index entries are typically arbitrary cross-references,
+ // so display them after other results.
+ let results = [...nonMainIndexResults, ...normalResults];
+
+ // remove duplicate search results
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+ let seen = new Set();
+ results = results.reverse().reduce((acc, result) => {
+ let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
+ if (!seen.has(resultStr)) {
+ acc.push(result);
+ seen.add(resultStr);
+ }
+ return acc;
+ }, []);
+
+ return results.reverse();
+ },
+
+ query: (query) => {
+ const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
+ const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
+
+ // for debugging
+ //Search.lastresults = results.slice(); // a copy
+ // console.info("search results:", Search.lastresults);
+
+ // print the results
+ _displayNextItem(results, results.length, searchTerms, highlightTerms);
+ },
+
+ /**
+ * search for object names
+ */
+ performObjectSearch: (object, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const objects = Search._index.objects;
+ const objNames = Search._index.objnames;
+ const titles = Search._index.titles;
+
+ const results = [];
+
+ const objectSearchCallback = (prefix, match) => {
+ const name = match[4]
+ const fullname = (prefix ? prefix + "." : "") + name;
+ const fullnameLower = fullname.toLowerCase();
+ if (fullnameLower.indexOf(object) < 0) return;
+
+ let score = 0;
+ const parts = fullnameLower.split(".");
+
+ // check for different match types: exact matches of full name or
+ // "last name" (i.e. last dotted part)
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
+ score += Scorer.objNameMatch;
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
+ score += Scorer.objPartialMatch; // matches in last name
+
+ const objName = objNames[match[1]][2];
+ const title = titles[match[0]];
+
+ // If more than one term searched for, we require other words to be
+ // found in the name/title/description
+ const otherTerms = new Set(objectTerms);
+ otherTerms.delete(object);
+ if (otherTerms.size > 0) {
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+ if (
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+ )
+ return;
+ }
+
+ let anchor = match[3];
+ if (anchor === "") anchor = fullname;
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+ const descr = objName + _(", in ") + title;
+
+ // add custom score for some objects according to scorer
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
+ score += Scorer.objPrio[match[2]];
+ else score += Scorer.objPrioDefault;
+
+ results.push([
+ docNames[match[0]],
+ fullname,
+ "#" + anchor,
+ descr,
+ score,
+ filenames[match[0]],
+ ]);
+ };
+ Object.keys(objects).forEach((prefix) =>
+ objects[prefix].forEach((array) =>
+ objectSearchCallback(prefix, array)
+ )
+ );
+ return results;
+ },
+
+ /**
+ * search for full-text terms in the index
+ */
+ performTermsSearch: (searchTerms, excludedTerms) => {
+ // prepare search
+ const terms = Search._index.terms;
+ const titleTerms = Search._index.titleterms;
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+
+ const scoreMap = new Map();
+ const fileMap = new Map();
+
+ // perform the search on the required terms
+ searchTerms.forEach((word) => {
+ const files = [];
+ const arr = [
+ { files: terms[word], score: Scorer.term },
+ { files: titleTerms[word], score: Scorer.title },
+ ];
+ // add support for partial matches
+ if (word.length > 2) {
+ const escapedWord = _escapeRegExp(word);
+ if (!terms.hasOwnProperty(word)) {
+ Object.keys(terms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
+ });
+ }
+ if (!titleTerms.hasOwnProperty(word)) {
+ Object.keys(titleTerms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
+ });
+ }
+ }
+
+ // no match but word was a required one
+ if (arr.every((record) => record.files === undefined)) return;
+
+ // found search word in contents
+ arr.forEach((record) => {
+ if (record.files === undefined) return;
+
+ let recordFiles = record.files;
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
+ files.push(...recordFiles);
+
+ // set score for the word in each file
+ recordFiles.forEach((file) => {
+ if (!scoreMap.has(file)) scoreMap.set(file, {});
+ scoreMap.get(file)[word] = record.score;
+ });
+ });
+
+ // create the mapping
+ files.forEach((file) => {
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
+ else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
+ });
+ });
+
+ // now check if the files don't contain excluded terms
+ const results = [];
+ for (const [file, wordList] of fileMap) {
+ // check if all requirements are matched
+
+ // as search terms with length < 3 are discarded
+ const filteredTermCount = [...searchTerms].filter(
+ (term) => term.length > 2
+ ).length;
+ if (
+ wordList.length !== searchTerms.size &&
+ wordList.length !== filteredTermCount
+ )
+ continue;
+
+ // ensure that none of the excluded terms is in the search result
+ if (
+ [...excludedTerms].some(
+ (term) =>
+ terms[term] === file ||
+ titleTerms[term] === file ||
+ (terms[term] || []).includes(file) ||
+ (titleTerms[term] || []).includes(file)
+ )
+ )
+ break;
+
+ // select one (max) score for the file.
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+ // add result to the result list
+ results.push([
+ docNames[file],
+ titles[file],
+ "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ return results;
+ },
+
+ /**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words.
+ */
+ makeSearchSummary: (htmlText, keywords, anchor) => {
+ const text = Search.htmlToText(htmlText, anchor);
+ if (text === "") return null;
+
+ const textLower = text.toLowerCase();
+ const actualStartPosition = [...keywords]
+ .map((k) => textLower.indexOf(k.toLowerCase()))
+ .filter((i) => i > -1)
+ .slice(-1)[0];
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+ const top = startWithContext === 0 ? "" : "...";
+ const tail = startWithContext + 240 < text.length ? "..." : "";
+
+ let summary = document.createElement("p");
+ summary.classList.add("context");
+ summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
+
+ return summary;
+ },
+};
+
+_ready(Search.init);
diff --git a/_static/searxng-wordmark.svg b/_static/searxng-wordmark.svg
new file mode 100644
index 000000000..b94fe3728
--- /dev/null
+++ b/_static/searxng-wordmark.svg
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 92 92"
+ height="92mm"
+ width="92mm">
+ <defs
+ id="defs2" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(-40.921303,-17.416526)"
+ id="layer1">
+ <circle
+ r="0"
+ style="fill:none;stroke:#000000;stroke-width:12;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ cy="92"
+ cx="75"
+ id="path3713" />
+ <circle
+ r="30"
+ cy="53.902557"
+ cx="75.921303"
+ id="path834"
+ style="fill:none;fill-opacity:1;stroke:#3050ff;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="m 67.514849,37.91524 a 18,18 0 0 1 21.051475,3.312407 18,18 0 0 1 3.137312,21.078282"
+ id="path852"
+ style="fill:none;fill-opacity:1;stroke:#3050ff;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="rotate(-46.234709)"
+ ry="1.8669105e-13"
+ y="122.08995"
+ x="3.7063529"
+ height="39.963303"
+ width="18.846331"
+ id="rect912"
+ style="opacity:1;fill:#3050ff;fill-opacity:1;stroke:none;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/_static/searxng.css b/_static/searxng.css
new file mode 100644
index 000000000..a214bc9d1
--- /dev/null
+++ b/_static/searxng.css
@@ -0,0 +1,151 @@
+@import url("pocoo.css");
+
+a, a.reference, a.footnote-reference {
+ color: #004b6b;
+ border-color: #004b6b;
+}
+
+a:hover {
+ color: #6d4100;
+ border-color: #6d4100;
+}
+
+p.version-warning {
+ background-color: #004b6b;
+}
+
+aside.sidebar {
+ background-color: whitesmoke;
+ border-color: lightsteelblue;
+ border-radius: 3pt;
+}
+
+div.sphinxsidebar p.caption {
+ display: none;
+}
+
+p.sidebar-title, .sidebar p {
+ margin: 6pt;
+}
+
+.sidebar li,
+.hlist li {
+ list-style-type: disclosure-closed;
+}
+
+.sphinxsidebar .current > a {
+ font-weight: bold;
+}
+
+/* admonitions
+*/
+
+div.admonition, div.topic, nav.contents, div.toctree-wrapper {
+ background-color: #fafafa;
+ margin: 8px 0px;
+ padding: 1em;
+ border-radius: 3pt 0 0 3pt;
+ border-top: none;
+ border-right: none;
+ border-bottom: none;
+ border-left: 5pt solid #ccc;
+ list-style-type: disclosure-closed;
+}
+
+div.toctree-wrapper p.caption {
+ font-weight: normal;
+ font-size: 24px;
+ margin: 0 0 10px 0;
+ padding: 0;
+ line-height: 1;
+ display: inline;
+}
+
+p.admonition-title:after {
+ content: none;
+}
+
+.admonition.hint { border-color: #416dc0b0; }
+.admonition.note { border-color: #6c856cb0; }
+.admonition.tip { border-color: #85c5c2b0; }
+.admonition.attention { border-color: #ecec97b0; }
+.admonition.caution { border-color: #a6c677b0; }
+.admonition.danger { border-color: #d46262b0; }
+.admonition.important { border-color: #dfa3a3b0; }
+.admonition.error { border-color: red; }
+.admonition.warning { border-color: darkred; }
+
+.admonition.admonition-generic-admonition-title {
+ border-color: #416dc0b0;
+}
+
+
+/* admonitions with (rendered) reST markup examples (:class: rst-example)
+ *
+ * .. admonition:: title of the example
+ * :class: rst-example
+ * ....
+*/
+
+div.rst-example {
+ background-color: inherit;
+ margin: 0;
+ border-top: none;
+ border-right: 1px solid #ccc;
+ border-bottom: none;
+ border-left: none;
+ border-radius: none;
+ padding: 0;
+}
+
+div.rst-example > p.admonition-title {
+ font-family: Sans Serif;
+ font-style: italic;
+ font-size: 0.8em;
+ display: block;
+ border-bottom: 1px solid #ccc;
+ padding: 0.5em 1em;
+ text-align: right;
+}
+
+/* code block in figures
+ */
+
+div.highlight pre {
+ text-align: left;
+}
+
+/* Table theme
+*/
+
+thead, tfoot {
+ background-color: #fff;
+}
+
+th:hover, td:hover {
+ background-color: #ffc;
+}
+
+thead th, tfoot th, tfoot td, tbody th {
+ background-color: #fffaef;
+}
+
+tbody tr:nth-child(odd) {
+ background-color: #fff;
+}
+
+tbody tr:nth-child(even) {
+ background-color: #fafafa;
+}
+
+caption {
+ font-family: Sans Serif;
+ padding: 0.5em;
+ margin: 0.5em 0 0.5em 0;
+ caption-side: top;
+ text-align: left;
+}
+
+div.sphinx-tabs {
+ clear: both;
+}
diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js
new file mode 100644
index 000000000..8a96c69a1
--- /dev/null
+++ b/_static/sphinx_highlight.js
@@ -0,0 +1,154 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+ if (node.nodeType === Node.TEXT_NODE) {
+ const val = node.nodeValue;
+ const parent = node.parentNode;
+ const pos = val.toLowerCase().indexOf(text);
+ if (
+ pos >= 0 &&
+ !parent.classList.contains(className) &&
+ !parent.classList.contains("nohighlight")
+ ) {
+ let span;
+
+ const closestNode = parent.closest("body, svg, foreignObject");
+ const isInSVG = closestNode && closestNode.matches("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.classList.add(className);
+ }
+
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ const rest = document.createTextNode(val.substr(pos + text.length));
+ parent.insertBefore(
+ span,
+ parent.insertBefore(
+ rest,
+ node.nextSibling
+ )
+ );
+ node.nodeValue = val.substr(0, pos);
+ /* There may be more occurrences of search term in this node. So call this
+ * function recursively on the remaining fragment.
+ */
+ _highlight(rest, addItems, text, className);
+
+ if (isInSVG) {
+ const rect = document.createElementNS(
+ "http://www.w3.org/2000/svg",
+ "rect"
+ );
+ const bbox = parent.getBBox();
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute("class", className);
+ addItems.push({ parent: parent, target: rect });
+ }
+ }
+ } else if (node.matches && !node.matches("button, select, textarea")) {
+ node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+ }
+};
+const _highlightText = (thisNode, text, className) => {
+ let addItems = [];
+ _highlight(thisNode, addItems, text, className);
+ addItems.forEach((obj) =>
+ obj.parent.insertAdjacentElement("beforebegin", obj.target)
+ );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+
+ /**
+ * highlight the search words provided in localstorage in the text
+ */
+ highlightSearchWords: () => {
+ if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
+
+ // get and clear terms from localstorage
+ const url = new URL(window.location);
+ const highlight =
+ localStorage.getItem("sphinx_highlight_terms")
+ || url.searchParams.get("highlight")
+ || "";
+ localStorage.removeItem("sphinx_highlight_terms")
+ url.searchParams.delete("highlight");
+ window.history.replaceState({}, "", url);
+
+ // get individual terms from highlight string
+ const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
+ if (terms.length === 0) return; // nothing to do
+
+ // There should never be more than one element matching "div.body"
+ const divBody = document.querySelectorAll("div.body");
+ const body = divBody.length ? divBody[0] : document.querySelector("body");
+ window.setTimeout(() => {
+ terms.forEach((term) => _highlightText(body, term, "highlighted"));
+ }, 10);
+
+ const searchBox = document.getElementById("searchbox");
+ if (searchBox === null) return;
+ searchBox.appendChild(
+ document
+ .createRange()
+ .createContextualFragment(
+ '<p class="highlight-link">' +
+ '<a href="javascript:SphinxHighlight.hideSearchWords()">' +
+ _("Hide Search Matches") +
+ "</a></p>"
+ )
+ );
+ },
+
+ /**
+ * helper function to hide the search marks again
+ */
+ hideSearchWords: () => {
+ document
+ .querySelectorAll("#searchbox .highlight-link")
+ .forEach((el) => el.remove());
+ document
+ .querySelectorAll("span.highlighted")
+ .forEach((el) => el.classList.remove("highlighted"));
+ localStorage.removeItem("sphinx_highlight_terms")
+ },
+
+ initEscapeListener: () => {
+ // only install a listener if it is really needed
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
+ if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
+ SphinxHighlight.hideSearchWords();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+_ready(() => {
+ /* Do not call highlightSearchWords() when we are on the search page.
+ * It will highlight words from the *previous* search query.
+ */
+ if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
+ SphinxHighlight.initEscapeListener();
+});
diff --git a/_static/tabs.css b/_static/tabs.css
new file mode 100644
index 000000000..957ba60d6
--- /dev/null
+++ b/_static/tabs.css
@@ -0,0 +1,89 @@
+.sphinx-tabs {
+ margin-bottom: 1rem;
+}
+
+[role="tablist"] {
+ border-bottom: 1px solid #a0b3bf;
+}
+
+.sphinx-tabs-tab {
+ position: relative;
+ font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;
+ color: #1D5C87;
+ line-height: 24px;
+ margin: 0;
+ font-size: 16px;
+ font-weight: 400;
+ background-color: rgba(255, 255, 255, 0);
+ border-radius: 5px 5px 0 0;
+ border: 0;
+ padding: 1rem 1.5rem;
+ margin-bottom: 0;
+}
+
+.sphinx-tabs-tab[aria-selected="true"] {
+ font-weight: 700;
+ border: 1px solid #a0b3bf;
+ border-bottom: 1px solid white;
+ margin: -1px;
+ background-color: white;
+}
+
+.sphinx-tabs-tab:focus {
+ z-index: 1;
+ outline-offset: 1px;
+}
+
+.sphinx-tabs-panel {
+ position: relative;
+ padding: 1rem;
+ border: 1px solid #a0b3bf;
+ margin: 0px -1px -1px -1px;
+ border-radius: 0 0 5px 5px;
+ border-top: 0;
+ background: white;
+}
+
+.sphinx-tabs-panel.code-tab {
+ padding: 0.4rem;
+}
+
+.sphinx-tab img {
+ margin-bottom: 24 px;
+}
+
+/* Dark theme preference styling */
+
+@media (prefers-color-scheme: dark) {
+ body[data-theme="auto"] .sphinx-tabs-panel {
+ color: white;
+ background-color: rgb(50, 50, 50);
+ }
+
+ body[data-theme="auto"] .sphinx-tabs-tab {
+ color: white;
+ background-color: rgba(255, 255, 255, 0.05);
+ }
+
+ body[data-theme="auto"] .sphinx-tabs-tab[aria-selected="true"] {
+ border-bottom: 1px solid rgb(50, 50, 50);
+ background-color: rgb(50, 50, 50);
+ }
+}
+
+/* Explicit dark theme styling */
+
+body[data-theme="dark"] .sphinx-tabs-panel {
+ color: white;
+ background-color: rgb(50, 50, 50);
+}
+
+body[data-theme="dark"] .sphinx-tabs-tab {
+ color: white;
+ background-color: rgba(255, 255, 255, 0.05);
+}
+
+body[data-theme="dark"] .sphinx-tabs-tab[aria-selected="true"] {
+ border-bottom: 2px solid rgb(50, 50, 50);
+ background-color: rgb(50, 50, 50);
+}
diff --git a/_static/tabs.js b/_static/tabs.js
new file mode 100644
index 000000000..48dc303c8
--- /dev/null
+++ b/_static/tabs.js
@@ -0,0 +1,145 @@
+try {
+ var session = window.sessionStorage || {};
+} catch (e) {
+ var session = {};
+}
+
+window.addEventListener("DOMContentLoaded", () => {
+ const allTabs = document.querySelectorAll('.sphinx-tabs-tab');
+ const tabLists = document.querySelectorAll('[role="tablist"]');
+
+ allTabs.forEach(tab => {
+ tab.addEventListener("click", changeTabs);
+ });
+
+ tabLists.forEach(tabList => {
+ tabList.addEventListener("keydown", keyTabs);
+ });
+
+ // Restore group tab selection from session
+ const lastSelected = session.getItem('sphinx-tabs-last-selected');
+ if (lastSelected != null) selectNamedTabs(lastSelected);
+});
+
+/**
+ * Key focus left and right between sibling elements using arrows
+ * @param {Node} e the element in focus when key was pressed
+ */
+function keyTabs(e) {
+ const tab = e.target;
+ let nextTab = null;
+ if (e.keyCode === 39 || e.keyCode === 37) {
+ tab.setAttribute("tabindex", -1);
+ // Move right
+ if (e.keyCode === 39) {
+ nextTab = tab.nextElementSibling;
+ if (nextTab === null) {
+ nextTab = tab.parentNode.firstElementChild;
+ }
+ // Move left
+ } else if (e.keyCode === 37) {
+ nextTab = tab.previousElementSibling;
+ if (nextTab === null) {
+ nextTab = tab.parentNode.lastElementChild;
+ }
+ }
+ }
+
+ if (nextTab !== null) {
+ nextTab.setAttribute("tabindex", 0);
+ nextTab.focus();
+ }
+}
+
+/**
+ * Select or deselect clicked tab. If a group tab
+ * is selected, also select tab in other tabLists.
+ * @param {Node} e the element that was clicked
+ */
+function changeTabs(e) {
+ // Use this instead of the element that was clicked, in case it's a child
+ const notSelected = this.getAttribute("aria-selected") === "false";
+ const positionBefore = this.parentNode.getBoundingClientRect().top;
+ const notClosable = !this.parentNode.classList.contains("closeable");
+
+ deselectTabList(this);
+
+ if (notSelected || notClosable) {
+ selectTab(this);
+ const name = this.getAttribute("name");
+ selectNamedTabs(name, this.id);
+
+ if (this.classList.contains("group-tab")) {
+ // Persist during session
+ session.setItem('sphinx-tabs-last-selected', name);
+ }
+ }
+
+ const positionAfter = this.parentNode.getBoundingClientRect().top;
+ const positionDelta = positionAfter - positionBefore;
+ // Scroll to offset content resizing
+ window.scrollTo(0, window.scrollY + positionDelta);
+}
+
+/**
+ * Select tab and show associated panel.
+ * @param {Node} tab tab to select
+ */
+function selectTab(tab) {
+ tab.setAttribute("aria-selected", true);
+
+ // Show the associated panel
+ document
+ .getElementById(tab.getAttribute("aria-controls"))
+ .removeAttribute("hidden");
+}
+
+/**
+ * Hide the panels associated with all tabs within the
+ * tablist containing this tab.
+ * @param {Node} tab a tab within the tablist to deselect
+ */
+function deselectTabList(tab) {
+ const parent = tab.parentNode;
+ const grandparent = parent.parentNode;
+
+ Array.from(parent.children)
+ .forEach(t => t.setAttribute("aria-selected", false));
+
+ Array.from(grandparent.children)
+ .slice(1) // Skip tablist
+ .forEach(panel => panel.setAttribute("hidden", true));
+}
+
+/**
+ * Select grouped tabs with the same name, but no the tab
+ * with the given id.
+ * @param {Node} name name of grouped tab to be selected
+ * @param {Node} clickedId id of clicked tab
+ */
+function selectNamedTabs(name, clickedId=null) {
+ const groupedTabs = document.querySelectorAll(`.sphinx-tabs-tab[name="${name}"]`);
+ const tabLists = Array.from(groupedTabs).map(tab => tab.parentNode);
+
+ tabLists
+ .forEach(tabList => {
+ // Don't want to change the tabList containing the clicked tab
+ const clickedTab = tabList.querySelector(`[id="${clickedId}"]`);
+ if (clickedTab === null ) {
+ // Select first tab with matching name
+ const tab = tabList.querySelector(`.sphinx-tabs-tab[name="${name}"]`);
+ deselectTabList(tab);
+ selectTab(tab);
+ }
+ })
+}
+
+if (typeof exports === 'undefined') {
+ exports = {};
+}
+
+exports.keyTabs = keyTabs;
+exports.changeTabs = changeTabs;
+exports.selectTab = selectTab;
+exports.deselectTabList = deselectTabList;
+exports.selectNamedTabs = selectNamedTabs;
diff --git a/_static/version_warning_offset.js b/_static/version_warning_offset.js
new file mode 100644
index 000000000..c7f9f49b5
--- /dev/null
+++ b/_static/version_warning_offset.js
@@ -0,0 +1,40 @@
+/*
+When showing the sticky version warning, the warning will cover the
+scroll target when navigating to #id hash locations. Take over scrolling
+to adjust the position to account for the height of the warning.
+*/
+$(() => {
+ const versionWarning = $('.version-warning')
+
+ // Skip if there is no version warning, regular browser behavior is
+ // fine in that case.
+ if (versionWarning.length) {
+ const height = versionWarning.outerHeight(true)
+ const target = $(':target')
+
+ // Adjust position when the initial link has a hash.
+ if (target.length) {
+ // Use absolute scrollTo instead of relative scrollBy to avoid
+ // scrolling when the viewport is already at the bottom of the
+ // document and has space.
+ const y = target.offset().top - height
+ // Delayed because the initial browser scroll doesn't seem to
+ // happen until after the document ready event, so scrolling
+ // immediately will be overridden.
+ setTimeout(() => scrollTo(0, y), 100)
+ }
+
+ // Listen to clicks on hash anchors.
+ $('a[href^="#"]').on('click', e => {
+ // Stop default scroll. Also stops the automatic URL hash update.
+ e.preventDefault()
+ // Get the id to scroll to and set the URL hash manually.
+ const id = $(e.currentTarget).attr('href').substring(1)
+ location.hash = id
+ // Use getElementById since the hash may have dots in it.
+ const target = $(document.getElementById(id))
+ // Scroll to top of target with space for the version warning.
+ scrollTo(0, target.offset().top - height)
+ })
+ }
+})
diff --git a/admin/answer-captcha.html b/admin/answer-captcha.html
new file mode 100644
index 000000000..639748a3d
--- /dev/null
+++ b/admin/answer-captcha.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Answer CAPTCHA from server’s IP &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Limiter" href="searx.limiter.html" />
+ <link rel="prev" title="SearXNG maintenance" href="update-searxng.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.limiter.html" title="Limiter"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="update-searxng.html" title="SearXNG maintenance"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Answer CAPTCHA from server’s IP</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="answer-captcha-from-server-s-ip">
+<h1>Answer CAPTCHA from server’s IP<a class="headerlink" href="#answer-captcha-from-server-s-ip" title="Link to this heading">¶</a></h1>
+<p>With a SSH tunnel we can send requests from server’s IP and solve a CAPTCHA that
+blocks requests from this IP. If your SearXNG instance is hosted at
+<code class="docutils literal notranslate"><span class="pre">example.org</span></code> and your login is <code class="docutils literal notranslate"><span class="pre">user</span></code> you can setup a proxy simply by
+<a class="reference external" href="https://manpages.debian.org/jump?q=ssh">ssh</a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># SOCKS server: socks://127.0.0.1:8080</span>
+
+$<span class="w"> </span>ssh<span class="w"> </span>-q<span class="w"> </span>-N<span class="w"> </span>-D<span class="w"> </span><span class="m">8080</span><span class="w"> </span>user@example.org
+</pre></div>
+</div>
+<p>The <code class="docutils literal notranslate"><span class="pre">socks://localhost:8080</span></code> from above can be tested by:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-c2VydmVyJ3MgSVA=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-c2VydmVyJ3MgSVA=" name="c2VydmVyJ3MgSVA=" role="tab" tabindex="0">server’s IP</button><button aria-controls="panel-0-ZGVza3RvcCdzIElQ" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-ZGVza3RvcCdzIElQ" name="ZGVza3RvcCdzIElQ" role="tab" tabindex="-1">desktop’s IP</button></div><div aria-labelledby="tab-0-c2VydmVyJ3MgSVA=" class="sphinx-tabs-panel group-tab" id="panel-0-c2VydmVyJ3MgSVA=" name="c2VydmVyJ3MgSVA=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>curl<span class="w"> </span>-x<span class="w"> </span>socks://127.0.0.1:8080<span class="w"> </span>http://ipecho.net/plain
+n.n.n.n
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-ZGVza3RvcCdzIElQ" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-ZGVza3RvcCdzIElQ" name="ZGVza3RvcCdzIElQ" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>curl<span class="w"> </span>http://ipecho.net/plain
+x.x.x.x
+</pre></div>
+</div>
+</div></div>
+<p>In the settings of the WEB browser open the <em>“Network Settings”</em> and setup a
+proxy on <code class="docutils literal notranslate"><span class="pre">SOCKS5</span> <span class="pre">127.0.0.1:8080</span></code> (see screenshot below). In the WEB browser
+check the IP from the server is used:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="http://ipecho.net/plain">http://ipecho.net/plain</a></p></li>
+</ul>
+<p>Now open the search engine that blocks requests from your server’s IP. If you
+have <a class="reference external" href="https://github.com/searxng/searxng/issues/2011#issuecomment-1553317619">issues with the qwant engine</a>,
+solve the CAPTCHA from <a class="reference external" href="https://www.qwant.com/">qwant.com</a>.</p>
+<hr class="docutils" />
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-RmlyZWZveA==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-RmlyZWZveA==" name="RmlyZWZveA==" role="tab" tabindex="0">Firefox</button></div><div aria-labelledby="tab-1-RmlyZWZveA==" class="sphinx-tabs-panel group-tab" id="panel-1-RmlyZWZveA==" name="RmlyZWZveA==" role="tabpanel" tabindex="0"><figure class="align-default" id="id1">
+<img alt="FFox proxy on SOCKS5, 127.0.0.1:8080" src="../_images/ffox-setting-proxy-socks.png" />
+<figcaption>
+<p><span class="caption-number">Fig. 1 </span><span class="caption-text">Firefox’s network settings</span><a class="headerlink" href="#id1" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+</div></div>
+<div class="admonition-man-ssh-manual admonition">
+<p class="admonition-title"><a class="reference external" href="https://manpages.debian.org/jump?q=ssh">ssh</a> manual:</p>
+<dl class="simple">
+<dt>-D [bind_address:]port</dt><dd><p>Specifies a local “dynamic” application-level port forwarding. This works
+by allocating a socket to listen to port on the local side .. Whenever a
+connection is made to this port, the connection is forwarded over the
+secure channel, and the application protocol is then used to determine
+where to connect to from the remote machine .. ssh will act as a SOCKS
+server ..</p>
+</dd>
+</dl>
+<dl class="option-list">
+<dt><kbd><span class="option">-N</span></kbd></dt>
+<dd><p>Do not execute a remote command. This is useful for just forwarding ports.</p>
+</dd>
+</dl>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="update-searxng.html" title="previous chapter">SearXNG maintenance</a>
+ <li>Next: <a href="searx.limiter.html" title="next chapter">Limiter</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/answer-captcha.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/api.html b/admin/api.html
new file mode 100644
index 000000000..2fa2b18d4
--- /dev/null
+++ b/admin/api.html
@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Administration API &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Architecture" href="architecture.html" />
+ <link rel="prev" title="Limiter" href="searx.limiter.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="architecture.html" title="Architecture"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.limiter.html" title="Limiter"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Administration API</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="administration-api">
+<span id="adminapi"></span><h1>Administration API<a class="headerlink" href="#administration-api" title="Link to this heading">¶</a></h1>
+<section id="get-configuration-data">
+<h2>Get configuration data<a class="headerlink" href="#get-configuration-data" title="Link to this heading">¶</a></h2>
+<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/config</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
+</pre></div>
+</div>
+<section id="sample-response">
+<h3>Sample response<a class="headerlink" href="#sample-response" title="Link to this heading">¶</a></h3>
+<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
+<span class="w"> </span><span class="nt">&quot;autocomplete&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;categories&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="s2">&quot;map&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="s2">&quot;it&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="s2">&quot;images&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="p">],</span>
+<span class="w"> </span><span class="nt">&quot;default_locale&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;default_theme&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;simple&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;engines&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="nt">&quot;categories&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="s2">&quot;map&quot;</span>
+<span class="w"> </span><span class="p">],</span>
+<span class="w"> </span><span class="nt">&quot;enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;openstreetmap&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;shortcut&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;osm&quot;</span>
+<span class="w"> </span><span class="p">},</span>
+<span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="nt">&quot;categories&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="s2">&quot;it&quot;</span>
+<span class="w"> </span><span class="p">],</span>
+<span class="w"> </span><span class="nt">&quot;enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;arch linux wiki&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;shortcut&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;al&quot;</span>
+<span class="w"> </span><span class="p">},</span>
+<span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="nt">&quot;categories&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="s2">&quot;images&quot;</span>
+<span class="w"> </span><span class="p">],</span>
+<span class="w"> </span><span class="nt">&quot;enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;google images&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;shortcut&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;goi&quot;</span>
+<span class="w"> </span><span class="p">},</span>
+<span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="nt">&quot;categories&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="s2">&quot;it&quot;</span>
+<span class="w"> </span><span class="p">],</span>
+<span class="w"> </span><span class="nt">&quot;enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bitbucket&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;shortcut&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bb&quot;</span>
+<span class="w"> </span><span class="p">},</span>
+<span class="w"> </span><span class="p">],</span>
+<span class="w"> </span><span class="nt">&quot;instance_name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;searx&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;locales&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="nt">&quot;de&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Deutsch (German)&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;en&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;English&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;eo&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Esperanto (Esperanto)&quot;</span><span class="p">,</span>
+<span class="w"> </span><span class="p">},</span>
+<span class="w"> </span><span class="nt">&quot;plugins&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="nt">&quot;enabled&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
+<span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;HTTPS rewrite&quot;</span>
+<span class="w"> </span><span class="p">}</span>
+<span class="w"> </span><span class="p">],</span>
+<span class="w"> </span><span class="nt">&quot;safe_search&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+</section>
+</section>
+<section id="embed-search-bar">
+<h2>Embed search bar<a class="headerlink" href="#embed-search-bar" title="Link to this heading">¶</a></h2>
+<p>The search bar can be embedded into websites. Just paste the example into the
+HTML of the site. URL of the SearXNG instance and values are customizable.</p>
+<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">form</span> <span class="na">method</span><span class="o">=</span><span class="s">&quot;post&quot;</span> <span class="na">action</span><span class="o">=</span><span class="s">&quot;https://example.org/&quot;</span><span class="p">&gt;</span>
+ <span class="cm">&lt;!-- search --&gt;</span> <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;text&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;q&quot;</span> <span class="p">/&gt;</span>
+ <span class="cm">&lt;!-- categories --&gt;</span> <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;categories&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">&quot;general,social media&quot;</span> <span class="p">/&gt;</span>
+ <span class="cm">&lt;!-- language --&gt;</span> <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;lang&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">&quot;all&quot;</span> <span class="p">/&gt;</span>
+ <span class="cm">&lt;!-- locale --&gt;</span> <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;locale&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">&quot;en&quot;</span> <span class="p">/&gt;</span>
+ <span class="cm">&lt;!-- date filter --&gt;</span> <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;time_range&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">&quot;month&quot;</span> <span class="p">/&gt;</span>
+<span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span>
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Administration API</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#get-configuration-data">Get configuration data</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#sample-response">Sample response</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#embed-search-bar">Embed search bar</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="searx.limiter.html" title="previous chapter">Limiter</a>
+ <li>Next: <a href="architecture.html" title="next chapter">Architecture</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/api.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/architecture.html b/admin/architecture.html
new file mode 100644
index 000000000..c5d445bd2
--- /dev/null
+++ b/admin/architecture.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Architecture &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Plugins builtin" href="plugins.html" />
+ <link rel="prev" title="Administration API" href="api.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="plugins.html" title="Plugins builtin"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="api.html" title="Administration API"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Architecture</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="architecture">
+<span id="id1"></span><h1>Architecture<a class="headerlink" href="#architecture" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading</p>
+<ul class="simple">
+<li><p>Reverse Proxy: <a class="reference internal" href="installation-apache.html#apache-searxng-site"><span class="std std-ref">Apache</span></a> &amp; <a class="reference internal" href="installation-nginx.html#nginx-searxng-site"><span class="std std-ref">nginx</span></a></p></li>
+<li><p>uWSGI: <a class="reference internal" href="installation-uwsgi.html#searxng-uwsgi"><span class="std std-ref">uWSGI</span></a></p></li>
+<li><p>SearXNG: <a class="reference internal" href="installation-searxng.html#installation-basic"><span class="std std-ref">Step by step installation</span></a></p></li>
+</ul>
+</aside>
+<p>Herein you will find some hints and suggestions about typical architectures of
+SearXNG infrastructures.</p>
+<section id="uwsgi-setup">
+<span id="architecture-uwsgi"></span><h2>uWSGI Setup<a class="headerlink" href="#uwsgi-setup" title="Link to this heading">¶</a></h2>
+<p>We start with a <em>reference</em> setup for public SearXNG instances which can be build
+up and maintained by the scripts from our <a class="reference internal" href="../utils/index.html#toolboxing"><span class="std std-ref">DevOps tooling box</span></a>.</p>
+<figure class="align-default" id="id2">
+<img alt="arch_public.dot" src="../_images/arch_public.svg" /><figcaption>
+<p><span class="caption-number">Fig. 2 </span><span class="caption-text">Reference architecture of a public SearXNG setup.</span><a class="headerlink" href="#id2" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+<p>The reference installation activates <code class="docutils literal notranslate"><span class="pre">server.limiter</span></code>, <code class="docutils literal notranslate"><span class="pre">server.image_proxy</span></code>
+and <code class="docutils literal notranslate"><span class="pre">ui.static_use_hash</span></code> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/templates/etc/searxng/settings.yml">/etc/searxng/settings.yml</a>)</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="c1"># SearXNG settings</span>
+
+<span class="nt">use_default_settings</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+
+<span class="nt">general</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">debug</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">instance_name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;SearXNG&quot;</span>
+
+<span class="nt">search</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">safe_search</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2</span>
+<span class="w"> </span><span class="nt">autocomplete</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;duckduckgo&#39;</span>
+
+<span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># Is overwritten by ${SEARXNG_SECRET}</span>
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span>
+<span class="w"> </span><span class="nt">limiter</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">image_proxy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="c1"># public URL of the instance, to ensure correct inbound links. Is overwritten</span>
+<span class="w"> </span><span class="c1"># by ${SEARXNG_URL}.</span>
+<span class="w"> </span><span class="c1"># base_url: http://example.com/location</span>
+
+<span class="nt">redis</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}.</span>
+<span class="w"> </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">unix:///usr/local/searxng-redis/run/redis.sock?db=0</span>
+
+<span class="nt">ui</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">static_use_hash</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Architecture</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#uwsgi-setup">uWSGI Setup</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="api.html" title="previous chapter">Administration API</a>
+ <li>Next: <a href="plugins.html" title="next chapter">Plugins builtin</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/architecture.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/buildhosts.html b/admin/buildhosts.html
new file mode 100644
index 000000000..4dc281883
--- /dev/null
+++ b/admin/buildhosts.html
@@ -0,0 +1,283 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Buildhosts &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Developer documentation" href="../dev/index.html" />
+ <link rel="prev" title="Plugins builtin" href="plugins.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../dev/index.html" title="Developer documentation"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="plugins.html" title="Plugins builtin"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Buildhosts</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="buildhosts">
+<span id="id1"></span><h1>Buildhosts<a class="headerlink" href="#buildhosts" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#build-and-development-tools" id="id2">Build and Development tools</a></p></li>
+<li><p><a class="reference internal" href="#build-docs" id="id3">Build docs</a></p></li>
+<li><p><a class="reference internal" href="#lint-shell-scripts" id="id4">Lint shell scripts</a></p></li>
+</ul>
+</nav>
+<p>To get best results from build, it’s recommend to install additional packages on
+build hosts (see <a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>).</p>
+<section id="build-and-development-tools">
+<span id="searxng-sh-install-buildhost"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Build and Development tools</a><a class="headerlink" href="#build-and-development-tools" title="Link to this heading">¶</a></h2>
+<p>To Install tools used by build and development tasks in once:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-U2VhclhORydzIGRldmVsb3BtZW50IHRvb2xz" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-U2VhclhORydzIGRldmVsb3BtZW50IHRvb2xz" name="U2VhclhORydzIGRldmVsb3BtZW50IHRvb2xz" role="tab" tabindex="0">SearXNG’s development tools</button></div><div aria-labelledby="tab-0-U2VhclhORydzIGRldmVsb3BtZW50IHRvb2xz" class="sphinx-tabs-panel group-tab" id="panel-0-U2VhclhORydzIGRldmVsb3BtZW50IHRvb2xz" name="U2VhclhORydzIGRldmVsb3BtZW50IHRvb2xz" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>buildhost
+</pre></div>
+</div>
+</div></div>
+<p>This will install packages needed by SearXNG:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-1-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-1-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-1-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>python3-dev<span class="w"> </span>python3-babel<span class="w"> </span>python3-venv<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>uwsgi<span class="w"> </span>uwsgi-plugin-python3<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>git<span class="w"> </span>build-essential<span class="w"> </span>libxslt-dev<span class="w"> </span>zlib1g-dev<span class="w"> </span>libffi-dev<span class="w"> </span>libssl-dev
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>--noconfirm<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>python<span class="w"> </span>python-pip<span class="w"> </span>python-lxml<span class="w"> </span>python-babel<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>uwsgi<span class="w"> </span>uwsgi-plugin-python<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>git<span class="w"> </span>base-devel<span class="w"> </span>libxml2
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>python<span class="w"> </span>python-pip<span class="w"> </span>python-lxml<span class="w"> </span>python-babel<span class="w"> </span>python3-devel<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>uwsgi<span class="w"> </span>uwsgi-plugin-python3<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>git<span class="w"> </span>@development-tools<span class="w"> </span>libxml2<span class="w"> </span>openssl
+</pre></div>
+</div>
+</div></div>
+<p>and packages needed to build documentation and run tests:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-2-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-2-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-2-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-2-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-2-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-2-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-2-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-2-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>firefox<span class="w"> </span>graphviz<span class="w"> </span>imagemagick<span class="w"> </span>texlive-xetex<span class="w"> </span>librsvg2-bin<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>texlive-latex-recommended<span class="w"> </span>texlive-extra-utils<span class="w"> </span>fonts-dejavu<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>latexmk<span class="w"> </span>shellcheck
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-2-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-2-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>--noconfirm<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>firefox<span class="w"> </span>graphviz<span class="w"> </span>imagemagick<span class="w"> </span>texlive-bin<span class="w"> </span>extra/librsvg<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>texlive-core<span class="w"> </span>texlive-latexextra<span class="w"> </span>ttf-dejavu<span class="w"> </span>shellcheck
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-2-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-2-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>firefox<span class="w"> </span>graphviz<span class="w"> </span>graphviz-gd<span class="w"> </span>ImageMagick<span class="w"> </span>librsvg2-tools<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>texlive-xetex-bin<span class="w"> </span>texlive-collection-fontsrecommended<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>texlive-collection-latex<span class="w"> </span>dejavu-sans-fonts<span class="w"> </span>dejavu-serif-fonts<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>dejavu-sans-mono-fonts<span class="w"> </span>ShellCheck
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="build-docs">
+<span id="docs-build"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Build docs</a><a class="headerlink" href="#build-docs" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Sphinx build needs</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.imagemagick.org">ImageMagick</a></p></li>
+<li><p><a class="reference external" href="https://graphviz.gitlab.io">Graphviz</a></p></li>
+<li><p><a class="reference external" href="https://tug.org/xetex/">XeTeX</a></p></li>
+<li><p><a class="reference external" href="https://dvisvgm.de/">dvisvgm</a></p></li>
+</ul>
+</aside>
+<p>Most of the sphinx requirements are installed from <a class="reference external" href="https://github.com/searxng/searxng/blob/master/setup.py">git://setup.py</a> and the
+docs can be build from scratch with <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.html</span></code>. For better math and
+image processing additional packages are needed. The <a class="reference external" href="https://tug.org/xetex/">XeTeX</a> needed not only for
+PDF creation, it’s also needed for <a class="reference internal" href="../dev/reST.html#math"><span class="std std-ref">Math equations</span></a> when HTML output is build.</p>
+<p>To be able to do <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/extensions/math.html#math-support" title="(in Sphinx v7.4.0)"><span>Math support for HTML outputs in Sphinx</span></a> without CDNs, the math are rendered
+as images (<code class="docutils literal notranslate"><span class="pre">sphinx.ext.imgmath</span></code> extension).</p>
+<p>Here is the extract from the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/conf.py">git://docs/conf.py</a> file, setting math renderer
+to <code class="docutils literal notranslate"><span class="pre">imgmath</span></code>:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">html_math_renderer</span> <span class="o">=</span> <span class="s1">&#39;imgmath&#39;</span>
+<span class="n">imgmath_image_format</span> <span class="o">=</span> <span class="s1">&#39;svg&#39;</span>
+<span class="n">imgmath_font_size</span> <span class="o">=</span> <span class="mi">14</span>
+</pre></div>
+</div>
+<p>If your docs build (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.html</span></code>) shows warnings like this:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">WARNING</span><span class="p">:</span> <span class="n">dot</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="ow">not</span> <span class="n">found</span><span class="p">,</span> <span class="k">for</span> <span class="n">better</span> <span class="n">output</span> <span class="n">quality</span> <span class="n">install</span> \
+ <span class="n">graphviz</span> <span class="kn">from</span> <span class="nn">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">graphviz</span><span class="o">.</span><span class="n">org</span>
+<span class="o">..</span>
+<span class="n">WARNING</span><span class="p">:</span> <span class="n">LaTeX</span> <span class="n">command</span> <span class="s1">&#39;latex&#39;</span> <span class="n">cannot</span> <span class="n">be</span> <span class="n">run</span> <span class="p">(</span><span class="n">needed</span> <span class="k">for</span> <span class="n">math</span> \
+ <span class="n">display</span><span class="p">),</span> <span class="n">check</span> <span class="n">the</span> <span class="n">imgmath_latex</span> <span class="n">setting</span>
+</pre></div>
+</div>
+<p>you need to install additional packages on your build host, to get better HTML
+output (<a class="reference internal" href="#searxng-sh-install-buildhost"><span class="std std-ref">install buildhost</span></a>).</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-3-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-3-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-3-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-3-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-3-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-3-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-3-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-3-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>graphviz<span class="w"> </span>imagemagick<span class="w"> </span>texlive-xetex<span class="w"> </span>librsvg2-bin
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-3-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-3-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>graphviz<span class="w"> </span>imagemagick<span class="w"> </span>texlive-bin<span class="w"> </span>extra/librsvg
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-3-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-3-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>graphviz<span class="w"> </span>graphviz-gd<span class="w"> </span>ImageMagick<span class="w"> </span>texlive-xetex-bin<span class="w"> </span>librsvg2-tools
+</pre></div>
+</div>
+</div></div>
+<p>For PDF output you also need:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-4-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-4-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-4-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-4-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-4-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-4-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-4-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-4-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>texlive-latex-recommended<span class="w"> </span>texlive-extra-utils<span class="w"> </span>ttf-dejavu
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-4-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-4-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>texlive-core<span class="w"> </span>texlive-latexextra<span class="w"> </span>ttf-dejavu
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-4-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-4-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>texlive-collection-fontsrecommended<span class="w"> </span>texlive-collection-latex<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>dejavu-sans-fonts<span class="w"> </span>dejavu-serif-fonts<span class="w"> </span>dejavu-sans-mono-fonts
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="lint-shell-scripts">
+<span id="sh-lint"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Lint shell scripts</a><a class="headerlink" href="#lint-shell-scripts" title="Link to this heading">¶</a></h2>
+<p>To lint shell scripts we use <a class="reference external" href="https://github.com/koalaman/shellcheck">ShellCheck</a> - a shell script static analysis tool
+(<a class="reference internal" href="#searxng-sh-install-buildhost"><span class="std std-ref">install buildhost</span></a>).</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-5-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-5-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-5-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-5-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-5-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-5-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-5-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-5-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>shellcheck
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-5-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-5-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>shellcheck
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-5-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-5-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>ShellCheck
+</pre></div>
+</div>
+</div></div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Buildhosts</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#build-and-development-tools">Build and Development tools</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#build-docs">Build docs</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#lint-shell-scripts">Lint shell scripts</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="plugins.html" title="previous chapter">Plugins builtin</a>
+ <li>Next: <a href="../dev/index.html" title="next chapter">Developer documentation</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/buildhosts.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/index.html b/admin/index.html
new file mode 100644
index 000000000..820a1dc9f
--- /dev/null
+++ b/admin/index.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Administrator documentation &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Settings" href="settings/index.html" />
+ <link rel="prev" title="Why use a private instance?" href="../own-instance.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings/index.html" title="Settings"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../own-instance.html" title="Why use a private instance?"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Administrator documentation</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="administrator-documentation">
+<h1>Administrator documentation<a class="headerlink" href="#administrator-documentation" title="Link to this heading">¶</a></h1>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="settings/index.html">Settings</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings.html"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_brand.html"><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_general.html"><code class="docutils literal notranslate"><span class="pre">general:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_search.html"><code class="docutils literal notranslate"><span class="pre">search:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_server.html"><code class="docutils literal notranslate"><span class="pre">server:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_ui.html"><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_redis.html"><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_outgoing.html"><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings/settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="installation-docker.html">Docker Container</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html#get-docker">Get Docker</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html#searxng-searxng">searxng/searxng</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html#build-the-image">Build the image</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html#command-line">Command line</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l1"><a class="reference internal" href="installation-searxng.html">Step by step installation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html#install-packages">Install packages</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html#create-user">Create user</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html#install-searxng-dependencies">Install SearXNG &amp; dependencies</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html#configuration">Configuration</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html#check">Check</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#origin-uwsgi">Origin uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#distributors">Distributors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#uwsgi-maintenance">uWSGI maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#uwsgi-setup">uWSGI setup</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html#pitfalls-of-the-tyrant-mode">Pitfalls of the Tyrant mode</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="installation-nginx.html">NGINX</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html#the-nginx-http-server">The nginx HTTP server</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html#nginx-s-searxng-site">NGINX’s SearXNG site</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html#disable-logs">Disable logs</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="installation-apache.html">Apache</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#the-apache-http-server">The Apache HTTP server</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#apache-s-searxng-site">Apache’s SearXNG site</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html#disable-logs">disable logs</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html#how-to-update">How to update</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html#how-to-inspect-debug">How to inspect &amp; debug</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html#migrate-and-stay-tuned">Migrate and stay tuned!</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l1"><a class="reference internal" href="searx.limiter.html">Limiter</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#enable-limiter">Enable Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#configure-limiter">Configure Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#limiter-toml"><code class="docutils literal notranslate"><span class="pre">limiter.toml</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#implementation">Implementation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#searx.limiter.initialize"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#searx.limiter.is_installed"><code class="docutils literal notranslate"><span class="pre">is_installed()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#searx.limiter.pre_request"><code class="docutils literal notranslate"><span class="pre">pre_request()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#searx.limiter.LIMITER_CFG"><code class="docutils literal notranslate"><span class="pre">LIMITER_CFG</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html#searx.limiter.LIMITER_CFG_SCHEMA"><code class="docutils literal notranslate"><span class="pre">LIMITER_CFG_SCHEMA</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="api.html">Administration API</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="api.html#get-configuration-data">Get configuration data</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html#embed-search-bar">Embed search bar</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="architecture.html">Architecture</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html#uwsgi-setup">uWSGI Setup</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l1"><a class="reference internal" href="buildhosts.html">Buildhosts</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html#build-and-development-tools">Build and Development tools</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html#build-docs">Build docs</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html#lint-shell-scripts">Lint shell scripts</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Administrator documentation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li>Previous: <a href="../own-instance.html" title="previous chapter">Why use a private instance?</a>
+ <li>Next: <a href="settings/index.html" title="next chapter">Settings</a>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/installation-apache.html b/admin/installation-apache.html
new file mode 100644
index 000000000..79a72987d
--- /dev/null
+++ b/admin/installation-apache.html
@@ -0,0 +1,482 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Apache &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="SearXNG maintenance" href="update-searxng.html" />
+ <link rel="prev" title="NGINX" href="installation-nginx.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="update-searxng.html" title="SearXNG maintenance"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="installation-nginx.html" title="NGINX"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Apache</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="apache">
+<span id="installation-apache"></span><h1>Apache<a class="headerlink" href="#apache" title="Link to this heading">¶</a></h1>
+<p>This section explains how to set up a SearXNG instance using the HTTP server <a class="reference external" href="https://httpd.apache.org/">Apache</a>.
+If you did use the <a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a> and do not have any special preferences
+you can install the <a class="reference internal" href="#apache-searxng-site"><span class="std std-ref">SearXNG site</span></a> using
+<a class="reference internal" href="../utils/searxng.sh.html#searxng-sh-overview"><span class="std std-ref">searxng.sh</span></a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>apache
+</pre></div>
+</div>
+<p>If you have special interests or problems with setting up Apache, the following
+section might give you some guidance.</p>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://wiki.archlinux.org/index.php/Apache_HTTP_Server">Apache Arch Linux</a></p></li>
+<li><p><a class="reference external" href="https://cwiki.apache.org/confluence/display/HTTPD/DistrosDefaultLayout#DistrosDefaultLayout-Debian,Ubuntu(Apachehttpd2.x):">Apache Debian</a></p></li>
+<li><p><a class="reference external" href="https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian">apache2.README.Debian</a></p></li>
+<li><p><a class="reference external" href="https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-apache-http-server/index.html">Apache Fedora</a></p></li>
+<li><p><a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/directives.html">Apache directives</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#the-apache-http-server" id="id5">The Apache HTTP server</a></p>
+<ul>
+<li><p><a class="reference internal" href="#debian-s-apache-layout" id="id6">Debian’s Apache layout</a></p></li>
+<li><p><a class="reference internal" href="#apache-modules" id="id7">Apache modules</a></p></li>
+<li><p><a class="reference internal" href="#apache-sites" id="id8">Apache sites</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#apache-s-searxng-site" id="id9">Apache’s SearXNG site</a></p></li>
+<li><p><a class="reference internal" href="#disable-logs" id="id10">disable logs</a></p></li>
+</ul>
+</nav>
+<section id="the-apache-http-server">
+<h2><a class="toc-backref" href="#id5" role="doc-backlink">The Apache HTTP server</a><a class="headerlink" href="#the-apache-http-server" title="Link to this heading">¶</a></h2>
+<p>If <a class="reference external" href="https://httpd.apache.org/">Apache</a> is not installed, install it now. If <a class="reference external" href="https://httpd.apache.org/">apache</a> is new to you, the
+<a class="reference external" href="https://httpd.apache.org/docs/current/en/getting-started.html">Getting Started</a>, <a class="reference external" href="https://httpd.apache.org/docs/current/en/configuring.html">Configuration Files</a> and <a class="reference external" href="https://httpd.apache.org/docs/current/en/mod/directive-dict.html">Terms Used to Describe
+Directives</a> documentation gives first orientation. There is also a list of
+<a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/directives.html">Apache directives</a> <em>to keep in the pocket</em>.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-0-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-0-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-0-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>apache2
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>apache
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>httpd
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>start<span class="w"> </span>http
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>httpd
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>httpd
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>start<span class="w"> </span>httpd
+</pre></div>
+</div>
+</div></div>
+<p>Now at <a class="reference external" href="http://localhost">http://localhost</a> you should see some kind of <em>Welcome</em> or <em>Test</em> page.
+How this default site is configured, depends on the linux distribution
+(compare <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/directives.html">Apache directives</a>).</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-1-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-1-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-1-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>less<span class="w"> </span>/etc/apache2/sites-enabled/000-default.conf
+</pre></div>
+</div>
+<p>In this file, there is a line setting the <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/core.html#documentroot">DocumentRoot</a> directive:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">DocumentRoot</span><span class="w"> </span><span class="sx">/var/www/html</span>
+</pre></div>
+</div>
+<p>And the <em>welcome</em> page is the HTML file at <code class="docutils literal notranslate"><span class="pre">/var/www/html/index.html</span></code>.</p>
+</div><div aria-labelledby="tab-1-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>less<span class="w"> </span>/etc/httpd/conf/httpd.conf
+</pre></div>
+</div>
+<p>In this file, there is a line setting the <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/core.html#documentroot">DocumentRoot</a> directive:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">DocumentRoot</span><span class="w"> </span><span class="s2">&quot;/srv/http&quot;</span>
+<span class="nt">&lt;Directory</span><span class="w"> </span><span class="s">&quot;/srv/http&quot;</span><span class="nt">&gt;</span>
+<span class="w"> </span><span class="nb">Options</span><span class="w"> </span>Indexes<span class="w"> </span>FollowSymLinks
+<span class="w"> </span><span class="nb">AllowOverride</span><span class="w"> </span><span class="k">None</span>
+<span class="w"> </span><span class="nb">Require</span><span class="w"> </span><span class="k">all</span><span class="w"> </span>granted
+<span class="nt">&lt;/Directory&gt;</span>
+</pre></div>
+</div>
+<p>The <em>welcome</em> page of Arch Linux is a page showing the directory located
+at <code class="docutils literal notranslate"><span class="pre">DocumentRoot</span></code>. This <em>directory</em> page is generated by the Module
+<a class="reference external" href="https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html">mod_autoindex</a>:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">LoadModule</span><span class="w"> </span>autoindex_module<span class="w"> </span>modules/mod_autoindex.so
+...
+<span class="nb">Include</span><span class="w"> </span>conf/extra/httpd-autoindex.conf
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>less<span class="w"> </span>/etc/httpd/conf/httpd.conf
+</pre></div>
+</div>
+<p>In this file, there is a line setting the <code class="docutils literal notranslate"><span class="pre">DocumentRoot</span></code> directive:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">DocumentRoot</span><span class="w"> </span><span class="s2">&quot;/var/www/html&quot;</span>
+...
+<span class="nt">&lt;Directory</span><span class="w"> </span><span class="s">&quot;/var/www&quot;</span><span class="nt">&gt;</span>
+<span class="w"> </span><span class="nb">AllowOverride</span><span class="w"> </span><span class="k">None</span>
+<span class="w"> </span><span class="c"># Allow open access:</span>
+<span class="w"> </span><span class="nb">Require</span><span class="w"> </span><span class="k">all</span><span class="w"> </span>granted
+<span class="nt">&lt;/Directory&gt;</span>
+</pre></div>
+</div>
+<p>On fresh installations, the <code class="docutils literal notranslate"><span class="pre">/var/www</span></code> is empty and the <em>default
+welcome page</em> is shown, the configuration is located at:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">less</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">httpd</span><span class="o">/</span><span class="n">conf</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">welcome</span><span class="o">.</span><span class="n">conf</span>
+</pre></div>
+</div>
+</div></div>
+<section id="debian-s-apache-layout">
+<span id="id2"></span><h3><a class="toc-backref" href="#id6" role="doc-backlink">Debian’s Apache layout</a><a class="headerlink" href="#debian-s-apache-layout" title="Link to this heading">¶</a></h3>
+<p>Be aware, Debian’s Apache layout is quite different from the standard Apache
+configuration. For details look at the <a class="reference external" href="https://salsa.debian.org/apache-team/apache2/raw/master/debian/apache2.README.Debian">apache2.README.Debian</a>
+(<code class="docutils literal notranslate"><span class="pre">/usr/share/doc/apache2/README.Debian.gz</span></code>). Some commands you should know on
+Debian:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=apache2ctl">apache2ctl</a>: Apache HTTP server control interface</p></li>
+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=a2enmod">a2enmod</a>, <a class="reference external" href="https://manpages.debian.org/jump?q=a2dismod">a2dismod</a>: switch on/off modules</p></li>
+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=a2enconf">a2enconf</a>, <a class="reference external" href="https://manpages.debian.org/jump?q=a2disconf">a2disconf</a>: switch on/off configurations</p></li>
+<li><p><a class="reference external" href="https://manpages.debian.org/jump?q=a2ensite">a2ensite</a>, <a class="reference external" href="https://manpages.debian.org/jump?q=a2dissite">a2dissite</a>: switch on/off sites</p></li>
+</ul>
+</section>
+<section id="apache-modules">
+<span id="id3"></span><h3><a class="toc-backref" href="#id7" role="doc-backlink">Apache modules</a><a class="headerlink" href="#apache-modules" title="Link to this heading">¶</a></h3>
+<p>To load additional modules, in most distributions you have to uncomment the
+lines with the corresponding <a class="reference external" href="https://httpd.apache.org/docs/mod/mod_so.html#loadmodule">LoadModule</a> directive, except in <a class="reference internal" href="#debian-s-apache-layout"><span class="std std-ref">Debian’s Apache layout</span></a>.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-2-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-2-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-2-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-2-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-2-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-2-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-2-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-2-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><p><a class="reference internal" href="#debian-s-apache-layout"><span class="std std-ref">Debian’s Apache layout</span></a> uses <a class="reference external" href="https://manpages.debian.org/jump?q=a2enmod">a2enmod</a> and <a class="reference external" href="https://manpages.debian.org/jump?q=a2dismod">a2dismod</a> to
+activate or disable modules:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>a2enmod<span class="w"> </span>ssl
+sudo<span class="w"> </span>-H<span class="w"> </span>a2enmod<span class="w"> </span>headers
+sudo<span class="w"> </span>-H<span class="w"> </span>a2enmod<span class="w"> </span>proxy
+sudo<span class="w"> </span>-H<span class="w"> </span>a2enmod<span class="w"> </span>proxy_http
+sudo<span class="w"> </span>-H<span class="w"> </span>a2enmod<span class="w"> </span>proxy_uwsgi
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-2-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-2-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><p>In the <code class="docutils literal notranslate"><span class="pre">/etc/httpd/conf/httpd.conf</span></code> file, activate <a class="reference external" href="https://httpd.apache.org/docs/mod/mod_so.html#loadmodule">LoadModule</a>
+directives:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">LoadModule</span><span class="w"> </span>ssl_module<span class="w"> </span>modules/mod_ssl.so
+<span class="nb">LoadModule</span><span class="w"> </span>headers_module<span class="w"> </span>modules/mod_headers.so
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_module<span class="w"> </span>modules/mod_proxy.so
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_http_module<span class="w"> </span>modules/mod_proxy_http.so
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_uwsgi_module<span class="w"> </span>modules/mod_proxy_uwsgi.so
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-2-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-2-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><p>In the <code class="docutils literal notranslate"><span class="pre">/etc/httpd/conf/httpd.conf</span></code> file, activate <a class="reference external" href="https://httpd.apache.org/docs/mod/mod_so.html#loadmodule">LoadModule</a>
+directives:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">LoadModule</span><span class="w"> </span>ssl_module<span class="w"> </span>modules/mod_ssl.so
+<span class="nb">LoadModule</span><span class="w"> </span>headers_module<span class="w"> </span>modules/mod_headers.so
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_module<span class="w"> </span>modules/mod_proxy.so
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_http_module<span class="w"> </span>modules/mod_proxy_http.so
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_uwsgi_module<span class="w"> </span>modules/mod_proxy_uwsgi.so
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="apache-sites">
+<span id="id4"></span><h3><a class="toc-backref" href="#id8" role="doc-backlink">Apache sites</a><a class="headerlink" href="#apache-sites" title="Link to this heading">¶</a></h3>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-3-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-3-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-3-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-3-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-3-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-3-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-3-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-3-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><p>In <a class="reference internal" href="#debian-s-apache-layout"><span class="std std-ref">Debian’s Apache layout</span></a> you create a <code class="docutils literal notranslate"><span class="pre">searxng.conf</span></code> with the
+<code class="docutils literal notranslate"><span class="pre">&lt;Location</span> <span class="pre">/searxng</span> <span class="pre">&gt;</span></code> directive and save this file in the <em>sites
+available</em> folder at <code class="docutils literal notranslate"><span class="pre">/etc/apache2/sites-available</span></code>. To enable the
+<code class="docutils literal notranslate"><span class="pre">searxng.conf</span></code> use <a class="reference external" href="https://manpages.debian.org/jump?q=a2ensite">a2ensite</a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>a2ensite<span class="w"> </span>searxng.conf
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-3-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-3-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><p>In the <code class="docutils literal notranslate"><span class="pre">/etc/httpd/conf/httpd.conf</span></code> file add a <a class="reference external" href="https://httpd.apache.org/docs/mod/core.html#includeoptional">IncludeOptional</a>
+directive:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">IncludeOptional</span><span class="w"> </span>sites-enabled/*.conf
+</pre></div>
+</div>
+<p>Create two folders, one for the <em>available sites</em> and one for the <em>enabled sites</em>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/httpd/sites-available
+mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/httpd/sites-enabled
+</pre></div>
+</div>
+<p>Create configuration at <code class="docutils literal notranslate"><span class="pre">/etc/httpd/sites-available</span></code> and place a
+symlink to <code class="docutils literal notranslate"><span class="pre">sites-enabled</span></code>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/httpd/sites-available/searxng.conf<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>/etc/httpd/sites-enabled/searxng.conf
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-3-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-3-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><p>In the <code class="docutils literal notranslate"><span class="pre">/etc/httpd/conf/httpd.conf</span></code> file add a <a class="reference external" href="https://httpd.apache.org/docs/mod/core.html#includeoptional">IncludeOptional</a>
+directive:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">IncludeOptional</span><span class="w"> </span>sites-enabled/*.conf
+</pre></div>
+</div>
+<p>Create two folders, one for the <em>available sites</em> and one for the <em>enabled sites</em>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/httpd/sites-available
+mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/httpd/sites-enabled
+</pre></div>
+</div>
+<p>Create configuration at <code class="docutils literal notranslate"><span class="pre">/etc/httpd/sites-available</span></code> and place a
+symlink to <code class="docutils literal notranslate"><span class="pre">sites-enabled</span></code>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/httpd/sites-available/searxng.conf<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>/etc/httpd/sites-enabled/searxng.conf
+</pre></div>
+</div>
+</div></div>
+</section>
+</section>
+<section id="apache-s-searxng-site">
+<span id="apache-searxng-site"></span><h2><a class="toc-backref" href="#id9" role="doc-backlink">Apache’s SearXNG site</a><a class="headerlink" href="#apache-s-searxng-site" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">uWSGI</p>
+<p>Use <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi">mod_proxy_uwsgi</a> / don’t use the old <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-uwsgi">mod_uwsgi</a> anymore.</p>
+</aside>
+<p>To proxy the incoming requests to the SearXNG instance Apache needs the
+<a class="reference external" href="https://httpd.apache.org/docs/current/mod/mod_proxy.html">mod_proxy</a> module (<a class="reference internal" href="#apache-modules"><span class="std std-ref">Apache modules</span></a>).</p>
+<aside class="sidebar">
+<p class="sidebar-title">HTTP headers</p>
+<p>With <a class="reference external" href="https://httpd.apache.org/docs/trunk/mod/mod_proxy.html#proxypreservehost">ProxyPreserveHost</a> the incoming <code class="docutils literal notranslate"><span class="pre">Host</span></code> header is passed to the proxied
+host.</p>
+</aside>
+<p>Depending on what your SearXNG installation is listening on, you need a http
+<a class="reference external" href="https://httpd.apache.org/docs/current/mod/mod_proxy_http.html">mod_proxy_http</a>) or socket (<a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Apache.html#mod-proxy-uwsgi">mod_proxy_uwsgi</a>) communication to upstream.</p>
+<p>The <a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a> installs the <a class="reference internal" href="installation-searxng.html#use-default-settings-yml"><span class="std std-ref">reference setup</span></a> and a <a class="reference internal" href="installation-uwsgi.html#uwsgi-setup"><span class="std std-ref">uWSGI setup</span></a> that listens on a socket by default.
+You can install and activate your own <code class="docutils literal notranslate"><span class="pre">searxng.conf</span></code> like shown in
+<a class="reference internal" href="#apache-sites"><span class="std std-ref">Apache sites</span></a>.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-4-c29ja2V0" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-4-c29ja2V0" name="c29ja2V0" role="tab" tabindex="0">socket</button><button aria-controls="panel-4-aHR0cA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-4-aHR0cA==" name="aHR0cA==" role="tab" tabindex="-1">http</button></div><div aria-labelledby="tab-4-c29ja2V0" class="sphinx-tabs-panel group-tab" id="panel-4-c29ja2V0" name="c29ja2V0" role="tabpanel" tabindex="0"><div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="c"># -*- coding: utf-8; mode: apache -*-</span>
+
+<span class="nb">LoadModule</span><span class="w"> </span>ssl_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_ssl.so</span>
+<span class="nb">LoadModule</span><span class="w"> </span>headers_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_headers.so</span>
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_proxy.so</span>
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_uwsgi_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_proxy_uwsgi.so</span>
+<span class="c"># LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so</span>
+<span class="c">#</span>
+<span class="c"># SetEnvIf Request_URI /searxng dontlog</span>
+<span class="c"># CustomLog /dev/null combined env=dontlog</span>
+
+<span class="nt">&lt;Location</span><span class="w"> </span><span class="s">/searxng</span><span class="nt">&gt;</span>
+
+<span class="w"> </span><span class="nb">Require</span><span class="w"> </span><span class="k">all</span><span class="w"> </span>granted
+<span class="w"> </span><span class="nb">Order</span><span class="w"> </span>deny,allow
+<span class="w"> </span><span class="nb">Deny</span><span class="w"> </span>from<span class="w"> </span><span class="k">all</span>
+<span class="w"> </span><span class="c"># Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
+<span class="w"> </span><span class="nb">Allow</span><span class="w"> </span>from<span class="w"> </span><span class="k">all</span>
+
+<span class="w"> </span><span class="c"># add the trailing slash</span>
+<span class="w"> </span><span class="nb">RedirectMatch</span><span class="w"> </span><span class="m">308</span><span class="w"> </span><span class="sx">/searxng</span>$<span class="w"> </span><span class="sx">/searxng/</span>
+
+<span class="w"> </span><span class="nb">ProxyPreserveHost</span><span class="w"> </span><span class="k">On</span>
+<span class="w"> </span><span class="nb">ProxyPass</span><span class="w"> </span>unix:/usr/local/searxng/run/socket|uwsgi://uwsgi-uds-searxng/
+
+<span class="w"> </span><span class="c"># see flaskfix.py</span>
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Scheme<span class="w"> </span>%{REQUEST_SCHEME}s
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Script-Name<span class="w"> </span><span class="sx">/searxng</span>
+
+<span class="w"> </span><span class="c"># see limiter.py</span>
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Real-IP<span class="w"> </span>%{REMOTE_ADDR}s
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>append<span class="w"> </span>X-Forwarded-For<span class="w"> </span>%{REMOTE_ADDR}s
+
+<span class="nt">&lt;/Location&gt;</span>
+
+<span class="c"># uWSGI serves the static files and in settings.yml we use::</span>
+<span class="c">#</span>
+<span class="c"># ui:</span>
+<span class="c"># static_use_hash: true</span>
+<span class="c">#</span>
+<span class="c"># Alias /searxng/static/ /usr/local/searxng/searxng-src/searx/static/</span>
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-4-aHR0cA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-4-aHR0cA==" name="aHR0cA==" role="tabpanel" tabindex="0"><div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="c"># -*- coding: utf-8; mode: apache -*-</span>
+
+<span class="nb">LoadModule</span><span class="w"> </span>ssl_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_ssl.so</span>
+<span class="nb">LoadModule</span><span class="w"> </span>headers_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_headers.so</span>
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_proxy.so</span>
+<span class="nb">LoadModule</span><span class="w"> </span>proxy_http_module<span class="w"> </span><span class="sx">/usr/lib/apache2/modules/mod_proxy_http.so</span>
+<span class="c"># LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so</span>
+<span class="c">#</span>
+<span class="c"># SetEnvIf Request_URI /searxng dontlog</span>
+<span class="c"># CustomLog /dev/null combined env=dontlog</span>
+
+<span class="nt">&lt;Location</span><span class="w"> </span><span class="s">/searxng</span><span class="nt">&gt;</span>
+
+<span class="w"> </span><span class="nb">Require</span><span class="w"> </span><span class="k">all</span><span class="w"> </span>granted
+<span class="w"> </span><span class="nb">Order</span><span class="w"> </span>deny,allow
+<span class="w"> </span><span class="nb">Deny</span><span class="w"> </span>from<span class="w"> </span><span class="k">all</span>
+<span class="w"> </span><span class="c"># Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1</span>
+<span class="w"> </span><span class="nb">Allow</span><span class="w"> </span>from<span class="w"> </span><span class="k">all</span>
+
+<span class="w"> </span><span class="c"># add the trailing slash</span>
+<span class="w"> </span><span class="nb">RedirectMatch</span><span class="w"> </span><span class="m">308</span><span class="w"> </span><span class="sx">/searxng</span>$<span class="w"> </span><span class="sx">/searxng/</span>
+
+<span class="w"> </span><span class="nb">ProxyPreserveHost</span><span class="w"> </span><span class="k">On</span>
+<span class="w"> </span><span class="nb">ProxyPass</span><span class="w"> </span>http://127.0.0.1:8888
+
+<span class="w"> </span><span class="c"># see flaskfix.py</span>
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Scheme<span class="w"> </span>%{REQUEST_SCHEME}s
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Script-Name<span class="w"> </span><span class="sx">/searxng</span>
+
+<span class="w"> </span><span class="c"># see limiter.py</span>
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Real-IP<span class="w"> </span>%{REMOTE_ADDR}s
+<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>append<span class="w"> </span>X-Forwarded-For<span class="w"> </span>%{REMOTE_ADDR}s
+
+<span class="nt">&lt;/Location&gt;</span>
+
+<span class="c"># uWSGI serves the static files and in settings.yml we use::</span>
+<span class="c">#</span>
+<span class="c"># ui:</span>
+<span class="c"># static_use_hash: true</span>
+<span class="c">#</span>
+<span class="c"># Alias /searxng/static/ /usr/local/searxng/searxng-src/searx/static/</span>
+</pre></div>
+</div>
+</div></div>
+<p id="restart-apache">Restart service:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-5-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-5-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-5-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-5-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-5-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-5-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-5-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-5-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>apache2
+sudo<span class="w"> </span>-H<span class="w"> </span>service<span class="w"> </span>uwsgi<span class="w"> </span>restart<span class="w"> </span>searxng
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-5-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-5-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>httpd
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>uwsgi@searxng
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-5-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-5-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>httpd
+sudo<span class="w"> </span>-H<span class="w"> </span>touch<span class="w"> </span>/etc/uwsgi.d/searxng.ini
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="disable-logs">
+<h2><a class="toc-backref" href="#id10" role="doc-backlink">disable logs</a><a class="headerlink" href="#disable-logs" title="Link to this heading">¶</a></h2>
+<p>For better privacy you can disable Apache logs. In the examples above activate
+one of the lines and <a class="reference internal" href="#restart-apache">restart apache</a>:</p>
+<div class="highlight-apache notranslate"><div class="highlight"><pre><span></span><span class="nb">SetEnvIf</span><span class="w"> </span>Request_URI<span class="w"> </span><span class="s2">&quot;/searxng&quot;</span><span class="w"> </span>dontlog
+<span class="c"># CustomLog /dev/null combined env=dontlog</span>
+</pre></div>
+</div>
+<p>The <code class="docutils literal notranslate"><span class="pre">CustomLog</span></code> directive disables logs for the entire (virtual) server, use it
+when the URL of the service does not have a path component (<code class="docutils literal notranslate"><span class="pre">/searxng</span></code>), so when
+SearXNG is located at root (<code class="docutils literal notranslate"><span class="pre">/</span></code>).</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Apache</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#the-apache-http-server">The Apache HTTP server</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#debian-s-apache-layout">Debian’s Apache layout</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#apache-modules">Apache modules</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#apache-sites">Apache sites</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#apache-s-searxng-site">Apache’s SearXNG site</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#disable-logs">disable logs</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="installation-nginx.html" title="previous chapter">NGINX</a>
+ <li>Next: <a href="update-searxng.html" title="next chapter">SearXNG maintenance</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/installation-apache.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/installation-docker.html b/admin/installation-docker.html
new file mode 100644
index 000000000..bf3b70e57
--- /dev/null
+++ b/admin/installation-docker.html
@@ -0,0 +1,331 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Docker Container &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Installation Script" href="installation-scripts.html" />
+ <link rel="prev" title="Installation" href="installation.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="installation-scripts.html" title="Installation Script"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="installation.html" title="Installation"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Docker Container</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="docker-container">
+<span id="installation-docker"></span><h1>Docker Container<a class="headerlink" href="#docker-container" title="Link to this heading">¶</a></h1>
+<hr class="docutils" />
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://hub.docker.com/r/searxng/searxng">searxng/searxng &#64;dockerhub</a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/Dockerfile">git://Dockerfile</a></p></li>
+<li><p><a class="reference external" href="https://docs.docker.com/get-started/overview">Docker overview</a></p></li>
+<li><p><a class="reference external" href="https://docs.docker.com/get-started/docker_cheatsheet.pdf">Docker Cheat Sheet</a></p></li>
+<li><p><a class="reference external" href="https://alpinelinux.org">Alpine Linux</a>
+<a class="reference external" href="https://en.wikipedia.org/wiki/Alpine_Linux">(wiki)</a>
+<a class="reference external" href="https://pkgs.alpinelinux.org/packages">apt packages</a></p></li>
+<li><p>Alpine’s <code class="docutils literal notranslate"><span class="pre">/bin/sh</span></code> is <a class="reference external" href="https://manpages.debian.org/jump?q=dash">dash</a></p></li>
+</ul>
+</aside>
+<p><strong>If you intend to create a public instance using Docker, use our well maintained
+docker container</strong></p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://hub.docker.com/r/searxng/searxng">searxng/searxng &#64;dockerhub</a>.</p></li>
+</ul>
+<aside class="sidebar">
+<p class="sidebar-title">hint</p>
+<p>The rest of this article is of interest only to those who want to create and
+maintain their own Docker images.</p>
+</aside>
+<p>The sources are hosted at <a class="reference external" href="https://github.com/searxng/searxng-docker">searxng-docker</a> and the container includes:</p>
+<ul class="simple">
+<li><p>a HTTPS reverse proxy <a class="reference external" href="https://hub.docker.com/_/caddy">[caddy]</a> and</p></li>
+<li><p>a <a class="reference external" href="https://redis.io/">Redis</a> DB</p></li>
+</ul>
+<p>The <a class="reference external" href="https://github.com/searxng/searxng-docker/blob/master/searxng/settings.yml">default SearXNG setup</a>
+of this container:</p>
+<ul class="simple">
+<li><p>enables <a class="reference internal" href="searx.limiter.html#limiter"><span class="std std-ref">limiter</span></a> to protect against bots</p></li>
+<li><p>enables <a class="reference internal" href="settings/settings_server.html#image-proxy"><span class="std std-ref">image proxy</span></a> for better privacy</p></li>
+<li><p>enables <a class="reference internal" href="settings/settings_ui.html#static-use-hash"><span class="std std-ref">cache busting</span></a> to save bandwidth</p></li>
+</ul>
+<hr class="docutils" />
+<section id="get-docker">
+<h2>Get Docker<a class="headerlink" href="#get-docker" title="Link to this heading">¶</a></h2>
+<p>If you plan to build and maintain a docker image by yourself, make sure you have
+<a class="reference external" href="https://docs.docker.com/get-docker/">Docker installed</a>. On Linux don’t
+forget to add your user to the docker group (log out and log back in so that
+your group membership is re-evaluated):</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>usermod<span class="w"> </span>-a<span class="w"> </span>-G<span class="w"> </span>docker<span class="w"> </span><span class="nv">$USER</span>
+</pre></div>
+</div>
+</section>
+<section id="searxng-searxng">
+<h2>searxng/searxng<a class="headerlink" href="#searxng-searxng" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title"><code class="docutils literal notranslate"><span class="pre">docker</span> <span class="pre">run</span></code></p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://docs.docker.com/engine/reference/run/#clean-up---rm">--rm</a>
+automatically clean up when container exits</p></li>
+<li><p><a class="reference external" href="https://docs.docker.com/engine/reference/run/#detached--d">-d</a> start
+detached container</p></li>
+<li><p><a class="reference external" href="https://docs.docker.com/engine/reference/run/#volume-shared-filesystems">-v</a>
+mount volume <code class="docutils literal notranslate"><span class="pre">HOST:CONTAINER</span></code></p></li>
+</ul>
+</aside>
+<p>The docker image is based on <a class="reference external" href="https://github.com/searxng/searxng/blob/master/Dockerfile">git://Dockerfile</a> and available from
+<a class="reference external" href="https://hub.docker.com/r/searxng/searxng">searxng/searxng &#64;dockerhub</a>. Using the docker image is quite easy, for
+instance you can pull the <a class="reference external" href="https://hub.docker.com/r/searxng/searxng">searxng/searxng &#64;dockerhub</a> image and deploy a local
+instance using <a class="reference external" href="https://docs.docker.com/engine/reference/run/">docker run</a>:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>mkdir<span class="w"> </span>my-instance
+$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>my-instance
+$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">PORT</span><span class="o">=</span><span class="m">8080</span>
+$<span class="w"> </span>docker<span class="w"> </span>pull<span class="w"> </span>searxng/searxng
+$<span class="w"> </span>docker<span class="w"> </span>run<span class="w"> </span>--rm<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>-d<span class="w"> </span>-p<span class="w"> </span><span class="si">${</span><span class="nv">PORT</span><span class="si">}</span>:8080<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>-v<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PWD</span><span class="si">}</span><span class="s2">/searxng:/etc/searxng&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>-e<span class="w"> </span><span class="s2">&quot;BASE_URL=http://localhost:</span><span class="nv">$PORT</span><span class="s2">/&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>-e<span class="w"> </span><span class="s2">&quot;INSTANCE_NAME=my-instance&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>searxng/searxng
+2f998....<span class="w"> </span><span class="c1"># container&#39;s ID</span>
+</pre></div>
+</div>
+<p>The environment variables UWSGI_WORKERS and UWSGI_THREADS overwrite the default
+number of UWSGI processes and UWSGI threads specified in <cite>/etc/searxng/uwsgi.ini</cite>.</p>
+<p>Open your WEB browser and visit the URL:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>xdg-open<span class="w"> </span><span class="s2">&quot;http://localhost:</span><span class="nv">$PORT</span><span class="s2">&quot;</span>
+</pre></div>
+</div>
+<p>Inside <code class="docutils literal notranslate"><span class="pre">${PWD}/searxng</span></code>, you will find <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code> and <code class="docutils literal notranslate"><span class="pre">uwsgi.ini</span></code>. You
+can modify these files according to your needs and restart the Docker image.</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>docker<span class="w"> </span>container<span class="w"> </span>restart<span class="w"> </span>2f998
+</pre></div>
+</div>
+<p>Use command <code class="docutils literal notranslate"><span class="pre">container</span> <span class="pre">ls</span></code> to list running containers, add flag <a class="reference external" href="https://docs.docker.com/engine/reference/commandline/container_ls">-a</a> to list
+exited containers also. With <code class="docutils literal notranslate"><span class="pre">container</span> <span class="pre">stop</span></code> a running container can be
+stopped. To get rid of a container use <code class="docutils literal notranslate"><span class="pre">container</span> <span class="pre">rm</span></code>:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>docker<span class="w"> </span>container<span class="w"> </span>ls
+CONTAINER<span class="w"> </span>ID<span class="w"> </span>IMAGE<span class="w"> </span>COMMAND<span class="w"> </span>CREATED<span class="w"> </span>...
+2f998d725993<span class="w"> </span>searxng/searxng<span class="w"> </span><span class="s2">&quot;/sbin/tini -- /usr/…&quot;</span><span class="w"> </span><span class="m">7</span><span class="w"> </span>minutes<span class="w"> </span>ago<span class="w"> </span>...
+
+$<span class="w"> </span>docker<span class="w"> </span>container<span class="w"> </span>stop<span class="w"> </span>2f998
+$<span class="w"> </span>docker<span class="w"> </span>container<span class="w"> </span>rm<span class="w"> </span>2f998
+</pre></div>
+</div>
+<aside class="sidebar">
+<p class="sidebar-title">Warning</p>
+<p>This might remove all docker items, not only those from SearXNG.</p>
+</aside>
+<p>If you won’t use docker anymore and want to get rid of all containers &amp; images
+use the following <em>prune</em> command:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>docker<span class="w"> </span>stop<span class="w"> </span><span class="k">$(</span>docker<span class="w"> </span>ps<span class="w"> </span>-aq<span class="k">)</span><span class="w"> </span><span class="c1"># stop all containers</span>
+$<span class="w"> </span>docker<span class="w"> </span>system<span class="w"> </span>prune<span class="w"> </span><span class="c1"># make some housekeeping</span>
+$<span class="w"> </span>docker<span class="w"> </span>rmi<span class="w"> </span>-f<span class="w"> </span><span class="k">$(</span>docker<span class="w"> </span>images<span class="w"> </span>-q<span class="k">)</span><span class="w"> </span><span class="c1"># drop all images</span>
+</pre></div>
+</div>
+<section id="shell-inside-container">
+<h3>shell inside container<a class="headerlink" href="#shell-inside-container" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">Bashism</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://lwn.net/Articles/343924/">A tale of two shells: bash or dash</a></p></li>
+<li><p><a class="reference external" href="http://mywiki.wooledge.org/Bashism">How to make bash scripts work in dash</a></p></li>
+<li><p><a class="reference external" href="https://dev.to/bowmanjd/writing-bash-scripts-that-are-not-only-bash-checking-for-bashisms-and-testing-with-dash-1bli">Checking for Bashisms</a></p></li>
+</ul>
+</aside>
+<p>Like in many other distributions, Alpine’s <a class="reference external" href="https://wiki.ubuntu.com/DashAsBinSh">/bin/sh</a> is <a class="reference external" href="https://manpages.debian.org/jump?q=dash">dash</a>. Dash is meant to be
+<a class="reference external" href="https://pubs.opengroup.org/onlinepubs/9699919799">POSIX-compliant</a>.
+Compared to debian, in the Alpine image <a class="reference external" href="https://manpages.debian.org/jump?q=bash">bash</a> is not installed. The
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/dockerfiles/docker-entrypoint.sh">git://dockerfiles/docker-entrypoint.sh</a> script is checked <em>against dash</em>
+(<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">tests.shell</span></code>).</p>
+<p>To open a shell inside the container:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>-it<span class="w"> </span>2f998<span class="w"> </span>sh
+</pre></div>
+</div>
+</section>
+</section>
+<section id="build-the-image">
+<h2>Build the image<a class="headerlink" href="#build-the-image" title="Link to this heading">¶</a></h2>
+<p>It’s also possible to build SearXNG from the embedded <a class="reference external" href="https://github.com/searxng/searxng/blob/master/Dockerfile">git://Dockerfile</a>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ git clone https://github.com/searxng/searxng.git
+$ cd searxng
+$ make docker.build
+...
+Successfully built 49586c016434
+Successfully tagged searxng/searxng:latest
+Successfully tagged searxng/searxng:1.0.0-209-9c823800-dirty
+
+$ docker images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+searxng/searxng 1.0.0-209-9c823800-dirty 49586c016434 13 minutes ago 308MB
+searxng/searxng latest 49586c016434 13 minutes ago 308MB
+alpine 3.13 6dbb9cc54074 3 weeks ago 5.61MB
+</pre></div>
+</div>
+</section>
+<section id="command-line">
+<h2>Command line<a class="headerlink" href="#command-line" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">docker run</p>
+<p>Use flags <code class="docutils literal notranslate"><span class="pre">-it</span></code> for <a class="reference external" href="https://docs.docker.com/engine/reference/run/#foreground">interactive processes</a>.</p>
+</aside>
+<p>In the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/Dockerfile">git://Dockerfile</a> the <a class="reference external" href="https://docs.docker.com/engine/reference/builder/#entrypoint">ENTRYPOINT</a> is defined as
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/dockerfiles/docker-entrypoint.sh">git://dockerfiles/docker-entrypoint.sh</a></p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>docker<span class="w"> </span>run<span class="w"> </span>--rm<span class="w"> </span>-it<span class="w"> </span>searxng/searxng<span class="w"> </span>-h
+</pre></div>
+</div>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>Command line:
+ -h Display this help
+ -d Dry run to update the configuration files.
+ -f Always update on the configuration files (existing files are renamed with
+ the .old suffix). Without this option, the new configuration files are
+ copied with the .new suffix
+Environment variables:
+ INSTANCE_NAME settings.yml : general.instance_name
+ AUTOCOMPLETE settings.yml : search.autocomplete
+ BASE_URL settings.yml : server.base_url
+ MORTY_URL settings.yml : result_proxy.url
+ MORTY_KEY settings.yml : result_proxy.key
+ BIND_ADDRESS uwsgi bind to the specified TCP socket using HTTP protocol.
+ Default value: 0.0.0.0:8080
+Volume:
+ /etc/searxng the docker entry point copies settings.yml and uwsgi.ini in
+ this directory (see the -f command line option)&quot;
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Docker Container</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#get-docker">Get Docker</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searxng-searxng">searxng/searxng</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#shell-inside-container">shell inside container</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#build-the-image">Build the image</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#command-line">Command line</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="installation.html" title="previous chapter">Installation</a>
+ <li>Next: <a href="installation-scripts.html" title="next chapter">Installation Script</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/installation-docker.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/installation-nginx.html b/admin/installation-nginx.html
new file mode 100644
index 000000000..47bbd1bb1
--- /dev/null
+++ b/admin/installation-nginx.html
@@ -0,0 +1,360 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>NGINX &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Apache" href="installation-apache.html" />
+ <link rel="prev" title="uWSGI" href="installation-uwsgi.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="installation-apache.html" title="Apache"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="installation-uwsgi.html" title="uWSGI"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">NGINX</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="nginx">
+<span id="installation-nginx"></span><h1>NGINX<a class="headerlink" href="#nginx" title="Link to this heading">¶</a></h1>
+<p>This section explains how to set up a SearXNG instance using the HTTP server <a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/">nginx</a>.
+If you have used the <a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a> and do not have any special preferences
+you can install the <a class="reference internal" href="#nginx-searxng-site"><span class="std std-ref">SearXNG site</span></a> using
+<a class="reference internal" href="../utils/searxng.sh.html#searxng-sh-overview"><span class="std std-ref">searxng.sh</span></a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>nginx
+</pre></div>
+</div>
+<p>If you have special interests or problems with setting up nginx, the following
+section might give you some guidance.</p>
+<aside class="sidebar">
+<p class="sidebar-title">further reading</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/">nginx</a></p></li>
+<li><p><a class="reference external" href="https://nginx.org/en/docs/beginners_guide.html">nginx beginners guide</a></p></li>
+<li><p><a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers">nginx server configuration</a></p></li>
+<li><p><a class="reference external" href="https://www.nginx.com/resources/wiki/start/">Getting Started wiki</a></p></li>
+<li><p><a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html">uWSGI support from nginx</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#the-nginx-http-server" id="id2">The nginx HTTP server</a></p></li>
+<li><p><a class="reference internal" href="#nginx-s-searxng-site" id="id3">NGINX’s SearXNG site</a></p></li>
+<li><p><a class="reference internal" href="#disable-logs" id="id4">Disable logs</a></p></li>
+</ul>
+</nav>
+<section id="the-nginx-http-server">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">The nginx HTTP server</a><a class="headerlink" href="#the-nginx-http-server" title="Link to this heading">¶</a></h2>
+<p>If <a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/">nginx</a> is not installed, install it now.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-0-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-0-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-0-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>nginx
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>nginx-mainline
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>nginx
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>start<span class="w"> </span>nginx
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>nginx
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>nginx
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>start<span class="w"> </span>nginx
+</pre></div>
+</div>
+</div></div>
+<p>Now at <a class="reference external" href="http://localhost">http://localhost</a> you should see a <em>Welcome to nginx!</em> page, on Fedora you
+see a <em>Fedora Webserver - Test Page</em>. The test page comes from the default
+<a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers">nginx server configuration</a>. How this default site is configured,
+depends on the linux distribution:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-1-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-1-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-1-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>less<span class="w"> </span>/etc/nginx/nginx.conf
+</pre></div>
+</div>
+<p>There is one line that includes site configurations from:</p>
+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">include</span><span class="w"> </span><span class="n">/etc/nginx/sites-enabled/*</span>;
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less<span class="w"> </span>/etc/nginx/nginx.conf
+</pre></div>
+</div>
+<p>There is a configuration section named <code class="docutils literal notranslate"><span class="pre">server</span></code>:</p>
+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">server</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="kn">listen</span><span class="w"> </span><span class="mi">80</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">server_name</span><span class="w"> </span><span class="s">localhost</span><span class="p">;</span>
+<span class="w"> </span><span class="c1"># ...</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>less<span class="w"> </span>/etc/nginx/nginx.conf
+</pre></div>
+</div>
+<p>There is one line that includes site configurations from:</p>
+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">include</span><span class="w"> </span><span class="n">/etc/nginx/conf.d/*.conf</span>;
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="nginx-s-searxng-site">
+<span id="nginx-searxng-site"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">NGINX’s SearXNG site</a><a class="headerlink" href="#nginx-s-searxng-site" title="Link to this heading">¶</a></h2>
+<p>Now you have to create a configuration file (<code class="docutils literal notranslate"><span class="pre">searxng.conf</span></code>) for the SearXNG
+site. If <a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/">nginx</a> is new to you, the <a class="reference external" href="https://nginx.org/en/docs/beginners_guide.html">nginx beginners guide</a> is a good starting
+point and the <a class="reference external" href="https://www.nginx.com/resources/wiki/start/">Getting Started wiki</a> is always a good resource <em>to keep in the
+pocket</em>.</p>
+<p>Depending on what your SearXNG installation is listening on, you need a http or socket
+communication to upstream.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-2-c29ja2V0" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-2-c29ja2V0" name="c29ja2V0" role="tab" tabindex="0">socket</button><button aria-controls="panel-2-aHR0cA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-2-aHR0cA==" name="aHR0cA==" role="tab" tabindex="-1">http</button></div><div aria-labelledby="tab-2-c29ja2V0" class="sphinx-tabs-panel group-tab" id="panel-2-c29ja2V0" name="c29ja2V0" role="tabpanel" tabindex="0"><div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">location</span><span class="w"> </span><span class="s">/searxng</span><span class="w"> </span><span class="p">{</span>
+
+<span class="w"> </span><span class="kn">uwsgi_pass</span><span class="w"> </span><span class="s">unix:///usr/local/searxng/run/socket</span><span class="p">;</span>
+
+<span class="w"> </span><span class="kn">include</span><span class="w"> </span><span class="s">uwsgi_params</span><span class="p">;</span>
+
+<span class="w"> </span><span class="kn">uwsgi_param</span><span class="w"> </span><span class="s">HTTP_HOST</span><span class="w"> </span><span class="nv">$host</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">uwsgi_param</span><span class="w"> </span><span class="s">HTTP_CONNECTION</span><span class="w"> </span><span class="nv">$http_connection</span><span class="p">;</span>
+
+<span class="w"> </span><span class="c1"># see flaskfix.py</span>
+<span class="w"> </span><span class="kn">uwsgi_param</span><span class="w"> </span><span class="s">HTTP_X_SCHEME</span><span class="w"> </span><span class="nv">$scheme</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">uwsgi_param</span><span class="w"> </span><span class="s">HTTP_X_SCRIPT_NAME</span><span class="w"> </span><span class="s">/searxng</span><span class="p">;</span>
+
+<span class="w"> </span><span class="c1"># see limiter.py</span>
+<span class="w"> </span><span class="kn">uwsgi_param</span><span class="w"> </span><span class="s">HTTP_X_REAL_IP</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">uwsgi_param</span><span class="w"> </span><span class="s">HTTP_X_FORWARDED_FOR</span><span class="w"> </span><span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="c1"># uWSGI serves the static files and in settings.yml we use::</span>
+<span class="c1">#</span>
+<span class="c1"># ui:</span>
+<span class="c1"># static_use_hash: true</span>
+<span class="c1">#</span>
+<span class="c1"># location /searxng/static/ {</span>
+<span class="c1"># alias /usr/local/searxng/searxng-src/searx/static/;</span>
+<span class="c1"># }</span>
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-2-aHR0cA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-2-aHR0cA==" name="aHR0cA==" role="tabpanel" tabindex="0"><div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">location</span><span class="w"> </span><span class="s">/searxng</span><span class="w"> </span><span class="p">{</span>
+
+<span class="w"> </span><span class="kn">proxy_pass</span><span class="w"> </span><span class="s">http://127.0.0.1:8888</span><span class="p">;</span>
+
+<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Host</span><span class="w"> </span><span class="nv">$host</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Connection</span><span class="w"> </span><span class="nv">$http_connection</span><span class="p">;</span>
+
+<span class="w"> </span><span class="c1"># see flaskfix.py</span>
+<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Scheme</span><span class="w"> </span><span class="nv">$scheme</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Script-Name</span><span class="w"> </span><span class="s">/searxng</span><span class="p">;</span>
+
+<span class="w"> </span><span class="c1"># see limiter.py</span>
+<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Real-IP</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-For</span><span class="w"> </span><span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
+
+<span class="w"> </span><span class="c1"># proxy_buffering off;</span>
+<span class="w"> </span><span class="c1"># proxy_request_buffering off;</span>
+<span class="w"> </span><span class="c1"># proxy_buffer_size 8k;</span>
+
+<span class="p">}</span>
+
+<span class="c1"># uWSGI serves the static files and in settings.yml we use::</span>
+<span class="c1">#</span>
+<span class="c1"># ui:</span>
+<span class="c1"># static_use_hash: true</span>
+<span class="c1">#</span>
+<span class="c1"># location /searxng/static/ {</span>
+<span class="c1"># alias /usr/local/searxng/searxng-src/searx/static/;</span>
+<span class="c1"># }</span>
+</pre></div>
+</div>
+</div></div>
+<p>The <a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a> installs the <a class="reference internal" href="installation-searxng.html#use-default-settings-yml"><span class="std std-ref">reference setup</span></a> and a <a class="reference internal" href="installation-uwsgi.html#uwsgi-setup"><span class="std std-ref">uWSGI setup</span></a> that listens on a socket by default.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-3-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-3-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-3-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-3-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-3-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-3-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-3-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-3-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><p>Create configuration at <code class="docutils literal notranslate"><span class="pre">/etc/nginx/sites-available/</span></code> and place a
+symlink to <code class="docutils literal notranslate"><span class="pre">sites-enabled</span></code>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/nginx/sites-available/searxng.conf<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>/etc/nginx/sites-enabled/searxng.conf
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-3-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-3-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><p>In the <code class="docutils literal notranslate"><span class="pre">/etc/nginx/nginx.conf</span></code> file, in the <code class="docutils literal notranslate"><span class="pre">server</span></code> section add a
+<a class="reference external" href="https://nginx.org/en/docs/ngx_core_module.html#include">include</a>
+directive:</p>
+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">server</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="c1"># ...</span>
+<span class="w"> </span><span class="kn">include</span><span class="w"> </span><span class="s">/etc/nginx/default.d/*.conf</span><span class="p">;</span>
+<span class="w"> </span><span class="c1"># ...</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<p>Create two folders, one for the <em>available sites</em> and one for the <em>enabled sites</em>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/nginx/default.d
+mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/nginx/default.apps-available
+</pre></div>
+</div>
+<p>Create configuration at <code class="docutils literal notranslate"><span class="pre">/etc/nginx/default.apps-available</span></code> and place a
+symlink to <code class="docutils literal notranslate"><span class="pre">default.d</span></code>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/nginx/default.apps-available/searxng.conf<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>/etc/nginx/default.d/searxng.conf
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-3-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-3-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><p>Create a folder for the <em>available sites</em>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/nginx/default.apps-available
+</pre></div>
+</div>
+<p>Create configuration at <code class="docutils literal notranslate"><span class="pre">/etc/nginx/default.apps-available</span></code> and place a
+symlink to <code class="docutils literal notranslate"><span class="pre">conf.d</span></code>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/nginx/default.apps-available/searxng.conf<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>/etc/nginx/conf.d/searxng.conf
+</pre></div>
+</div>
+</div></div>
+<p>Restart services:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-4-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-4-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-4-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-4-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-4-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-4-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-4-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-4-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>nginx
+sudo<span class="w"> </span>-H<span class="w"> </span>service<span class="w"> </span>uwsgi<span class="w"> </span>restart<span class="w"> </span>searxng
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-4-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-4-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>nginx
+sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>uwsgi@searxng
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-4-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-4-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>nginx
+sudo<span class="w"> </span>-H<span class="w"> </span>touch<span class="w"> </span>/etc/uwsgi.d/searxng.ini
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="disable-logs">
+<h2><a class="toc-backref" href="#id4" role="doc-backlink">Disable logs</a><a class="headerlink" href="#disable-logs" title="Link to this heading">¶</a></h2>
+<p>For better privacy you can disable nginx logs in <code class="docutils literal notranslate"><span class="pre">/etc/nginx/nginx.conf</span></code>.</p>
+<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">http</span><span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="c1"># ...</span>
+<span class="w"> </span><span class="kn">access_log</span><span class="w"> </span><span class="s">/dev/null</span><span class="p">;</span>
+<span class="w"> </span><span class="kn">error_log</span><span class="w"> </span><span class="s">/dev/null</span><span class="p">;</span>
+<span class="w"> </span><span class="c1"># ...</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">NGINX</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#the-nginx-http-server">The nginx HTTP server</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#nginx-s-searxng-site">NGINX’s SearXNG site</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#disable-logs">Disable logs</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="installation-uwsgi.html" title="previous chapter">uWSGI</a>
+ <li>Next: <a href="installation-apache.html" title="next chapter">Apache</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/installation-nginx.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/installation-scripts.html b/admin/installation-scripts.html
new file mode 100644
index 000000000..f834395f7
--- /dev/null
+++ b/admin/installation-scripts.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Installation Script &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Step by step installation" href="installation-searxng.html" />
+ <link rel="prev" title="Docker Container" href="installation-docker.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="installation-searxng.html" title="Step by step installation"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="installation-docker.html" title="Docker Container"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Installation Script</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="installation-script">
+<span id="installation-scripts"></span><h1>Installation Script<a class="headerlink" href="#installation-script" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Update the OS first!</p>
+<p>To avoid unwanted side effects, update your OS before installing SearXNG.</p>
+</aside>
+<p>The following will install a setup as shown in <a class="reference internal" href="architecture.html#arch-public"><span class="std std-ref">the reference architecture</span></a>. First you need to get a clone of the repository. The clone is only needed for
+the installation procedure and some maintenance tasks.</p>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../utils/index.html#toolboxing"><span class="std std-ref">DevOps tooling box</span></a></p></li>
+</ul>
+</aside>
+<p>Jump to a folder that is readable by <em>others</em> and start to clone SearXNG,
+alternatively you can create your own fork and clone from there.</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>~/Downloads
+$<span class="w"> </span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/searxng/searxng.git<span class="w"> </span>searxng
+$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>searxng
+</pre></div>
+</div>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="update-searxng.html#inspect-searxng"><span class="std std-ref">How to inspect &amp; debug</span></a></p></li>
+</ul>
+</aside>
+<p>To install a SearXNG <a class="reference internal" href="installation-searxng.html#use-default-settings-yml"><span class="std std-ref">reference setup</span></a>
+including a <a class="reference internal" href="architecture.html#architecture-uwsgi"><span class="std std-ref">uWSGI setup</span></a> as described in the
+<a class="reference internal" href="installation-searxng.html#installation-basic"><span class="std std-ref">Step by step installation</span></a> and in the <a class="reference internal" href="installation-uwsgi.html#searxng-uwsgi"><span class="std std-ref">uWSGI</span></a> section type:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>all
+</pre></div>
+</div>
+<div class="admonition attention">
+<p class="admonition-title">Attention</p>
+<p>For the installation procedure, use a <em>sudoer</em> login to run the scripts. If
+you install from <code class="docutils literal notranslate"><span class="pre">root</span></code>, take into account that the scripts are creating a
+<code class="docutils literal notranslate"><span class="pre">searxng</span></code> user. In the installation procedure this new created user does
+need to have read access to the cloned SearXNG repository, which is not the case if you clone
+it into a folder below <code class="docutils literal notranslate"><span class="pre">/root</span></code>!</p>
+</div>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="update-searxng.html#update-searxng"><span class="std std-ref">How to update</span></a></p></li>
+</ul>
+</aside>
+<p>When all services are installed and running fine, you can add SearXNG to your
+HTTP server. We do not have any preferences regarding the HTTP server, you can use
+whatever you prefer.</p>
+<p>We use caddy in our <a class="reference internal" href="installation-docker.html#installation-docker"><span class="std std-ref">docker image</span></a> and we have
+implemented installation procedures for:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="installation-nginx.html#installation-nginx"><span class="std std-ref">NGINX</span></a></p></li>
+<li><p><a class="reference internal" href="installation-apache.html#installation-apache"><span class="std std-ref">Apache</span></a></p></li>
+</ul>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="installation-docker.html" title="previous chapter">Docker Container</a>
+ <li>Next: <a href="installation-searxng.html" title="next chapter">Step by step installation</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/installation-scripts.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/installation-searxng.html b/admin/installation-searxng.html
new file mode 100644
index 000000000..a94eadc02
--- /dev/null
+++ b/admin/installation-searxng.html
@@ -0,0 +1,613 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Step by step installation &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="uWSGI" href="installation-uwsgi.html" />
+ <link rel="prev" title="Installation Script" href="installation-scripts.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="installation-uwsgi.html" title="uWSGI"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="installation-scripts.html" title="Installation Script"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Step by step installation</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="step-by-step-installation">
+<span id="installation-basic"></span><h1>Step by step installation<a class="headerlink" href="#step-by-step-installation" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#install-packages" id="id2">Install packages</a></p></li>
+<li><p><a class="reference internal" href="#create-user" id="id3">Create user</a></p></li>
+<li><p><a class="reference internal" href="#install-searxng-dependencies" id="id4">Install SearXNG &amp; dependencies</a></p></li>
+<li><p><a class="reference internal" href="#configuration" id="id5">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#check" id="id6">Check</a></p></li>
+</ul>
+</nav>
+<p>In this section we show the setup of a SearXNG instance that will be installed
+by the <a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a>.</p>
+<section id="install-packages">
+<span id="id1"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Install packages</a><a class="headerlink" href="#install-packages" title="Link to this heading">¶</a></h2>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-0-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-0-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-0-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>python3-dev<span class="w"> </span>python3-babel<span class="w"> </span>python3-venv<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>uwsgi<span class="w"> </span>uwsgi-plugin-python3<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>git<span class="w"> </span>build-essential<span class="w"> </span>libxslt-dev<span class="w"> </span>zlib1g-dev<span class="w"> </span>libffi-dev<span class="w"> </span>libssl-dev
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>--noconfirm<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>python<span class="w"> </span>python-pip<span class="w"> </span>python-lxml<span class="w"> </span>python-babel<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>uwsgi<span class="w"> </span>uwsgi-plugin-python<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>git<span class="w"> </span>base-devel<span class="w"> </span>libxml2
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>python<span class="w"> </span>python-pip<span class="w"> </span>python-lxml<span class="w"> </span>python-babel<span class="w"> </span>python3-devel<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>uwsgi<span class="w"> </span>uwsgi-plugin-python3<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>git<span class="w"> </span>@development-tools<span class="w"> </span>libxml2<span class="w"> </span>openssl
+</pre></div>
+</div>
+</div></div>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>This installs also the packages needed by <a class="reference internal" href="installation-uwsgi.html#searxng-uwsgi"><span class="std std-ref">uWSGI</span></a></p>
+</div>
+</section>
+<section id="create-user">
+<span id="create-searxng-user"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Create user</a><a class="headerlink" href="#create-user" title="Link to this heading">¶</a></h2>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-YmFzaA==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-YmFzaA==" name="YmFzaA==" role="tab" tabindex="0">bash</button></div><div aria-labelledby="tab-1-YmFzaA==" class="sphinx-tabs-panel group-tab" id="panel-1-YmFzaA==" name="YmFzaA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>useradd<span class="w"> </span>--shell<span class="w"> </span>/bin/bash<span class="w"> </span>--system<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>--home-dir<span class="w"> </span><span class="s2">&quot;/usr/local/searxng&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>--comment<span class="w"> </span><span class="s1">&#39;Privacy-respecting metasearch engine&#39;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>searxng
+
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>mkdir<span class="w"> </span><span class="s2">&quot;/usr/local/searxng&quot;</span>
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>chown<span class="w"> </span>-R<span class="w"> </span><span class="s2">&quot;searxng:searxng&quot;</span><span class="w"> </span><span class="s2">&quot;/usr/local/searxng&quot;</span>
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="install-searxng-dependencies">
+<span id="searxng-src"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Install SearXNG &amp; dependencies</a><a class="headerlink" href="#install-searxng-dependencies" title="Link to this heading">¶</a></h2>
+<p>Start a interactive shell from new created user and clone SearXNG:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-2-YmFzaA==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-2-YmFzaA==" name="YmFzaA==" role="tab" tabindex="0">bash</button></div><div aria-labelledby="tab-2-YmFzaA==" class="sphinx-tabs-panel group-tab" id="panel-2-YmFzaA==" name="YmFzaA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>-u<span class="w"> </span>searxng<span class="w"> </span>-i
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span>git<span class="w"> </span>clone<span class="w"> </span><span class="s2">&quot;https://github.com/searxng/searxng&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span><span class="s2">&quot;/usr/local/searxng/searxng-src&quot;</span>
+</pre></div>
+</div>
+</div></div>
+<p>In the same shell create <em>virtualenv</em>:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-3-YmFzaA==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-3-YmFzaA==" name="YmFzaA==" role="tab" tabindex="0">bash</button></div><div aria-labelledby="tab-3-YmFzaA==" class="sphinx-tabs-panel group-tab" id="panel-3-YmFzaA==" name="YmFzaA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>venv<span class="w"> </span><span class="s2">&quot;/usr/local/searxng/searx-pyenv&quot;</span>
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;. /usr/local/searxng/searx-pyenv/bin/activate&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>&gt;&gt;<span class="w"> </span><span class="s2">&quot;/usr/local/searxng/.profile&quot;</span>
+</pre></div>
+</div>
+</div></div>
+<p>To install SearXNG’s dependencies, exit the SearXNG <em>bash</em> session you opened above
+and start a new one. Before installing, check if your <em>virtualenv</em> was sourced
+from the login (<em>~/.profile</em>):</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-4-YmFzaA==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-4-YmFzaA==" name="YmFzaA==" role="tab" tabindex="0">bash</button></div><div aria-labelledby="tab-4-YmFzaA==" class="sphinx-tabs-panel group-tab" id="panel-4-YmFzaA==" name="YmFzaA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>-u<span class="w"> </span>searxng<span class="w"> </span>-i
+
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span><span class="nb">command</span><span class="w"> </span>-v<span class="w"> </span>python<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>python<span class="w"> </span>--version
+/usr/local/searxng/searx-pyenv/bin/python
+Python<span class="w"> </span><span class="m">3</span>.8.1
+
+<span class="c1"># update pip&#39;s boilerplate ..</span>
+pip<span class="w"> </span>install<span class="w"> </span>-U<span class="w"> </span>pip
+pip<span class="w"> </span>install<span class="w"> </span>-U<span class="w"> </span>setuptools
+pip<span class="w"> </span>install<span class="w"> </span>-U<span class="w"> </span>wheel
+pip<span class="w"> </span>install<span class="w"> </span>-U<span class="w"> </span>pyyaml
+
+<span class="c1"># jump to SearXNG&#39;s working tree and install SearXNG into virtualenv</span>
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span><span class="s2">&quot;/usr/local/searxng/searxng-src&quot;</span>
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>-e<span class="w"> </span>.
+</pre></div>
+</div>
+</div></div>
+<div class="admonition tip">
+<p class="admonition-title">Tip</p>
+<p>Open a second terminal for the configuration tasks and leave the <code class="docutils literal notranslate"><span class="pre">(searx)$</span></code>
+terminal open for the tasks below.</p>
+</div>
+</section>
+<section id="configuration">
+<span id="use-default-settings-yml"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title"><code class="docutils literal notranslate"><span class="pre">use_default_settings:</span> <span class="pre">True</span></code></p>
+<ul class="simple">
+<li><p><a class="reference internal" href="settings/settings.html#settings-yml"><span class="std std-ref">settings.yml</span></a></p></li>
+<li><p><a class="reference internal" href="settings/settings.html#settings-location"><span class="std std-ref">settings.yml location</span></a></p></li>
+<li><p><a class="reference internal" href="settings/settings.html#settings-use-default-settings"><span class="std std-ref">use_default_settings</span></a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/templates/etc/searxng/settings.yml">/etc/searxng/settings.yml</a></p></li>
+</ul>
+</aside>
+<p>To create a initial <code class="docutils literal notranslate"><span class="pre">/etc/searxng/settings.yml</span></code> we recommend to start with a
+copy of the file <a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/templates/etc/searxng/settings.yml">git://utils/templates/etc/searxng/settings.yml</a>. This setup
+<a class="reference internal" href="settings/settings.html#settings-use-default-settings"><span class="std std-ref">use default settings</span></a> from
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">git://searx/settings.yml</a> and is shown in the tab <em>“Use default settings”</em>
+below. This setup:</p>
+<ul class="simple">
+<li><p>enables <a class="reference internal" href="searx.limiter.html#limiter"><span class="std std-ref">limiter</span></a> to protect against bots</p></li>
+<li><p>enables <a class="reference internal" href="settings/settings_server.html#image-proxy"><span class="std std-ref">image proxy</span></a> for better privacy</p></li>
+<li><p>enables <a class="reference internal" href="settings/settings_ui.html#static-use-hash"><span class="std std-ref">cache busting</span></a> to save bandwidth</p></li>
+</ul>
+<p>Modify the <code class="docutils literal notranslate"><span class="pre">/etc/searxng/settings.yml</span></code> to your needs:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-5-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-5-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" name="VXNlIGRlZmF1bHQgc2V0dGluZ3M=" role="tab" tabindex="0">Use default settings</button><button aria-controls="panel-5-c2Vhcngvc2V0dGluZ3MueW1s" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-5-c2Vhcngvc2V0dGluZ3MueW1s" name="c2Vhcngvc2V0dGluZ3MueW1s" role="tab" tabindex="-1">searx/settings.yml</button></div><div aria-labelledby="tab-5-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" class="sphinx-tabs-panel group-tab" id="panel-5-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" name="VXNlIGRlZmF1bHQgc2V0dGluZ3M=" role="tabpanel" tabindex="0"><div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="c1"># SearXNG settings</span>
+
+<span class="nt">use_default_settings</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+
+<span class="nt">general</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">debug</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">instance_name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;SearXNG&quot;</span>
+
+<span class="nt">search</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">safe_search</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2</span>
+<span class="w"> </span><span class="nt">autocomplete</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;duckduckgo&#39;</span>
+
+<span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># Is overwritten by ${SEARXNG_SECRET}</span>
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span>
+<span class="w"> </span><span class="nt">limiter</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">image_proxy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="c1"># public URL of the instance, to ensure correct inbound links. Is overwritten</span>
+<span class="w"> </span><span class="c1"># by ${SEARXNG_URL}.</span>
+<span class="w"> </span><span class="c1"># base_url: http://example.com/location</span>
+
+<span class="nt">redis</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}.</span>
+<span class="w"> </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">unix:///usr/local/searxng-redis/run/redis.sock?db=0</span>
+
+<span class="nt">ui</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">static_use_hash</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+
+<span class="c1"># preferences:</span>
+<span class="c1"># lock:</span>
+<span class="c1"># - autocomplete</span>
+<span class="c1"># - method</span>
+
+<span class="nt">enabled_plugins</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;Hash</span><span class="nv"> </span><span class="s">plugin&#39;</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;Self</span><span class="nv"> </span><span class="s">Informations&#39;</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;Tracker</span><span class="nv"> </span><span class="s">URL</span><span class="nv"> </span><span class="s">remover&#39;</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;Ahmia</span><span class="nv"> </span><span class="s">blacklist&#39;</span>
+<span class="w"> </span><span class="c1"># - &#39;Hostname replace&#39; # see hostname_replace configuration below</span>
+<span class="w"> </span><span class="c1"># - &#39;Open Access DOI rewrite&#39;</span>
+
+<span class="c1"># plugins:</span>
+<span class="c1"># - only_show_green_results</span>
+</pre></div>
+</div>
+<p>To see the entire file jump to <a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/templates/etc/searxng/settings.yml">git://utils/templates/etc/searxng/settings.yml</a></p>
+</div><div aria-labelledby="tab-5-c2Vhcngvc2V0dGluZ3MueW1s" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-5-c2Vhcngvc2V0dGluZ3MueW1s" name="c2Vhcngvc2V0dGluZ3MueW1s" role="tabpanel" tabindex="0"><div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">general</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG}</span>
+<span class="w"> </span><span class="nt">debug</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># displayed name</span>
+<span class="w"> </span><span class="nt">instance_name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;SearXNG&quot;</span>
+<span class="w"> </span><span class="c1"># For example: https://example.com/privacy</span>
+<span class="w"> </span><span class="nt">privacypolicy_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># use true to use your own donation page written in searx/info/en/donate.md</span>
+<span class="w"> </span><span class="c1"># use false to disable the donation link</span>
+<span class="w"> </span><span class="nt">donation_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># mailto:contact@example.com</span>
+<span class="w"> </span><span class="nt">contact_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># record stats</span>
+<span class="w"> </span><span class="nt">enable_metrics</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+
+<span class="nt">brand</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">new_issue_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/searxng/searxng/issues/new</span>
+<span class="w"> </span><span class="nt">docs_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://docs.searxng.org/</span>
+<span class="w"> </span><span class="nt">public_instances</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://searx.space</span>
+<span class="w"> </span><span class="nt">wiki_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/searxng/searxng/wiki</span>
+<span class="w"> </span><span class="nt">issue_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/searxng/searxng/issues</span>
+<span class="w"> </span><span class="c1"># custom:</span>
+<span class="w"> </span><span class="c1"># maintainer: &quot;Jon Doe&quot;</span>
+<span class="w"> </span><span class="c1"># # Custom entries in the footer: [title]: [link]</span>
+<span class="w"> </span><span class="c1"># links:</span>
+<span class="w"> </span><span class="c1"># Uptime: https://uptime.searxng.org/history/darmarit-org</span>
+<span class="w"> </span><span class="c1"># About: &quot;https://searxng.org&quot;</span>
+
+<span class="nt">search</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># Filter results. 0: None, 1: Moderate, 2: Strict</span>
+<span class="w"> </span><span class="nt">safe_search</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
+<span class="w"> </span><span class="c1"># Existing autocomplete backends: &quot;dbpedia&quot;, &quot;duckduckgo&quot;, &quot;google&quot;, &quot;yandex&quot;, &quot;mwmbl&quot;,</span>
+<span class="w"> </span><span class="c1"># &quot;seznam&quot;, &quot;startpage&quot;, &quot;stract&quot;, &quot;swisscows&quot;, &quot;qwant&quot;, &quot;wikipedia&quot; - leave blank to turn it off</span>
+<span class="w"> </span><span class="c1"># by default.</span>
+<span class="w"> </span><span class="nt">autocomplete</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="c1"># minimun characters to type before autocompleter starts</span>
+<span class="w"> </span><span class="nt">autocomplete_min</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4</span>
+<span class="w"> </span><span class="c1"># Default search language - leave blank to detect from browser information or</span>
+<span class="w"> </span><span class="c1"># use codes from &#39;languages.py&#39;</span>
+<span class="w"> </span><span class="nt">default_lang</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;auto&quot;</span>
+<span class="w"> </span><span class="c1"># max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages</span>
+<span class="w"> </span><span class="c1"># Available languages</span>
+<span class="w"> </span><span class="c1"># languages:</span>
+<span class="w"> </span><span class="c1"># - all</span>
+<span class="w"> </span><span class="c1"># - en</span>
+<span class="w"> </span><span class="c1"># - en-US</span>
+<span class="w"> </span><span class="c1"># - de</span>
+<span class="w"> </span><span class="c1"># - it-IT</span>
+<span class="w"> </span><span class="c1"># - fr</span>
+<span class="w"> </span><span class="c1"># - fr-BE</span>
+<span class="w"> </span><span class="c1"># ban time in seconds after engine errors</span>
+<span class="w"> </span><span class="nt">ban_time_on_fail</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5</span>
+<span class="w"> </span><span class="c1"># max ban time in seconds after engine errors</span>
+<span class="w"> </span><span class="nt">max_ban_time_on_fail</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">120</span>
+<span class="w"> </span><span class="nt">suspended_times</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># Engine suspension time after error (in seconds; set to 0 to disable)</span>
+<span class="w"> </span><span class="c1"># For error &quot;Access denied&quot; and &quot;HTTP error [402, 403]&quot;</span>
+<span class="w"> </span><span class="nt">SearxEngineAccessDenied</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">86400</span>
+<span class="w"> </span><span class="c1"># For error &quot;CAPTCHA&quot;</span>
+<span class="w"> </span><span class="nt">SearxEngineCaptcha</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">86400</span>
+<span class="w"> </span><span class="c1"># For error &quot;Too many request&quot; and &quot;HTTP error 429&quot;</span>
+<span class="w"> </span><span class="nt">SearxEngineTooManyRequests</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3600</span>
+<span class="w"> </span><span class="c1"># Cloudflare CAPTCHA</span>
+<span class="w"> </span><span class="nt">cf_SearxEngineCaptcha</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1296000</span>
+<span class="w"> </span><span class="nt">cf_SearxEngineAccessDenied</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">86400</span>
+<span class="w"> </span><span class="c1"># ReCAPTCHA</span>
+<span class="w"> </span><span class="nt">recaptcha_SearxEngineCaptcha</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">604800</span>
+
+<span class="w"> </span><span class="c1"># remove format to deny access, use lower case.</span>
+<span class="w"> </span><span class="c1"># formats: [html, csv, json, rss]</span>
+<span class="w"> </span><span class="nt">formats</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">html</span>
+
+<span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS}</span>
+<span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8888</span>
+<span class="w"> </span><span class="nt">bind_address</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;127.0.0.1&quot;</span>
+<span class="w"> </span><span class="c1"># public URL of the instance, to ensure correct inbound links. Is overwritten</span>
+<span class="w"> </span><span class="c1"># by ${SEARXNG_URL}.</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span><span class="w"> </span><span class="c1"># &quot;http://example.com/location&quot;</span>
+<span class="w"> </span><span class="nt">limiter</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span><span class="w"> </span><span class="c1"># rate limit the number of request on the instance, block some bots</span>
+<span class="w"> </span><span class="nt">public_instance</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span><span class="w"> </span><span class="c1"># enable features designed only for public instances</span>
+
+<span class="w"> </span><span class="c1"># If your instance owns a /etc/searxng/settings.yml file, then set the following</span>
+<span class="w"> </span><span class="c1"># values there.</span>
+
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span><span class="w"> </span><span class="c1"># Is overwritten by ${SEARXNG_SECRET}</span>
+<span class="w"> </span><span class="c1"># Proxying image results through searx</span>
+<span class="w"> </span><span class="nt">image_proxy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># 1.0 and 1.1 are supported</span>
+<span class="w"> </span><span class="nt">http_protocol_version</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;1.0&quot;</span>
+<span class="w"> </span><span class="c1"># POST queries are more secure as they don&#39;t show up in history but may cause</span>
+<span class="w"> </span><span class="c1"># problems when using Firefox containers</span>
+<span class="w"> </span><span class="nt">method</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;POST&quot;</span>
+<span class="w"> </span><span class="nt">default_http_headers</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">X-Content-Type-Options</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">nosniff</span>
+<span class="w"> </span><span class="nt">X-Download-Options</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">noopen</span>
+<span class="w"> </span><span class="nt">X-Robots-Tag</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">noindex, nofollow</span>
+<span class="w"> </span><span class="nt">Referrer-Policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">no-referrer</span>
+
+<span class="nt">redis</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}.</span>
+<span class="w"> </span><span class="c1"># https://docs.searxng.org/admin/settings/settings_redis.html#settings-redis</span>
+<span class="w"> </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+
+<span class="nt">ui</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># Custom static path - leave it blank if you didn&#39;t change</span>
+<span class="w"> </span><span class="nt">static_path</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="nt">static_use_hash</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># Custom templates path - leave it blank if you didn&#39;t change</span>
+<span class="w"> </span><span class="nt">templates_path</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="c1"># query_in_title: When true, the result page&#39;s titles contains the query</span>
+<span class="w"> </span><span class="c1"># it decreases the privacy, since the browser can records the page titles.</span>
+<span class="w"> </span><span class="nt">query_in_title</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># infinite_scroll: When true, automatically loads the next page when scrolling to bottom of the current page.</span>
+<span class="w"> </span><span class="nt">infinite_scroll</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># ui theme</span>
+<span class="w"> </span><span class="nt">default_theme</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">simple</span>
+<span class="w"> </span><span class="c1"># center the results ?</span>
+<span class="w"> </span><span class="nt">center_alignment</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="c1"># URL prefix of the internet archive, don&#39;t forget trailing slash (if needed).</span>
+<span class="w"> </span><span class="c1"># cache_url: &quot;https://webcache.googleusercontent.com/search?q=cache:&quot;</span>
+<span class="w"> </span><span class="c1"># Default interface locale - leave blank to detect from browser information or</span>
+<span class="w"> </span><span class="c1"># use codes from the &#39;locales&#39; config section</span>
+<span class="w"> </span><span class="nt">default_locale</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="c1"># Open result links in a new tab by default</span>
+<span class="w"> </span><span class="c1"># results_on_new_tab: false</span>
+<span class="w"> </span><span class="nt">theme_args</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># style of simple theme: auto, light, dark</span>
+<span class="w"> </span><span class="nt">simple_style</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">auto</span>
+<span class="w"> </span><span class="c1"># Perform search immediately if a category selected.</span>
+<span class="w"> </span><span class="c1"># Disable to select multiple categories at once and start the search manually.</span>
+<span class="w"> </span><span class="nt">search_on_category_select</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="c1"># Hotkeys: default or vim</span>
+<span class="w"> </span><span class="nt">hotkeys</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">default</span>
+
+<span class="c1"># Lock arbitrary settings on the preferences page. To find the ID of the user</span>
+<span class="c1"># setting you want to lock, check the ID of the form on the page &quot;preferences&quot;.</span>
+<span class="c1">#</span>
+<span class="c1"># preferences:</span>
+<span class="c1"># lock:</span>
+<span class="c1"># - language</span>
+<span class="c1"># - autocomplete</span>
+<span class="c1"># - method</span>
+<span class="c1"># - query_in_title</span>
+
+<span class="c1"># searx supports result proxification using an external service:</span>
+<span class="c1"># https://github.com/asciimoo/morty uncomment below section if you have running</span>
+<span class="c1"># morty proxy the key is base64 encoded (keep the !!binary notation)</span>
+<span class="c1"># Note: since commit af77ec3, morty accepts a base64 encoded key.</span>
+<span class="c1">#</span>
+<span class="c1"># result_proxy:</span>
+<span class="c1"># url: http://127.0.0.1:3000/</span>
+<span class="c1"># # the key is a base64 encoded string, the YAML !!binary prefix is optional</span>
+<span class="c1"># key: !!binary &quot;your_morty_proxy_key&quot;</span>
+<span class="c1"># # [true|false] enable the &quot;proxy&quot; button next to each result</span>
+<span class="c1"># proxify_results: true</span>
+
+<span class="c1"># communication with search engines</span>
+<span class="c1">#</span>
+<span class="nt">outgoing</span><span class="p">:</span>
+<span class="w"> </span><span class="c1"># default timeout in seconds, can be override by engine</span>
+<span class="w"> </span><span class="nt">request_timeout</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3.0</span>
+<span class="w"> </span><span class="c1"># the maximum timeout in seconds</span>
+<span class="w"> </span><span class="c1"># max_request_timeout: 10.0</span>
+<span class="w"> </span><span class="c1"># suffix of searx_useragent, could contain information like an email address</span>
+<span class="w"> </span><span class="c1"># to the administrator</span>
+<span class="w"> </span><span class="nt">useragent_suffix</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="c1"># The maximum number of concurrent connections that may be established.</span>
+<span class="w"> </span><span class="nt">pool_connections</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100</span>
+<span class="w"> </span><span class="c1"># Allow the connection pool to maintain keep-alive connections below this</span>
+<span class="w"> </span><span class="c1"># point.</span>
+<span class="w"> </span><span class="nt">pool_maxsize</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">20</span>
+<span class="w"> </span><span class="c1"># See https://www.python-httpx.org/http2/</span>
+<span class="w"> </span><span class="nt">enable_http2</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="c1"># uncomment below section if you want to use a custom server certificate</span>
+<span class="w"> </span><span class="c1"># see https://www.python-httpx.org/advanced/#changing-the-verification-defaults</span>
+<span class="w"> </span><span class="c1"># and https://www.python-httpx.org/compatibility/#ssl-configuration</span>
+<span class="w"> </span><span class="c1"># verify: ~/.mitmproxy/mitmproxy-ca-cert.cer</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># uncomment below section if you want to use a proxyq see: SOCKS proxies</span>
+<span class="w"> </span><span class="c1"># https://2.python-requests.org/en/latest/user/advanced/#proxies</span>
+<span class="w"> </span><span class="c1"># are also supported: see</span>
+<span class="w"> </span><span class="c1"># https://2.python-requests.org/en/latest/user/advanced/#socks</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># proxies:</span>
+<span class="w"> </span><span class="c1"># all://:</span>
+<span class="w"> </span><span class="c1"># - http://proxy1:8080</span>
+<span class="w"> </span><span class="c1"># - http://proxy2:8080</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># using_tor_proxy: true</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># Extra seconds to add in order to account for the time taken by the proxy</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># extra_proxy_timeout: 10</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># uncomment below section only if you have more than one network interface</span>
+<span class="w"> </span><span class="c1"># which can be the source of outgoing search requests</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># source_ips:</span>
+<span class="w"> </span><span class="c1"># - 1.1.1.1</span>
+<span class="w"> </span><span class="c1"># - 1.1.1.2</span>
+<span class="w"> </span><span class="c1"># - fe80::/126</span>
+
+<span class="c1"># External plugin configuration, for more details see</span>
+<span class="c1"># https://docs.searxng.org/dev/plugins.html</span>
+<span class="c1">#</span>
+<span class="c1"># plugins:</span>
+<span class="c1"># - plugin1</span>
+<span class="c1"># - plugin2</span>
+<span class="c1"># - ...</span>
+
+<span class="c1"># Comment or un-comment plugin to activate / deactivate by default.</span>
+<span class="c1">#</span>
+<span class="c1"># enabled_plugins:</span>
+<span class="c1"># # these plugins are enabled if nothing is configured ..</span>
+<span class="c1"># - &#39;Hash plugin&#39;</span>
+<span class="c1"># - &#39;Self Information&#39;</span>
+<span class="c1"># - &#39;Tracker URL remover&#39;</span>
+<span class="c1"># - &#39;Ahmia blacklist&#39; # activation depends on outgoing.using_tor_proxy</span>
+<span class="c1"># # these plugins are disabled if nothing is configured ..</span>
+<span class="c1"># - &#39;Hostname replace&#39; # see hostname_replace configuration below</span>
+<span class="c1"># - &#39;Calculator plugin&#39;</span>
+<span class="c1"># - &#39;Open Access DOI rewrite&#39;</span>
+<span class="c1"># - &#39;Tor check plugin&#39;</span>
+<span class="c1"># # Read the docs before activate: auto-detection of the language could be</span>
+<span class="c1"># # detrimental to users expectations / users can activate the plugin in the</span>
+<span class="c1"># # preferences if they want.</span>
+<span class="c1"># - &#39;Autodetect search language&#39;</span>
+
+<span class="c1"># Configuration of the &quot;Hostname replace&quot; plugin:</span>
+<span class="c1">#</span>
+</pre></div>
+</div>
+<p>To see the entire file jump to <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">git://searx/settings.yml</a></p>
+</div></div>
+<p>For a <em>minimal setup</em> you need to set <code class="docutils literal notranslate"><span class="pre">server:secret_key</span></code>.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-6-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-6-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" name="VXNlIGRlZmF1bHQgc2V0dGluZ3M=" role="tab" tabindex="0">Use default settings</button><button aria-controls="panel-6-bWluaW1hbCBzZXR1cA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-6-bWluaW1hbCBzZXR1cA==" name="bWluaW1hbCBzZXR1cA==" role="tab" tabindex="-1">minimal setup</button></div><div aria-labelledby="tab-6-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" class="sphinx-tabs-panel group-tab" id="panel-6-VXNlIGRlZmF1bHQgc2V0dGluZ3M=" name="VXNlIGRlZmF1bHQgc2V0dGluZ3M=" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>mkdir<span class="w"> </span>-p<span class="w"> </span><span class="s2">&quot;/etc/searxng&quot;</span>
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>cp<span class="w"> </span><span class="s2">&quot;/usr/local/searxng/searxng-src/utils/templates/etc/searxng/settings.yml&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span><span class="s2">&quot;/etc/searxng/settings.yml&quot;</span>
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-6-bWluaW1hbCBzZXR1cA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-6-bWluaW1hbCBzZXR1cA==" name="bWluaW1hbCBzZXR1cA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>sed<span class="w"> </span>-i<span class="w"> </span>-e<span class="w"> </span><span class="s2">&quot;s/ultrasecretkey/</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">16</span><span class="k">)</span><span class="s2">/g&quot;</span><span class="w"> </span><span class="se">\</span>
+<span class="w"> </span><span class="s2">&quot;/etc/searxng/settings.yml&quot;</span>
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="check">
+<h2><a class="toc-backref" href="#id6" role="doc-backlink">Check</a><a class="headerlink" href="#check" title="Link to this heading">¶</a></h2>
+<p>To check your SearXNG setup, optional enable debugging and start the <em>webapp</em>.
+SearXNG looks at the exported environment <code class="docutils literal notranslate"><span class="pre">$SEARXNG_SETTINGS_PATH</span></code> for a
+configuration file.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-7-YmFzaA==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-7-YmFzaA==" name="YmFzaA==" role="tab" tabindex="0">bash</button></div><div aria-labelledby="tab-7-YmFzaA==" class="sphinx-tabs-panel group-tab" id="panel-7-YmFzaA==" name="YmFzaA==" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="c1"># enable debug ..</span>
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>sed<span class="w"> </span>-i<span class="w"> </span>-e<span class="w"> </span><span class="s2">&quot;s/debug : False/debug : True/g&quot;</span><span class="w"> </span><span class="s2">&quot;/etc/searxng/settings.yml&quot;</span>
+
+<span class="c1"># start webapp</span>
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>-u<span class="w"> </span>searxng<span class="w"> </span>-i
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>/usr/local/searxng/searxng-src
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">SEARXNG_SETTINGS_PATH</span><span class="o">=</span><span class="s2">&quot;/etc/searxng/settings.yml&quot;</span>
+<span class="o">(</span>searxng<span class="o">)</span>$<span class="w"> </span>python<span class="w"> </span>searx/webapp.py
+
+<span class="c1"># disable debug</span>
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>sed<span class="w"> </span>-i<span class="w"> </span>-e<span class="w"> </span><span class="s2">&quot;s/debug : True/debug : False/g&quot;</span><span class="w"> </span><span class="s2">&quot;/etc/searxng/settings.yml&quot;</span>
+</pre></div>
+</div>
+</div></div>
+<p>Open WEB browser and visit <a class="reference external" href="http://127.0.0.1:8888">http://127.0.0.1:8888</a> . If you are inside a
+container or in a script, test with curl:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-8-V0VCIGJyb3dzZXI=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-8-V0VCIGJyb3dzZXI=" name="V0VCIGJyb3dzZXI=" role="tab" tabindex="0">WEB browser</button><button aria-controls="panel-8-Y3VybA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-8-Y3VybA==" name="Y3VybA==" role="tab" tabindex="-1">curl</button></div><div aria-labelledby="tab-8-V0VCIGJyb3dzZXI=" class="sphinx-tabs-panel group-tab" id="panel-8-V0VCIGJyb3dzZXI=" name="V0VCIGJyb3dzZXI=" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>xdg-open<span class="w"> </span>http://127.0.0.1:8888
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-8-Y3VybA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-8-Y3VybA==" name="Y3VybA==" role="tabpanel" tabindex="0"><div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ curl --location --verbose --head --insecure 127.0.0.1:8888
+
+* Trying 127.0.0.1:8888...
+* TCP_NODELAY set
+* Connected to 127.0.0.1 (127.0.0.1) port 8888 (#0)
+&gt; HEAD / HTTP/1.1
+&gt; Host: 127.0.0.1:8888
+&gt; User-Agent: curl/7.68.0
+&gt; Accept: */*
+&gt;
+* Mark bundle as not supporting multiuse
+* HTTP 1.0, assume close after body
+&lt; HTTP/1.0 200 OK
+HTTP/1.0 200 OK
+...
+</pre></div>
+</div>
+</div></div>
+<p>If everything works fine, hit <code class="docutils literal notranslate"><span class="pre">[CTRL-C]</span></code> to stop the <em>webapp</em> and disable the
+debug option in <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>. You can now exit SearXNG user bash session (enter exit
+command twice). At this point SearXNG is not demonized; uwsgi allows this.</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Step by step installation</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#install-packages">Install packages</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#create-user">Create user</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#install-searxng-dependencies">Install SearXNG &amp; dependencies</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#configuration">Configuration</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#check">Check</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="installation-scripts.html" title="previous chapter">Installation Script</a>
+ <li>Next: <a href="installation-uwsgi.html" title="next chapter">uWSGI</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/installation-searxng.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/installation-uwsgi.html b/admin/installation-uwsgi.html
new file mode 100644
index 000000000..78f3fa515
--- /dev/null
+++ b/admin/installation-uwsgi.html
@@ -0,0 +1,641 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>uWSGI &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="NGINX" href="installation-nginx.html" />
+ <link rel="prev" title="Step by step installation" href="installation-searxng.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="installation-nginx.html" title="NGINX"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="installation-searxng.html" title="Step by step installation"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">uWSGI</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="uwsgi">
+<span id="searxng-uwsgi"></span><h1>uWSGI<a class="headerlink" href="#uwsgi" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">further reading</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.freedesktop.org/software/systemd/man/systemd.unit.html">systemd.unit</a></p></li>
+<li><p><a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html">uWSGI Emperor</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#origin-uwsgi" id="id7">Origin uWSGI</a></p></li>
+<li><p><a class="reference internal" href="#distributors" id="id8">Distributors</a></p>
+<ul>
+<li><p><a class="reference internal" href="#debian-s-uwsgi-layout" id="id9">Debian’s uWSGI layout</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#uwsgi-maintenance" id="id10">uWSGI maintenance</a></p></li>
+<li><p><a class="reference internal" href="#uwsgi-setup" id="id11">uWSGI setup</a></p></li>
+<li><p><a class="reference internal" href="#pitfalls-of-the-tyrant-mode" id="id12">Pitfalls of the Tyrant mode</a></p></li>
+</ul>
+</nav>
+<section id="origin-uwsgi">
+<h2><a class="toc-backref" href="#id7" role="doc-backlink">Origin uWSGI</a><a class="headerlink" href="#origin-uwsgi" title="Link to this heading">¶</a></h2>
+<p>How uWSGI is implemented by distributors varies. The uWSGI project itself
+recommends two methods:</p>
+<ol class="arabic simple">
+<li><p><a class="reference external" href="https://www.freedesktop.org/software/systemd/man/systemd.unit.html">systemd.unit</a> template file as described here <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd">One service per app in systemd</a>:</p></li>
+</ol>
+<blockquote>
+<div><p>There is one <a class="reference external" href="http://0pointer.de/blog/projects/instances.html">systemd unit template</a> on the system installed and one <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files">uwsgi
+ini file</a> per uWSGI-app placed at dedicated locations. Take archlinux and a
+<code class="docutils literal notranslate"><span class="pre">searxng.ini</span></code> as example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">systemd</span> <span class="n">template</span> <span class="n">unit</span><span class="p">:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">@.</span><span class="n">service</span>
+ <span class="n">contains</span><span class="p">:</span> <span class="p">[</span><span class="n">Service</span><span class="p">]</span>
+ <span class="n">ExecStart</span><span class="o">=/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">uwsgi</span> <span class="o">--</span><span class="n">ini</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">/%</span><span class="n">I</span><span class="o">.</span><span class="n">ini</span>
+
+<span class="n">SearXNG</span> <span class="n">application</span><span class="p">:</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">ini</span>
+ <span class="n">links</span> <span class="n">to</span><span class="p">:</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">/</span><span class="n">apps</span><span class="o">-</span><span class="n">available</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">ini</span>
+</pre></div>
+</div>
+<p>The SearXNG app (template <code class="docutils literal notranslate"><span class="pre">/etc/uwsgi/%I.ini</span></code>) can be maintained as known
+from common systemd units:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>uwsgi@searxng
+$<span class="w"> </span>systemctl<span class="w"> </span>start<span class="w"> </span>uwsgi@searxng
+$<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>uwsgi@searxng
+$<span class="w"> </span>systemctl<span class="w"> </span>stop<span class="w"> </span>uwsgi@searxng
+</pre></div>
+</div>
+</div></blockquote>
+<ol class="arabic simple" start="2">
+<li><p>The <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html">uWSGI Emperor</a> which fits for maintaining a large range of uwsgi
+apps and there is a <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting">Tyrant mode</a> to secure multi-user hosting.</p></li>
+</ol>
+<blockquote>
+<div><p>The Emperor mode is a special uWSGI instance that will monitor specific
+events. The Emperor mode (the service) is started by a (common, not template)
+systemd unit.</p>
+<p>The Emperor service will scan specific directories for <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files">uwsgi ini file</a>s
+(also know as <em>vassals</em>). If a <em>vassal</em> is added, removed or the timestamp is
+modified, a corresponding action takes place: a new uWSGI instance is started,
+reload or stopped. Take Fedora and a <code class="docutils literal notranslate"><span class="pre">searxng.ini</span></code> as example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">to</span> <span class="n">install</span> <span class="o">&amp;</span> <span class="n">start</span> <span class="n">SearXNG</span> <span class="n">instance</span> <span class="n">create</span> <span class="o">--&gt;</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">ini</span>
+<span class="n">to</span> <span class="n">reload</span> <span class="n">the</span> <span class="n">instance</span> <span class="n">edit</span> <span class="n">timestamp</span> <span class="o">--&gt;</span> <span class="n">touch</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">ini</span>
+<span class="n">to</span> <span class="n">stop</span> <span class="n">instance</span> <span class="n">remove</span> <span class="n">ini</span> <span class="o">--&gt;</span> <span class="n">rm</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">ini</span>
+</pre></div>
+</div>
+</div></blockquote>
+</section>
+<section id="distributors">
+<h2><a class="toc-backref" href="#id8" role="doc-backlink">Distributors</a><a class="headerlink" href="#distributors" title="Link to this heading">¶</a></h2>
+<p>The <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html">uWSGI Emperor</a> mode and <a class="reference external" href="http://0pointer.de/blog/projects/instances.html">systemd unit template</a> is what the distributors
+mostly offer their users, even if they differ in the way they implement both
+modes and their defaults. Another point they might differ in is the packaging of
+plugins (if so, compare <a class="reference internal" href="installation-searxng.html#install-packages"><span class="std std-ref">Install packages</span></a>) and what the default python
+interpreter is (python2 vs. python3).</p>
+<p>While archlinux does not start a uWSGI service by default, Fedora (RHEL) starts
+a Emperor in <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting">Tyrant mode</a> by default (you should have read <a class="reference internal" href="#uwsgi-tyrant-mode-pitfalls"><span class="std std-ref">Pitfalls of the Tyrant mode</span></a>). Worth to know; debian (ubuntu) follow a complete different
+approach, read see <a class="reference internal" href="#debian-s-uwsgi-layout"><span class="std std-ref">Debian’s uWSGI layout</span></a>.</p>
+<section id="debian-s-uwsgi-layout">
+<span id="id1"></span><h3><a class="toc-backref" href="#id9" role="doc-backlink">Debian’s uWSGI layout</a><a class="headerlink" href="#debian-s-uwsgi-layout" title="Link to this heading">¶</a></h3>
+<p>Be aware, Debian’s uWSGI layout is quite different from the standard uWSGI
+configuration. Your are familiar with <a class="reference internal" href="installation-apache.html#debian-s-apache-layout"><span class="std std-ref">Debian’s Apache layout</span></a>? .. they do a
+similar thing for the uWSGI infrastructure. The folders are:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">/</span><span class="n">apps</span><span class="o">-</span><span class="n">available</span><span class="o">/</span>
+<span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">/</span><span class="n">apps</span><span class="o">-</span><span class="n">enabled</span><span class="o">/</span>
+</pre></div>
+</div>
+<p>The <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#ini-files">uwsgi ini file</a> is enabled by a symbolic link:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ln</span> <span class="o">-</span><span class="n">s</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">/</span><span class="n">apps</span><span class="o">-</span><span class="n">available</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">ini</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">uwsgi</span><span class="o">/</span><span class="n">apps</span><span class="o">-</span><span class="n">enabled</span><span class="o">/</span>
+</pre></div>
+</div>
+<p>More details can be found in the <a class="reference external" href="https://salsa.debian.org/uwsgi-team/uwsgi/-/raw/debian/latest/debian/uwsgi.README.Debian">uwsgi.README.Debian</a>
+(<code class="docutils literal notranslate"><span class="pre">/usr/share/doc/uwsgi/README.Debian.gz</span></code>). Some commands you should know on
+Debian:</p>
+<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>Commands recognized by init.d script
+====================================
+
+You can issue to init.d script following commands:
+ * start | starts daemon
+ * stop | stops daemon
+ * reload | sends to daemon SIGHUP signal
+ * force-reload | sends to daemon SIGTERM signal
+ * restart | issues &#39;stop&#39;, then &#39;start&#39; commands
+ * status | shows status of daemon instance (running/not running)
+
+&#39;status&#39; command must be issued with exactly one argument: &#39;&lt;confname&gt;&#39;.
+
+Controlling specific instances of uWSGI
+=======================================
+
+You could control specific instance(s) by issuing:
+
+ SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi &lt;command&gt; &lt;confname&gt; &lt;confname&gt;...
+
+where:
+ * &lt;command&gt; is one of &#39;start&#39;, &#39;stop&#39; etc.
+ * &lt;confname&gt; is the name of configuration file (without extension)
+
+For example, this is how instance for /etc/uwsgi/apps-enabled/hello.xml is
+started:
+
+ SYSTEMCTL_SKIP_REDIRECT=1 service uwsgi start hello
+</pre></div>
+</div>
+</section>
+</section>
+<section id="uwsgi-maintenance">
+<span id="id2"></span><h2><a class="toc-backref" href="#id10" role="doc-backlink">uWSGI maintenance</a><a class="headerlink" href="#uwsgi-maintenance" title="Link to this heading">¶</a></h2>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-0-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-0-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-0-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-0-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># init.d --&gt; /usr/share/doc/uwsgi/README.Debian.gz</span>
+<span class="c1"># For uWSGI debian uses the LSB init process, this might be changed</span>
+<span class="c1"># one day, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=833067</span>
+
+create<span class="w"> </span>/etc/uwsgi/apps-available/searxng.ini
+enable:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/uwsgi/apps-available/searxng.ini<span class="w"> </span>/etc/uwsgi/apps-enabled/
+start:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>service<span class="w"> </span>uwsgi<span class="w"> </span>start<span class="w"> </span>searxng
+restart:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>service<span class="w"> </span>uwsgi<span class="w"> </span>restart<span class="w"> </span>searxng
+stop:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>service<span class="w"> </span>uwsgi<span class="w"> </span>stop<span class="w"> </span>searxng
+disable:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>rm<span class="w"> </span>/etc/uwsgi/apps-enabled/searxng.ini
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># systemd --&gt; /usr/lib/systemd/system/uwsgi@.service</span>
+<span class="c1"># For uWSGI archlinux uses systemd template units, see</span>
+<span class="c1"># - http://0pointer.de/blog/projects/instances.html</span>
+<span class="c1"># - https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#one-service-per-app-in-systemd</span>
+
+create:<span class="w"> </span>/etc/uwsgi/searxng.ini
+enable:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>uwsgi@searxng
+start:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>start<span class="w"> </span>uwsgi@searxng
+restart:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>uwsgi@searxng
+stop:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>stop<span class="w"> </span>uwsgi@searxng
+disable:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>systemctl<span class="w"> </span>disable<span class="w"> </span>uwsgi@searxng
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># systemd --&gt; /usr/lib/systemd/system/uwsgi.service</span>
+<span class="c1"># The unit file starts uWSGI in emperor mode (/etc/uwsgi.ini), see</span>
+<span class="c1"># - https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html</span>
+
+create:<span class="w"> </span>/etc/uwsgi.d/searxng.ini
+restart:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>touch<span class="w"> </span>/etc/uwsgi.d/searxng.ini
+disable:<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>rm<span class="w"> </span>/etc/uwsgi.d/searxng.ini
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="uwsgi-setup">
+<span id="id3"></span><h2><a class="toc-backref" href="#id11" role="doc-backlink">uWSGI setup</a><a class="headerlink" href="#uwsgi-setup" title="Link to this heading">¶</a></h2>
+<p>Create the configuration ini-file according to your distribution and restart the
+uwsgi application. As shown below, the <a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a> installs by
+default:</p>
+<ul class="simple">
+<li><p>a uWSGI setup that listens on a socket and</p></li>
+<li><p>enables <a class="reference internal" href="settings/settings_ui.html#static-use-hash"><span class="std std-ref">cache busting</span></a>.</p></li>
+</ul>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-VWJ1bnR1IC8gZGViaWFu" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tab" tabindex="0">Ubuntu / debian</button><button aria-controls="panel-1-QXJjaCBMaW51eA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tab" tabindex="-1">Arch Linux</button><button aria-controls="panel-1-RmVkb3JhIC8gUkhFTA==" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tab" tabindex="-1">Fedora / RHEL</button></div><div aria-labelledby="tab-1-VWJ1bnR1IC8gZGViaWFu" class="sphinx-tabs-panel group-tab" id="panel-1-VWJ1bnR1IC8gZGViaWFu" name="VWJ1bnR1IC8gZGViaWFu" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- mode: conf; coding: utf-8 -*-</span>
+<span class="o">[</span>uwsgi<span class="o">]</span>
+
+<span class="c1"># uWSGI core</span>
+<span class="c1"># ----------</span>
+<span class="c1">#</span>
+<span class="c1"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#uwsgi-core</span>
+
+<span class="c1"># Who will run the code / Hint: in emperor-tyrant mode uid &amp; gid setting will be</span>
+<span class="c1"># ignored [1]. Mode emperor-tyrant is the default on fedora (/etc/uwsgi.ini).</span>
+<span class="c1">#</span>
+<span class="c1"># [1] https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting</span>
+<span class="c1">#</span>
+<span class="nv">uid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searxng
+<span class="nv">gid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searxng
+
+<span class="c1"># set (python) default encoding UTF-8</span>
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LANG</span><span class="o">=</span>C.UTF-8
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LANGUAGE</span><span class="o">=</span>C.UTF-8
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LC_ALL</span><span class="o">=</span>C.UTF-8
+
+<span class="c1"># chdir to specified directory before apps loading</span>
+<span class="nv">chdir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searxng-src/searx
+
+<span class="c1"># SearXNG configuration (settings.yml)</span>
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">SEARXNG_SETTINGS_PATH</span><span class="o">=</span>/etc/searxng/settings.yml
+
+<span class="c1"># disable logging for privacy</span>
+disable-logging<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># The right granted on the created socket</span>
+chmod-socket<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">666</span>
+
+<span class="c1"># Plugin to use and interpreter config</span>
+single-interpreter<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># enable master process</span>
+<span class="nv">master</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># load apps in each worker instead of the master</span>
+lazy-apps<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># load uWSGI plugins</span>
+<span class="nv">plugin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>python3,http
+
+<span class="c1"># By default the Python plugin does not initialize the GIL. This means your</span>
+<span class="c1"># app-generated threads will not run. If you need threads, remember to enable</span>
+<span class="c1"># them with enable-threads. Running uWSGI in multithreading mode (with the</span>
+<span class="c1"># threads options) will automatically enable threading support. This *strange*</span>
+<span class="c1"># default behaviour is for performance reasons.</span>
+enable-threads<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># Number of workers (usually CPU count)</span>
+<span class="nv">workers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>%k
+<span class="nv">threads</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span>
+
+<span class="c1"># plugin: python</span>
+<span class="c1"># --------------</span>
+<span class="c1">#</span>
+<span class="c1"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-python</span>
+
+<span class="c1"># load a WSGI module</span>
+<span class="nv">module</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searx.webapp
+
+<span class="c1"># set PYTHONHOME/virtualenv</span>
+<span class="nv">virtualenv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searx-pyenv
+
+<span class="c1"># add directory (or glob) to pythonpath</span>
+<span class="nv">pythonpath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searxng-src
+
+
+<span class="c1"># speak to upstream</span>
+<span class="c1"># -----------------</span>
+
+<span class="nv">socket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/run/socket
+buffer-size<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">8192</span>
+
+<span class="c1"># uWSGI serves the static files and in settings.yml we use::</span>
+<span class="c1">#</span>
+<span class="c1"># ui:</span>
+<span class="c1"># static_use_hash: true</span>
+<span class="c1">#</span>
+static-map<span class="w"> </span><span class="o">=</span><span class="w"> </span>/static<span class="o">=</span>/usr/local/searxng/searxng-src/searx/static
+<span class="c1"># expires set to one day</span>
+static-expires<span class="w"> </span><span class="o">=</span><span class="w"> </span>/*<span class="w"> </span><span class="m">86400</span>
+static-gzip-all<span class="w"> </span><span class="o">=</span><span class="w"> </span>True
+offload-threads<span class="w"> </span><span class="o">=</span><span class="w"> </span>%k
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-QXJjaCBMaW51eA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-QXJjaCBMaW51eA==" name="QXJjaCBMaW51eA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- mode: conf; coding: utf-8 -*-</span>
+<span class="o">[</span>uwsgi<span class="o">]</span>
+
+<span class="c1"># uWSGI core</span>
+<span class="c1"># ----------</span>
+<span class="c1">#</span>
+<span class="c1"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#uwsgi-core</span>
+
+<span class="c1"># Who will run the code</span>
+<span class="nv">uid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searxng
+<span class="nv">gid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searxng
+
+<span class="c1"># set (python) default encoding UTF-8</span>
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LANG</span><span class="o">=</span>C.UTF-8
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LANGUAGE</span><span class="o">=</span>C.UTF-8
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LC_ALL</span><span class="o">=</span>C.UTF-8
+
+<span class="c1"># chdir to specified directory before apps loading</span>
+<span class="nv">chdir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searxng-src/searx
+
+<span class="c1"># SearXNG configuration (settings.yml)</span>
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">SEARXNG_SETTINGS_PATH</span><span class="o">=</span>/etc/searxng/settings.yml
+
+<span class="c1"># disable logging for privacy</span>
+<span class="nv">logger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>systemd
+disable-logging<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># The right granted on the created socket</span>
+chmod-socket<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">666</span>
+
+<span class="c1"># Plugin to use and interpreter config</span>
+single-interpreter<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># enable master process</span>
+<span class="nv">master</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># load apps in each worker instead of the master</span>
+lazy-apps<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># load uWSGI plugins</span>
+<span class="nv">plugin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>python
+
+<span class="c1"># By default the Python plugin does not initialize the GIL. This means your</span>
+<span class="c1"># app-generated threads will not run. If you need threads, remember to enable</span>
+<span class="c1"># them with enable-threads. Running uWSGI in multithreading mode (with the</span>
+<span class="c1"># threads options) will automatically enable threading support. This *strange*</span>
+<span class="c1"># default behaviour is for performance reasons.</span>
+enable-threads<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># Number of workers (usually CPU count)</span>
+<span class="nv">workers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>%k
+<span class="nv">threads</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span>
+
+<span class="c1"># plugin: python</span>
+<span class="c1"># --------------</span>
+<span class="c1">#</span>
+<span class="c1"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-python</span>
+
+<span class="c1"># load a WSGI module</span>
+<span class="nv">module</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searx.webapp
+
+<span class="c1"># set PYTHONHOME/virtualenv</span>
+<span class="nv">virtualenv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searx-pyenv
+
+<span class="c1"># add directory (or glob) to pythonpath</span>
+<span class="nv">pythonpath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searxng-src
+
+
+<span class="c1"># speak to upstream</span>
+<span class="c1"># -----------------</span>
+
+<span class="nv">socket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/run/socket
+buffer-size<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">8192</span>
+
+<span class="c1"># uWSGI serves the static files and in settings.yml we use::</span>
+<span class="c1">#</span>
+<span class="c1"># ui:</span>
+<span class="c1"># static_use_hash: true</span>
+<span class="c1">#</span>
+static-map<span class="w"> </span><span class="o">=</span><span class="w"> </span>/static<span class="o">=</span>/usr/local/searxng/searxng-src/searx/static
+<span class="c1"># expires set to one day</span>
+static-expires<span class="w"> </span><span class="o">=</span><span class="w"> </span>/*<span class="w"> </span><span class="m">86400</span>
+static-gzip-all<span class="w"> </span><span class="o">=</span><span class="w"> </span>True
+offload-threads<span class="w"> </span><span class="o">=</span><span class="w"> </span>%k
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-RmVkb3JhIC8gUkhFTA==" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-RmVkb3JhIC8gUkhFTA==" name="RmVkb3JhIC8gUkhFTA==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- mode: conf; coding: utf-8 -*-</span>
+<span class="o">[</span>uwsgi<span class="o">]</span>
+
+<span class="c1"># uWSGI core</span>
+<span class="c1"># ----------</span>
+<span class="c1">#</span>
+<span class="c1"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#uwsgi-core</span>
+
+<span class="c1"># Who will run the code / Hint: in emperor-tyrant mode uid &amp; gid setting will be</span>
+<span class="c1"># ignored [1]. Mode emperor-tyrant is the default on fedora (/etc/uwsgi.ini).</span>
+<span class="c1">#</span>
+<span class="c1"># [1] https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting</span>
+<span class="c1">#</span>
+<span class="nv">uid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searxng
+<span class="nv">gid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searxng
+
+<span class="c1"># set (python) default encoding UTF-8</span>
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LANG</span><span class="o">=</span>C.UTF-8
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LANGUAGE</span><span class="o">=</span>C.UTF-8
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">LC_ALL</span><span class="o">=</span>C.UTF-8
+
+<span class="c1"># chdir to specified directory before apps loading</span>
+<span class="nv">chdir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searxng-src/searx
+
+<span class="c1"># SearXNG configuration (settings.yml)</span>
+<span class="nv">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">SEARXNG_SETTINGS_PATH</span><span class="o">=</span>/etc/searxng/settings.yml
+
+<span class="c1"># disable logging for privacy</span>
+disable-logging<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># The right granted on the created socket</span>
+chmod-socket<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">666</span>
+
+<span class="c1"># Plugin to use and interpreter config</span>
+single-interpreter<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># enable master process</span>
+<span class="nv">master</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># load apps in each worker instead of the master</span>
+lazy-apps<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># load uWSGI plugins</span>
+<span class="nv">plugin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>python3,http
+
+<span class="c1"># By default the Python plugin does not initialize the GIL. This means your</span>
+<span class="c1"># app-generated threads will not run. If you need threads, remember to enable</span>
+<span class="c1"># them with enable-threads. Running uWSGI in multithreading mode (with the</span>
+<span class="c1"># threads options) will automatically enable threading support. This *strange*</span>
+<span class="c1"># default behaviour is for performance reasons.</span>
+enable-threads<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
+
+<span class="c1"># Number of workers (usually CPU count)</span>
+<span class="nv">workers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>%k
+<span class="nv">threads</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span>
+
+<span class="c1"># plugin: python</span>
+<span class="c1"># --------------</span>
+<span class="c1">#</span>
+<span class="c1"># https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-python</span>
+
+<span class="c1"># load a WSGI module</span>
+<span class="nv">module</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>searx.webapp
+
+<span class="c1"># set PYTHONHOME/virtualenv</span>
+<span class="nv">virtualenv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searx-pyenv
+
+<span class="c1"># add directory (or glob) to pythonpath</span>
+<span class="nv">pythonpath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/searxng-src
+
+
+<span class="c1"># speak to upstream</span>
+<span class="c1"># -----------------</span>
+
+<span class="nv">socket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>/usr/local/searxng/run/socket
+buffer-size<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">8192</span>
+
+<span class="c1"># uWSGI serves the static files and in settings.yml we use::</span>
+<span class="c1">#</span>
+<span class="c1"># ui:</span>
+<span class="c1"># static_use_hash: true</span>
+<span class="c1">#</span>
+static-map<span class="w"> </span><span class="o">=</span><span class="w"> </span>/static<span class="o">=</span>/usr/local/searxng/searxng-src/searx/static
+<span class="c1"># expires set to one day</span>
+static-expires<span class="w"> </span><span class="o">=</span><span class="w"> </span>/*<span class="w"> </span><span class="m">86400</span>
+static-gzip-all<span class="w"> </span><span class="o">=</span><span class="w"> </span>True
+offload-threads<span class="w"> </span><span class="o">=</span><span class="w"> </span>%k
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="pitfalls-of-the-tyrant-mode">
+<span id="uwsgi-tyrant-mode-pitfalls"></span><h2><a class="toc-backref" href="#id12" role="doc-backlink">Pitfalls of the Tyrant mode</a><a class="headerlink" href="#pitfalls-of-the-tyrant-mode" title="Link to this heading">¶</a></h2>
+<p>The implementation of the process owners and groups in the <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting">Tyrant mode</a> is
+somewhat unusual and requires special consideration. In <a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/Emperor.html#tyrant-mode-secure-multi-user-hosting">Tyrant mode</a> mode the
+Emperor will run the vassal using the UID/GID of the vassal configuration file
+(user and group of the app <code class="docutils literal notranslate"><span class="pre">.ini</span></code> file).</p>
+<p>Without option <code class="docutils literal notranslate"><span class="pre">emperor-tyrant-initgroups=true</span></code> in <code class="docutils literal notranslate"><span class="pre">/etc/uwsgi.ini</span></code> the
+process won’t get the additional groups, but this option is not available in
+2.0.x branch (see <a class="reference external" href="https://github.com/unbit/uwsgi/issues/2099">#2099&#64;uWSGI</a>) the feature <a class="reference external" href="https://github.com/unbit/uwsgi/pull/752">#752&#64;uWSGI</a> has been merged (on
+Oct. 2014) to the master branch of uWSGI but had never been released; the last
+major release is from Dec. 2013, since the there had been only bugfix releases
+(see <a class="reference external" href="https://github.com/unbit/uwsgi/issues/2425">#2425uWSGI</a>). To shorten up:</p>
+<blockquote>
+<div><p><strong>In Tyrant mode, there is no way to get additional groups, and the uWSGI
+process misses additional permissions that may be needed.</strong></p>
+</div></blockquote>
+<p>For example on Fedora (RHEL): If you try to install a redis DB with socket
+communication and you want to connect to it from the SearXNG uWSGI, you will see a
+<em>Permission denied</em> in the log of your instance:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>ERROR:searx.redisdb: [searxng (993)] can&#39;t connect redis DB ...
+ERROR:searx.redisdb: Error 13 connecting to unix socket: /usr/local/searxng-redis/run/redis.sock. Permission denied.
+ERROR:searx.plugins.limiter: init limiter DB failed!!!
+</pre></div>
+</div>
+<p>Even if your <em>searxng</em> user of the uWSGI process is added to additional groups
+to give access to the socket from the redis DB:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ groups searxng
+searxng : searxng searxng-redis
+</pre></div>
+</div>
+<p>To see the effective groups of the uwsgi process, you have to look at the status
+of the process, by example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ ps -aef | grep &#39;/usr/sbin/uwsgi --ini searxng.ini&#39;
+searxng 93 92 0 12:43 ? 00:00:00 /usr/sbin/uwsgi --ini searxng.ini
+searxng 186 93 0 12:44 ? 00:00:01 /usr/sbin/uwsgi --ini searxng.ini
+</pre></div>
+</div>
+<p>Here you can see that the additional “Groups” of PID 186 are unset (missing gid
+of <code class="docutils literal notranslate"><span class="pre">searxng-redis</span></code>):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cat /proc/186/task/186/status
+...
+Uid: 993 993 993 993
+Gid: 993 993 993 993
+FDSize: 128
+Groups:
+...
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">uWSGI</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#origin-uwsgi">Origin uWSGI</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#distributors">Distributors</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#debian-s-uwsgi-layout">Debian’s uWSGI layout</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#uwsgi-maintenance">uWSGI maintenance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#uwsgi-setup">uWSGI setup</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#pitfalls-of-the-tyrant-mode">Pitfalls of the Tyrant mode</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="installation-searxng.html" title="previous chapter">Step by step installation</a>
+ <li>Next: <a href="installation-nginx.html" title="next chapter">NGINX</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/installation-uwsgi.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/installation.html b/admin/installation.html
new file mode 100644
index 000000000..116eaac4f
--- /dev/null
+++ b/admin/installation.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Installation &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Docker Container" href="installation-docker.html" />
+ <link rel="prev" title="categories_as_tabs:" href="settings/settings_categories_as_tabs.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="installation-docker.html" title="Docker Container"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings/settings_categories_as_tabs.html" title="categories_as_tabs:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Installation</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="installation">
+<span id="id1"></span><h1>Installation<a class="headerlink" href="#installation" title="Link to this heading">¶</a></h1>
+<p><em>You’re spoilt for choice</em>, choose your preferred method of installation.</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="installation-docker.html#installation-docker"><span class="std std-ref">Docker Container</span></a></p></li>
+<li><p><a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a></p></li>
+<li><p><a class="reference internal" href="installation-searxng.html#installation-basic"><span class="std std-ref">Step by step installation</span></a></p></li>
+</ul>
+<p>The <a class="reference internal" href="installation-searxng.html#installation-basic"><span class="std std-ref">Step by step installation</span></a> is an excellent illustration of <em>how a SearXNG
+instance is build up</em> (see <a class="reference internal" href="architecture.html#architecture-uwsgi"><span class="std std-ref">uWSGI Setup</span></a>). If you do not have any
+special preferences, it’s recommended to use the <a class="reference internal" href="installation-docker.html#installation-docker"><span class="std std-ref">Docker Container</span></a> or the
+<a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a>.</p>
+<div class="admonition attention">
+<p class="admonition-title">Attention</p>
+<p>SearXNG is growing rapidly, you should regularly read our <a class="reference internal" href="update-searxng.html#migrate-and-stay-tuned"><span class="std std-ref">Migrate and stay tuned!</span></a> section. If you want to upgrade an existing instance or migrate
+from searx to SearXNG, you should read this section first!</p>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="settings/settings_categories_as_tabs.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a>
+ <li>Next: <a href="installation-docker.html" title="next chapter">Docker Container</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/installation.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/plugins.html b/admin/plugins.html
new file mode 100644
index 000000000..1dad99518
--- /dev/null
+++ b/admin/plugins.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Plugins builtin &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Buildhosts" href="buildhosts.html" />
+ <link rel="prev" title="Architecture" href="architecture.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="buildhosts.html" title="Buildhosts"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="architecture.html" title="Architecture"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Plugins builtin</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="plugins-builtin">
+<span id="plugins-generic"></span><h1>Plugins builtin<a class="headerlink" href="#plugins-builtin" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../dev/plugins.html#dev-plugin"><span class="std std-ref">Plugins</span></a></p></li>
+</ul>
+</aside>
+<p>Configuration defaults (at built time):</p>
+<dl class="field-list simple">
+<dt class="field-odd">DO<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Default on</p>
+</dd>
+</dl>
+<span id="configured-plugins"></span><table class="docutils align-default" id="id1">
+<caption><span class="caption-number">Table 1 </span><span class="caption-text">Plugins configured at built time (defaults)</span><a class="headerlink" href="#id1" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 23.1%" />
+<col style="width: 7.7%" />
+<col style="width: 69.2%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>DO</p></th>
+<th class="head"><p>Description</p>
+<p>JS &amp; CSS dependencies</p>
+</th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><th class="stub"><p>Basic Calculator</p></th>
+<td></td>
+<td><p>Calculate mathematical expressions via the search bar</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p>Hash plugin</p></th>
+<td><p>y</p></td>
+<td><p>Converts strings to different hash digests.</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p>Hostname replace</p></th>
+<td></td>
+<td><p>Rewrite result hostnames or remove results based on the hostname</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p>Open Access DOI rewrite</p></th>
+<td></td>
+<td><p>Avoid paywalls by redirecting to open-access versions of publications when available</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p>Self Information</p></th>
+<td><p>y</p></td>
+<td><p>Displays your IP if the query is “ip” and your user agent if the query contains “user agent”.</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p>Tor check plugin</p></th>
+<td></td>
+<td><p>This plugin checks if the address of the request is a Tor exit-node, and informs the user if it is; like check.torproject.org, but from SearXNG.</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p>Tracker URL remover</p></th>
+<td><p>y</p></td>
+<td><p>Remove trackers arguments from the returned URL</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p>Unit converter plugin</p></th>
+<td><p>y</p></td>
+<td><p>Convert between units</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="architecture.html" title="previous chapter">Architecture</a>
+ <li>Next: <a href="buildhosts.html" title="next chapter">Buildhosts</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/plugins.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/searx.limiter.html b/admin/searx.limiter.html
new file mode 100644
index 000000000..1e3164614
--- /dev/null
+++ b/admin/searx.limiter.html
@@ -0,0 +1,305 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Limiter &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Administration API" href="api.html" />
+ <link rel="prev" title="Answer CAPTCHA from server’s IP" href="answer-captcha.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="api.html" title="Administration API"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="answer-captcha.html" title="Answer CAPTCHA from server’s IP"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Limiter</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="limiter">
+<span id="id1"></span><h1>Limiter<a class="headerlink" href="#limiter" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<p>The limiter requires a <a class="reference internal" href="settings/settings_redis.html#settings-redis"><span class="std std-ref">Redis</span></a> database.</p>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#enable-limiter" id="id3">Enable Limiter</a></p></li>
+<li><p><a class="reference internal" href="#configure-limiter" id="id4">Configure Limiter</a></p></li>
+<li><p><a class="reference internal" href="#limiter-toml" id="id5"><code class="docutils literal notranslate"><span class="pre">limiter.toml</span></code></a></p></li>
+<li><p><a class="reference internal" href="#implementation" id="id6">Implementation</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.limiter">Bot protection / IP rate limitation. The intention of rate limitation is to
+limit suspicious requests from an IP. The motivation behind this is the fact
+that SearXNG passes through requests from bots and is thus classified as a bot
+itself. As a result, the SearXNG engine then receives a CAPTCHA or is blocked
+by the search engine (the origin) in some other way.</p>
+<p>To avoid blocking, the requests from bots to SearXNG must also be blocked, this
+is the task of the limiter. To perform this task, the limiter uses the methods
+from the <a class="reference internal" href="../src/searx.botdetection.html#botdetection"><span class="std std-ref">Bot Detection</span></a>:</p>
+<ul class="simple">
+<li><p>Analysis of the HTTP header in the request / <a class="reference internal" href="../src/searx.botdetection.html#botdetection-probe-headers"><span class="std std-ref">Probe HTTP headers</span></a>
+can be easily bypassed.</p></li>
+<li><p>Block and pass lists in which IPs are listed / <a class="reference internal" href="../src/searx.botdetection.html#botdetection-ip-lists"><span class="std std-ref">IP lists</span></a>
+are hard to maintain, since the IPs of bots are not all known and change over
+the time.</p></li>
+<li><p>Detection &amp; dynamically <a class="reference internal" href="../src/searx.botdetection.html#botdetection-rate-limit"><span class="std std-ref">Rate limit</span></a> of bots based on the
+behavior of the requests. For dynamically changeable IP lists a Redis
+database is needed.</p></li>
+</ul>
+<p>The prerequisite for IP based methods is the correct determination of the IP of
+the client. The IP of the client is determined via the <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For">X-Forwarded-For</a> HTTP
+header.</p>
+<div class="admonition attention">
+<p class="admonition-title">Attention</p>
+<p>A correct setup of the HTTP request headers <code class="docutils literal notranslate"><span class="pre">X-Forwarded-For</span></code> and
+<code class="docutils literal notranslate"><span class="pre">X-Real-IP</span></code> is essential to be able to assign a request to an IP correctly:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://docs.searxng.org/admin/installation-nginx.html#nginx-s-searxng-site">NGINX RequestHeader</a></p></li>
+<li><p><a class="reference external" href="https://docs.searxng.org/admin/installation-apache.html#apache-s-searxng-site">Apache RequestHeader</a></p></li>
+</ul>
+</div>
+<section id="enable-limiter">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Enable Limiter</a><a class="headerlink" href="#enable-limiter" title="Link to this heading">¶</a></h2>
+<p>To enable the limiter activate:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">limiter</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span><span class="w"> </span><span class="c1"># rate limit the number of request on the instance, block some bots</span>
+</pre></div>
+</div>
+<p>and set the redis-url connection. Check the value, it depends on your redis DB
+(see <a class="reference internal" href="settings/settings_redis.html#settings-redis"><span class="std std-ref">redis:</span></a>), by example:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">redis</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">unix:///usr/local/searxng-redis/run/redis.sock?db=0</span>
+</pre></div>
+</div>
+</section>
+<section id="configure-limiter">
+<h2><a class="toc-backref" href="#id4" role="doc-backlink">Configure Limiter</a><a class="headerlink" href="#configure-limiter" title="Link to this heading">¶</a></h2>
+<p>The methods of <a class="reference internal" href="../src/searx.botdetection.html#botdetection"><span class="std std-ref">Bot Detection</span></a> the limiter uses are configured in a local
+file <code class="docutils literal notranslate"><span class="pre">/etc/searxng/limiter.toml</span></code>. The defaults are shown in <a class="reference internal" href="#limiter-toml">limiter.toml</a> /
+Don’t copy all values to your local configuration, just enable what you need by
+overwriting the defaults. For instance to activate the <code class="docutils literal notranslate"><span class="pre">link_token</span></code> method in
+the <a class="reference internal" href="../src/searx.botdetection.html#botdetection-ip-limit"><span class="std std-ref">Method ip_limit</span></a> you only need to set this option to <code class="docutils literal notranslate"><span class="pre">true</span></code>:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[botdetection.ip_limit]</span>
+<span class="n">link_token</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span>
+</pre></div>
+</div>
+</section>
+<section id="limiter-toml">
+<span id="id2"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">limiter.toml</span></code></a><a class="headerlink" href="#limiter-toml" title="Link to this heading">¶</a></h2>
+<p>In this file the limiter finds the configuration of the <a class="reference internal" href="../src/searx.botdetection.html#botdetection"><span class="std std-ref">Bot Detection</span></a>:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../src/searx.botdetection.html#botdetection-ip-lists"><span class="std std-ref">IP lists</span></a></p></li>
+<li><p><a class="reference internal" href="../src/searx.botdetection.html#botdetection-rate-limit"><span class="std std-ref">Rate limit</span></a></p></li>
+<li><p><a class="reference internal" href="../src/searx.botdetection.html#botdetection-probe-headers"><span class="std std-ref">Probe HTTP headers</span></a></p></li>
+</ul>
+<div class="code toml highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">real_ip</span><span class="p">]</span>
+
+<span class="c1"># Number of values to trust for X-Forwarded-For.</span>
+
+<span class="n">x_for</span> <span class="o">=</span> <span class="mi">1</span>
+
+<span class="c1"># The prefix defines the number of leading bits in an address that are compared</span>
+<span class="c1"># to determine whether or not an address is part of a (client) network.</span>
+
+<span class="n">ipv4_prefix</span> <span class="o">=</span> <span class="mi">32</span>
+<span class="n">ipv6_prefix</span> <span class="o">=</span> <span class="mi">48</span>
+
+<span class="p">[</span><span class="n">botdetection</span><span class="o">.</span><span class="n">ip_limit</span><span class="p">]</span>
+
+<span class="c1"># To get unlimited access in a local network, by default link-lokal addresses</span>
+<span class="c1"># (networks) are not monitored by the ip_limit</span>
+<span class="n">filter_link_local</span> <span class="o">=</span> <span class="n">false</span>
+
+<span class="c1"># activate link_token method in the ip_limit method</span>
+<span class="n">link_token</span> <span class="o">=</span> <span class="n">false</span>
+
+<span class="p">[</span><span class="n">botdetection</span><span class="o">.</span><span class="n">ip_lists</span><span class="p">]</span>
+
+<span class="c1"># In the limiter, the ip_lists method has priority over all other methods -&gt; if</span>
+<span class="c1"># an IP is in the pass_ip list, it has unrestricted access and it is also not</span>
+<span class="c1"># checked if e.g. the &quot;user agent&quot; suggests a bot (e.g. curl).</span>
+
+<span class="n">block_ip</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="c1"># &#39;93.184.216.34&#39;, # IPv4 of example.org</span>
+ <span class="c1"># &#39;257.1.1.1&#39;, # invalid IP --&gt; will be ignored, logged in ERROR class</span>
+<span class="p">]</span>
+
+<span class="n">pass_ip</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="c1"># &#39;192.168.0.0/16&#39;, # IPv4 private network</span>
+ <span class="c1"># &#39;fe80::/10&#39; # IPv6 linklocal / wins over botdetection.ip_limit.filter_link_local</span>
+<span class="p">]</span>
+
+<span class="c1"># Activate passlist of (hardcoded) IPs from the SearXNG organization,</span>
+<span class="c1"># e.g. `check.searx.space`.</span>
+<span class="n">pass_searxng_org</span> <span class="o">=</span> <span class="n">true</span>
+</pre></div>
+</div>
+</section>
+<section id="implementation">
+<h2><a class="toc-backref" href="#id6" role="doc-backlink">Implementation</a><a class="headerlink" href="#implementation" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.limiter.initialize">
+<span class="sig-prename descclassname"><span class="pre">searx.limiter.</span></span><span class="sig-name descname"><span class="pre">initialize</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">app</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Flask" title="(in Flask v3.0.x)"><span class="pre">Flask</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">settings</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/limiter.html#initialize"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.limiter.initialize" title="Link to this definition">¶</a></dt>
+<dd><p>Install the limiter</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.limiter.is_installed">
+<span class="sig-prename descclassname"><span class="pre">searx.limiter.</span></span><span class="sig-name descname"><span class="pre">is_installed</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/limiter.html#is_installed"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.limiter.is_installed" title="Link to this definition">¶</a></dt>
+<dd><p>Returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if limiter is active and a redis DB is available.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.limiter.pre_request">
+<span class="sig-prename descclassname"><span class="pre">searx.limiter.</span></span><span class="sig-name descname"><span class="pre">pre_request</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/limiter.html#pre_request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.limiter.pre_request" title="Link to this definition">¶</a></dt>
+<dd><p>See <a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Flask.before_request" title="(in Flask v3.0.x)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">flask.Flask.before_request</span></code></a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.limiter.LIMITER_CFG">
+<span class="sig-prename descclassname"><span class="pre">searx.limiter.</span></span><span class="sig-name descname"><span class="pre">LIMITER_CFG</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">PosixPath('/etc/searxng/limiter.toml')</span></em><a class="headerlink" href="#searx.limiter.LIMITER_CFG" title="Link to this definition">¶</a></dt>
+<dd><p>Local Limiter configuration.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.limiter.LIMITER_CFG_SCHEMA">
+<span class="sig-prename descclassname"><span class="pre">searx.limiter.</span></span><span class="sig-name descname"><span class="pre">LIMITER_CFG_SCHEMA</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">PosixPath('/home/runner/work/searxng/searxng/searx/limiter.toml')</span></em><a class="headerlink" href="#searx.limiter.LIMITER_CFG_SCHEMA" title="Link to this definition">¶</a></dt>
+<dd><p>Base configuration (schema) of the botdetection.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Limiter</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#enable-limiter">Enable Limiter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#configure-limiter">Configure Limiter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#limiter-toml"><code class="docutils literal notranslate"><span class="pre">limiter.toml</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#implementation">Implementation</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.limiter.initialize"><code class="docutils literal notranslate"><span class="pre">initialize()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.limiter.is_installed"><code class="docutils literal notranslate"><span class="pre">is_installed()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.limiter.pre_request"><code class="docutils literal notranslate"><span class="pre">pre_request()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.limiter.LIMITER_CFG"><code class="docutils literal notranslate"><span class="pre">LIMITER_CFG</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.limiter.LIMITER_CFG_SCHEMA"><code class="docutils literal notranslate"><span class="pre">LIMITER_CFG_SCHEMA</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="answer-captcha.html" title="previous chapter">Answer CAPTCHA from server’s IP</a>
+ <li>Next: <a href="api.html" title="next chapter">Administration API</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/searx.limiter.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/index.html b/admin/settings/index.html
new file mode 100644
index 000000000..885151113
--- /dev/null
+++ b/admin/settings/index.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Settings &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="settings.yml" href="settings.html" />
+ <link rel="prev" title="Administrator documentation" href="../index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings.html" title="settings.yml"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../index.html" title="Administrator documentation"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Settings</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="settings">
+<h1>Settings<a class="headerlink" href="#settings" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">Engine settings.yml</span></a></p></li>
+<li><p><a class="reference internal" href="../../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Engine File</span></a></p></li>
+</ul>
+</aside>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="settings.html"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="settings.html#settings-yml-location">settings.yml location</a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings.html#use-default-settings">use_default_settings</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="settings_engine.html#private-engines-tokens">Private Engines (<code class="docutils literal notranslate"><span class="pre">tokens</span></code>)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="settings_engine.html#example-multilingual-search">Example: Multilingual Search</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="settings_brand.html"><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a></li>
+<li class="toctree-l1"><a class="reference internal" href="settings_general.html"><code class="docutils literal notranslate"><span class="pre">general:</span></code></a></li>
+<li class="toctree-l1"><a class="reference internal" href="settings_search.html"><code class="docutils literal notranslate"><span class="pre">search:</span></code></a></li>
+<li class="toctree-l1"><a class="reference internal" href="settings_server.html"><code class="docutils literal notranslate"><span class="pre">server:</span></code></a></li>
+<li class="toctree-l1"><a class="reference internal" href="settings_ui.html"><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a></li>
+<li class="toctree-l1"><a class="reference internal" href="settings_redis.html"><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="settings_redis.html#redis-developer-notes">Redis Developer Notes</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="settings_outgoing.html"><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a></li>
+<li class="toctree-l1"><a class="reference internal" href="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Settings</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="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="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="../index.html" title="previous chapter">Administrator documentation</a>
+ <li>Next: <a href="settings.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings.html b/admin/settings/settings.html
new file mode 100644
index 000000000..4d25839e4
--- /dev/null
+++ b/admin/settings/settings.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>settings.yml &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="engine:" href="settings_engine.html" />
+ <link rel="prev" title="Settings" href="index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_engine.html" title="engine:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="Settings"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="settings-yml">
+<span id="id1"></span><h1><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code><a class="headerlink" href="#settings-yml" title="Link to this heading">¶</a></h1>
+<p>This page describe the options possibilities of the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">git://searx/settings.yml</a>
+file.</p>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../installation-searxng.html#use-default-settings-yml"><span class="std std-ref">Configuration</span></a></p></li>
+<li><p><a class="reference internal" href="../../dev/search_api.html#search-api"><span class="std std-ref">Search API</span></a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#settings-yml-location" id="id2">settings.yml location</a></p></li>
+<li><p><a class="reference internal" href="#use-default-settings" id="id3">use_default_settings</a></p></li>
+</ul>
+</nav>
+<section id="settings-yml-location">
+<span id="settings-location"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">settings.yml location</a><a class="headerlink" href="#settings-yml-location" title="Link to this heading">¶</a></h2>
+<p>The initial <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code> we be load from these locations:</p>
+<ol class="arabic simple">
+<li><p>the full path specified in the <code class="docutils literal notranslate"><span class="pre">SEARXNG_SETTINGS_PATH</span></code> environment variable.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">/etc/searxng/settings.yml</span></code></p></li>
+</ol>
+<p>If these files don’t exist (or are empty or can’t be read), SearXNG uses the
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">git://searx/settings.yml</a> file. Read <a class="reference internal" href="#settings-use-default-settings"><span class="std std-ref">use_default_settings</span></a> to
+see how you can simplify your <em>user defined</em> <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>.</p>
+</section>
+<section id="use-default-settings">
+<span id="settings-use-default-settings"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">use_default_settings</a><a class="headerlink" href="#use-default-settings" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title"><code class="docutils literal notranslate"><span class="pre">use_default_settings:</span> <span class="pre">true</span></code></p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#settings-location"><span class="std std-ref">settings.yml location</span></a></p></li>
+<li><p><a class="reference internal" href="../installation-searxng.html#use-default-settings-yml"><span class="std std-ref">Configuration</span></a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/templates/etc/searxng/settings.yml">/etc/searxng/settings.yml</a></p></li>
+</ul>
+</aside>
+<p>The user defined <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code> is loaded from the <a class="reference internal" href="#settings-location"><span class="std std-ref">settings.yml location</span></a>
+and can relied on the default configuration <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">git://searx/settings.yml</a> using:</p>
+<blockquote>
+<div><p><code class="docutils literal notranslate"><span class="pre">use_default_settings:</span> <span class="pre">true</span></code></p>
+</div></blockquote>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">server:</span></code></dt><dd><p>In the following example, the actual settings are the default settings defined
+in <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">git://searx/settings.yml</a> with the exception of the <code class="docutils literal notranslate"><span class="pre">secret_key</span></code> and
+the <code class="docutils literal notranslate"><span class="pre">bind_address</span></code>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">use_default_settings</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span><span class="w"> </span><span class="c1"># change this!</span>
+<span class="w"> </span><span class="nt">bind_address</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;0.0.0.0&quot;</span>
+</pre></div>
+</div>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">engines:</span></code></dt><dd><p>With <code class="docutils literal notranslate"><span class="pre">use_default_settings:</span> <span class="pre">true</span></code>, each settings can be override in a
+similar way, the <code class="docutils literal notranslate"><span class="pre">engines</span></code> section is merged according to the engine
+<code class="docutils literal notranslate"><span class="pre">name</span></code>. In this example, SearXNG will load all the default engines, will
+enable the <code class="docutils literal notranslate"><span class="pre">bing</span></code> engine and define a <a class="reference internal" href="settings_engine.html#private-engines"><span class="std std-ref">token</span></a> for
+the arch linux engine:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">use_default_settings</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span><span class="w"> </span><span class="c1"># change this!</span>
+<span class="nt">engines</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">arch linux wiki</span>
+<span class="w"> </span><span class="nt">tokens</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&#39;$ecretValue&#39;</span><span class="p p-Indicator">]</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bing</span>
+<span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+</pre></div>
+</div>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">engines:</span></code> / <code class="docutils literal notranslate"><span class="pre">remove:</span></code></dt><dd><p>It is possible to remove some engines from the default settings. The following
+example is similar to the above one, but SearXNG doesn’t load the the google
+engine:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">use_default_settings</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">engines</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">remove</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">google</span>
+<span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span><span class="w"> </span><span class="c1"># change this!</span>
+<span class="nt">engines</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">arch linux wiki</span>
+<span class="w"> </span><span class="nt">tokens</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&#39;$ecretValue&#39;</span><span class="p p-Indicator">]</span>
+</pre></div>
+</div>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">engines:</span></code> / <code class="docutils literal notranslate"><span class="pre">keep_only:</span></code></dt><dd><p>As an alternative, it is possible to specify the engines to keep. In the
+following example, SearXNG has only two engines:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">use_default_settings</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">engines</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">keep_only</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">google</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">duckduckgo</span>
+<span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span><span class="w"> </span><span class="c1"># change this!</span>
+<span class="nt">engines</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">google</span>
+<span class="w"> </span><span class="nt">tokens</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&#39;$ecretValue&#39;</span><span class="p p-Indicator">]</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">duckduckgo</span>
+<span class="w"> </span><span class="nt">tokens</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&#39;$ecretValue&#39;</span><span class="p p-Indicator">]</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#settings-yml-location">settings.yml location</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#use-default-settings">use_default_settings</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="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="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="index.html" title="previous chapter">Settings</a>
+ <li>Next: <a href="settings_engine.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_brand.html b/admin/settings/settings_brand.html
new file mode 100644
index 000000000..7e2eb116c
--- /dev/null
+++ b/admin/settings/settings_brand.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>brand: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="general:" href="settings_general.html" />
+ <link rel="prev" title="engine:" href="settings_engine.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_general.html" title="general:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_engine.html" title="engine:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="brand">
+<span id="settings-brand"></span><h1><code class="docutils literal notranslate"><span class="pre">brand:</span></code><a class="headerlink" href="#brand" title="Link to this heading">¶</a></h1>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">brand</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">issue_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/searxng/searxng/issues</span>
+<span class="w"> </span><span class="nt">docs_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://docs.searxng.org</span>
+<span class="w"> </span><span class="nt">public_instances</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://searx.space</span>
+<span class="w"> </span><span class="nt">wiki_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/searxng/searxng/wiki</span>
+</pre></div>
+</div>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">issue_url</span></code> :</dt><dd><p>If you host your own issue tracker change this URL.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">docs_url</span></code> :</dt><dd><p>If you host your own documentation change this URL.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">public_instances</span></code> :</dt><dd><p>If you host your own <a class="reference external" href="https://searx.space">https://searx.space</a> change this URL.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">wiki_url</span></code> :</dt><dd><p>Link to your wiki (or <code class="docutils literal notranslate"><span class="pre">false</span></code>)</p>
+</dd>
+</dl>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_engine.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a>
+ <li>Next: <a href="settings_general.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">general:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_brand.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_categories_as_tabs.html b/admin/settings/settings_categories_as_tabs.html
new file mode 100644
index 000000000..7cdc865a1
--- /dev/null
+++ b/admin/settings/settings_categories_as_tabs.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>categories_as_tabs: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="Installation" href="../installation.html" />
+ <link rel="prev" title="outgoing:" href="settings_outgoing.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../installation.html" title="Installation"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_outgoing.html" title="outgoing:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="categories-as-tabs">
+<span id="settings-categories-as-tabs"></span><h1><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code><a class="headerlink" href="#categories-as-tabs" title="Link to this heading">¶</a></h1>
+<p>A list of the categories that are displayed as tabs in the user interface.
+Categories not listed here can still be searched with the <a class="reference internal" href="../../user/search-syntax.html#search-syntax"><span class="std std-ref">Search syntax</span></a>.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">categories_as_tabs</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">general</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">images</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">videos</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">news</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">map</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">music</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">it</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">science</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">files</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">social media</span><span class="p">:</span>
+</pre></div>
+</div>
+<p>Engines are added to <code class="docutils literal notranslate"><span class="pre">categories:</span></code> (compare <a class="reference internal" href="settings_engine.html#engine-categories"><span class="std std-ref">categories</span></a>), the
+categories listed in <code class="docutils literal notranslate"><span class="pre">categories_as_tabs</span></code> are shown as tabs in the UI. If
+there are no active engines in a category, the tab is not displayed (e.g. if a
+user disables all engines in a category).</p>
+<p>On the preferences page (<code class="docutils literal notranslate"><span class="pre">/preferences</span></code>) – under <em>engines</em> – there is an
+additional tab, called <em>other</em>. In this tab are all engines listed that are not
+in one of the UI tabs (not included in <code class="docutils literal notranslate"><span class="pre">categories_as_tabs</span></code>).</p>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="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="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="settings_outgoing.html"><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_outgoing.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a>
+ <li>Next: <a href="../installation.html" title="next chapter">Installation</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_categories_as_tabs.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_engine.html b/admin/settings/settings_engine.html
new file mode 100644
index 000000000..8f7433f89
--- /dev/null
+++ b/admin/settings/settings_engine.html
@@ -0,0 +1,361 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>engine: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="brand:" href="settings_brand.html" />
+ <link rel="prev" title="settings.yml" href="settings.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_brand.html" title="brand:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings.html" title="settings.yml"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="engine">
+<span id="settings-engine"></span><h1><code class="docutils literal notranslate"><span class="pre">engine:</span></code><a class="headerlink" href="#engine" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../user/configured_engines.html#configured-engines"><span class="std std-ref">Configured Engines</span></a></p></li>
+<li><p><a class="reference internal" href="../../dev/engines/engine_overview.html#engines-dev"><span class="std std-ref">Engine Overview</span></a></p></li>
+</ul>
+</aside>
+<p>In the code example below a <em>full fledged</em> example of a YAML setup from a dummy
+engine is shown. Most of the options have a default value or even are optional.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>A few more options are possible, but they are pretty specific to some
+engines (<a class="reference internal" href="../../dev/engines/index.html#engine-implementations"><span class="std std-ref">Engine Implementations</span></a>).</p>
+</div>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">example engine</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">example</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">demo</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;https://{language}.example.com/&#39;</span>
+<span class="w"> </span><span class="nt">send_accept_language_header</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">general</span>
+<span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3.0</span>
+<span class="w"> </span><span class="nt">api_key</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;apikey&#39;</span>
+<span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">language</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">en_US</span>
+<span class="w"> </span><span class="nt">tokens</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="w"> </span><span class="s">&#39;my-secret-token&#39;</span><span class="w"> </span><span class="p p-Indicator">]</span>
+<span class="w"> </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
+<span class="w"> </span><span class="nt">display_error_messages</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">about</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">website</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://example.com</span>
+<span class="w"> </span><span class="nt">wikidata_id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Q306656</span>
+<span class="w"> </span><span class="nt">official_api_documentation</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://example.com/api-doc</span>
+<span class="w"> </span><span class="nt">use_official_api</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">require_api_key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">results</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">HTML</span>
+
+<span class="w"> </span><span class="c1"># overwrite values from section &#39;outgoing:&#39;</span>
+<span class="w"> </span><span class="nt">enable_http2</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
+<span class="w"> </span><span class="nt">max_connections</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100</span>
+<span class="w"> </span><span class="nt">max_keepalive_connections</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10</span>
+<span class="w"> </span><span class="nt">keepalive_expiry</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5.0</span>
+<span class="w"> </span><span class="nt">using_tor_proxy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">proxies</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">http</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://proxy1:8080</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://proxy2:8080</span>
+<span class="w"> </span><span class="nt">https</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://proxy1:8080</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://proxy2:8080</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">socks5://user:password@proxy3:1080</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">socks5h://user:password@proxy4:1080</span>
+
+<span class="w"> </span><span class="c1"># other network settings</span>
+<span class="w"> </span><span class="nt">enable_http</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">retry_on_http_error</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span><span class="w"> </span><span class="c1"># or 403 or [404, 429]</span>
+</pre></div>
+</div>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">name</span></code> :</dt><dd><p>Name that will be used across SearXNG to define this engine. In settings, on
+the result page…</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">engine</span></code> :</dt><dd><p>Name of the python file used to handle requests and responses to and from this
+search engine.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">shortcut</span></code> :</dt><dd><p>Code used to execute bang requests (in this case using <code class="docutils literal notranslate"><span class="pre">!bi</span></code>)</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">base_url</span></code><span class="classifier">optional</span></dt><dd><p>Part of the URL that should be stable across every request. Can be useful to
+use multiple sites using only one engine, or updating the site URL without
+touching at the code.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">send_accept_language_header</span></code> :</dt><dd><p>Several engines that support languages (or regions) deal with the HTTP header
+<code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> to build a response that fits to the locale. When this
+option is activated, the language (locale) that is selected by the user is used
+to build and send a <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> header in the request to the origin
+search engine.</p>
+</dd>
+</dl>
+<dl id="engine-categories">
+<dt><code class="docutils literal notranslate"><span class="pre">categories</span></code><span class="classifier">optional</span></dt><dd><p>Specifies to which categories the engine should be added. Engines can be
+assigned to multiple categories.</p>
+<p>Categories can be shown as tabs (<a class="reference internal" href="settings_categories_as_tabs.html#settings-categories-as-tabs"><span class="std std-ref">categories_as_tabs:</span></a>) in the
+UI. A search in a tab (in the UI) will query all engines that are active in
+this tab. In the preferences page (<code class="docutils literal notranslate"><span class="pre">/preferences</span></code>) – under <em>engines</em> –
+users can select what engine should be active when querying in this tab.</p>
+<p>Alternatively, <a class="reference internal" href="../../user/search-syntax.html#search-syntax"><span class="std std-ref">!bang</span></a> can be used to search all engines
+in a category, regardless of whether they are active or not, or whether they
+are in a tab of the UI or not. For example, <code class="docutils literal notranslate"><span class="pre">!dictionaries</span></code> can be used to
+query all search engines in that category (group).</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">timeout</span></code><span class="classifier">optional</span></dt><dd><p>Timeout of the search with the current search engine. Overwrites
+<code class="docutils literal notranslate"><span class="pre">request_timeout</span></code> from <a class="reference internal" href="settings_outgoing.html#settings-outgoing"><span class="std std-ref">outgoing:</span></a>. <strong>Be careful, it will
+modify the global timeout of SearXNG.</strong></p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">api_key</span></code><span class="classifier">optional</span></dt><dd><p>In a few cases, using an API needs the use of a secret key. How to obtain them
+is described in the file.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">disabled</span></code><span class="classifier">optional</span></dt><dd><p>To disable by default the engine, but not deleting it. It will allow the user
+to manually activate it in the settings.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">inactive</span></code>: optional</dt><dd><p>Remove the engine from the settings (<em>disabled &amp; removed</em>).</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">language</span></code><span class="classifier">optional</span></dt><dd><p>If you want to use another language for a specific engine, you can define it
+by using the ISO code of language (and region), like <code class="docutils literal notranslate"><span class="pre">fr</span></code>, <code class="docutils literal notranslate"><span class="pre">en-US</span></code>,
+<code class="docutils literal notranslate"><span class="pre">de-DE</span></code>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">tokens</span></code><span class="classifier">optional</span></dt><dd><p>A list of secret tokens to make this engine <em>private</em>, more details see
+<a class="reference internal" href="#private-engines"><span class="std std-ref">Private Engines (tokens)</span></a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">weight</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">1</span></code></span></dt><dd><p>Weighting of the results of this engine.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">display_error_messages</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">true</span></code></span></dt><dd><p>When an engine returns an error, the message is displayed on the user interface.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">network</span></code><span class="classifier">optional</span></dt><dd><p>Use the network configuration from another engine.
+In addition, there are two default networks:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">ipv4</span></code> set <code class="docutils literal notranslate"><span class="pre">local_addresses</span></code> to <code class="docutils literal notranslate"><span class="pre">0.0.0.0</span></code> (use only IPv4 local addresses)</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">ipv6</span></code> set <code class="docutils literal notranslate"><span class="pre">local_addresses</span></code> to <code class="docutils literal notranslate"><span class="pre">::</span></code> (use only IPv6 local addresses)</p></li>
+</ul>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">enable_http</span></code><span class="classifier">optional</span></dt><dd><p>Enable HTTP for this engine (by default only HTTPS is enabled).</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">retry_on_http_error</span></code><span class="classifier">optional</span></dt><dd><p>Retry request on some HTTP status code.</p>
+<p>Example:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">true</span></code> : on HTTP status code between 400 and 599.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">403</span></code> : on HTTP status code 403.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">[403,</span> <span class="pre">429]</span></code>: on HTTP status code 403 and 429.</p></li>
+</ul>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">proxies</span></code> :</dt><dd><p>Overwrites proxy settings from <a class="reference internal" href="settings_outgoing.html#settings-outgoing"><span class="std std-ref">outgoing:</span></a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">using_tor_proxy</span></code> :</dt><dd><p>Using tor proxy (<code class="docutils literal notranslate"><span class="pre">true</span></code>) or not (<code class="docutils literal notranslate"><span class="pre">false</span></code>) for this engine. The default is
+taken from <code class="docutils literal notranslate"><span class="pre">using_tor_proxy</span></code> of the <a class="reference internal" href="settings_outgoing.html#settings-outgoing"><span class="std std-ref">outgoing:</span></a>.</p>
+</dd>
+</dl>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">max_keepalive_connection#s</span></code> :</dt><dd><dl class="simple">
+<dt><a class="reference external" href="https://www.python-httpx.org/advanced/#pool-limit-configuration">Pool limit configuration</a>, overwrites value <code class="docutils literal notranslate"><span class="pre">pool_maxsize</span></code> from</dt><dd><p><a class="reference internal" href="settings_outgoing.html#settings-outgoing"><span class="std std-ref">outgoing:</span></a> for this engine.</p>
+</dd>
+</dl>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">max_connections</span></code> :</dt><dd><p><a class="reference external" href="https://www.python-httpx.org/advanced/#pool-limit-configuration">Pool limit configuration</a>, overwrites value <code class="docutils literal notranslate"><span class="pre">pool_connections</span></code> from
+<a class="reference internal" href="settings_outgoing.html#settings-outgoing"><span class="std std-ref">outgoing:</span></a> for this engine.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">keepalive_expiry</span></code> :</dt><dd><p><a class="reference external" href="https://www.python-httpx.org/advanced/#pool-limit-configuration">Pool limit configuration</a>, overwrites value <code class="docutils literal notranslate"><span class="pre">keepalive_expiry</span></code> from
+<a class="reference internal" href="settings_outgoing.html#settings-outgoing"><span class="std std-ref">outgoing:</span></a> for this engine.</p>
+</dd>
+</dl>
+<section id="private-engines-tokens">
+<span id="private-engines"></span><h2>Private Engines (<code class="docutils literal notranslate"><span class="pre">tokens</span></code>)<a class="headerlink" href="#private-engines-tokens" title="Link to this heading">¶</a></h2>
+<p>Administrators might find themselves wanting to limit access to some of the
+enabled engines on their instances. It might be because they do not want to
+expose some private information through <a class="reference internal" href="../../dev/engines/index.html#offline-engines"><span class="std std-ref">Offline Engines</span></a>. Or they would
+rather share engines only with their trusted friends or colleagues.</p>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<p>Initial sponsored by <a class="reference external" href="https://nlnet.nl/discovery">Search and Discovery Fund</a> of <a class="reference external" href="https://nlnet.nl/">NLnet Foundation</a>.</p>
+</aside>
+<p>To solve this issue the concept of <em>private engines</em> exists.</p>
+<p>A new option was added to engines named <cite>tokens</cite>. It expects a list of strings.
+If the user making a request presents one of the tokens of an engine, they can
+access information about the engine and make search requests.</p>
+<p>Example configuration to restrict access to the Arch Linux Wiki engine:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">arch linux wiki</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">archlinux</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">al</span>
+<span class="w"> </span><span class="nt">tokens</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="w"> </span><span class="s">&#39;my-secret-token&#39;</span><span class="w"> </span><span class="p p-Indicator">]</span>
+</pre></div>
+</div>
+<p>Unless a user has configured the right token, the engine is going to be hidden
+from him/her. It is not going to be included in the list of engines on the
+Preferences page and in the output of <cite>/config</cite> REST API call.</p>
+<p>Tokens can be added to one’s configuration on the Preferences page under “Engine
+tokens”. The input expects a comma separated list of strings.</p>
+<p>The distribution of the tokens from the administrator to the users is not carved
+in stone. As providing access to such engines implies that the admin knows and
+trusts the user, we do not see necessary to come up with a strict process.
+Instead, we would like to add guidelines to the documentation of the feature.</p>
+</section>
+<section id="example-multilingual-search">
+<h2>Example: Multilingual Search<a class="headerlink" href="#example-multilingual-search" title="Link to this heading">¶</a></h2>
+<p>SearXNG does not support true multilingual search. You have to use the language
+prefix in your search query when searching in a different language.</p>
+<p>But there is a workaround: By adding a new search engine with a different
+language, SearXNG will search in your default and other language.</p>
+<p>Example configuration in settings.yml for a German and English speaker:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">search</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">default_lang </span><span class="p">:</span><span class="w"> </span><span class="s">&quot;de&quot;</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+
+<span class="nt">engines</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">google english</span>
+<span class="w"> </span><span class="nt">engine </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">google</span>
+<span class="w"> </span><span class="nt">language </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">en</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+<p>When searching, the default google engine will return German results and
+“google english” will return English results.</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="settings.html"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#private-engines-tokens">Private Engines (<code class="docutils literal notranslate"><span class="pre">tokens</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#example-multilingual-search">Example: Multilingual Search</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="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="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a>
+ <li>Next: <a href="settings_brand.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_engine.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_general.html b/admin/settings/settings_general.html
new file mode 100644
index 000000000..0ce15f098
--- /dev/null
+++ b/admin/settings/settings_general.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>general: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="search:" href="settings_search.html" />
+ <link rel="prev" title="brand:" href="settings_brand.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_search.html" title="search:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_brand.html" title="brand:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">general:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="general">
+<span id="settings-general"></span><h1><code class="docutils literal notranslate"><span class="pre">general:</span></code><a class="headerlink" href="#general" title="Link to this heading">¶</a></h1>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">general</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">debug</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">instance_name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;SearXNG&quot;</span>
+<span class="w"> </span><span class="nt">privacypolicy_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">donation_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">contact_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">enable_metrics</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+</pre></div>
+</div>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">debug</span></code><span class="classifier"><code class="docutils literal notranslate"><span class="pre">$SEARXNG_DEBUG</span></code></span></dt><dd><p>Allow a more detailed log if you run SearXNG directly. Display <em>detailed</em> error
+messages in the browser too, so this must be deactivated in production.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">donation_url</span></code> :</dt><dd><p>Set value to <code class="docutils literal notranslate"><span class="pre">true</span></code> to use your own donation page written in the
+<a class="reference internal" href="../../src/searx.infopage.html#searx-infopage"><span class="std std-ref">searx/info/en/donate.md</span></a> and use <code class="docutils literal notranslate"><span class="pre">false</span></code> to disable
+the donation link altogether.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">privacypolicy_url</span></code>:</dt><dd><p>Link to privacy policy.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">contact_url</span></code>:</dt><dd><p>Contact <code class="docutils literal notranslate"><span class="pre">mailto:</span></code> address or WEB form.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">enable_metrics</span></code>:</dt><dd><p>Enabled by default. Record various anonymous metrics available at <code class="docutils literal notranslate"><span class="pre">/stats</span></code>,
+<code class="docutils literal notranslate"><span class="pre">/stats/errors</span></code> and <code class="docutils literal notranslate"><span class="pre">/preferences</span></code>.</p>
+</dd>
+</dl>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="settings_brand.html"><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">general:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_brand.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a>
+ <li>Next: <a href="settings_search.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">search:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_general.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_outgoing.html b/admin/settings/settings_outgoing.html
new file mode 100644
index 000000000..6f4b284f2
--- /dev/null
+++ b/admin/settings/settings_outgoing.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>outgoing: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="categories_as_tabs:" href="settings_categories_as_tabs.html" />
+ <link rel="prev" title="redis:" href="settings_redis.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_categories_as_tabs.html" title="categories_as_tabs:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_redis.html" title="redis:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="outgoing">
+<span id="settings-outgoing"></span><h1><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code><a class="headerlink" href="#outgoing" title="Link to this heading">¶</a></h1>
+<p>Communication with search engines.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">outgoing</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">request_timeout</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2.0</span><span class="w"> </span><span class="c1"># default timeout in seconds, can be override by engine</span>
+<span class="w"> </span><span class="nt">max_request_timeout</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.0</span><span class="w"> </span><span class="c1"># the maximum timeout in seconds</span>
+<span class="w"> </span><span class="nt">useragent_suffix</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w"> </span><span class="c1"># information like an email address to the administrator</span>
+<span class="w"> </span><span class="nt">pool_connections</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100</span><span class="w"> </span><span class="c1"># Maximum number of allowable connections, or null</span>
+<span class="w"> </span><span class="c1"># for no limits. The default is 100.</span>
+<span class="w"> </span><span class="nt">pool_maxsize</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10</span><span class="w"> </span><span class="c1"># Number of allowable keep-alive connections, or null</span>
+<span class="w"> </span><span class="c1"># to always allow. The default is 10.</span>
+<span class="w"> </span><span class="nt">enable_http2</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span><span class="w"> </span><span class="c1"># See https://www.python-httpx.org/http2/</span>
+<span class="w"> </span><span class="c1"># uncomment below section if you want to use a custom server certificate</span>
+<span class="w"> </span><span class="c1"># see https://www.python-httpx.org/advanced/#changing-the-verification-defaults</span>
+<span class="w"> </span><span class="c1"># and https://www.python-httpx.org/compatibility/#ssl-configuration</span>
+<span class="w"> </span><span class="c1"># verify: ~/.mitmproxy/mitmproxy-ca-cert.cer</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># uncomment below section if you want to use a proxyq see: SOCKS proxies</span>
+<span class="w"> </span><span class="c1"># https://2.python-requests.org/en/latest/user/advanced/#proxies</span>
+<span class="w"> </span><span class="c1"># are also supported: see</span>
+<span class="w"> </span><span class="c1"># https://2.python-requests.org/en/latest/user/advanced/#socks</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># proxies:</span>
+<span class="w"> </span><span class="c1"># all://:</span>
+<span class="w"> </span><span class="c1"># - http://proxy1:8080</span>
+<span class="w"> </span><span class="c1"># - http://proxy2:8080</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># using_tor_proxy: true</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># Extra seconds to add in order to account for the time taken by the proxy</span>
+<span class="w"> </span><span class="c1">#</span>
+<span class="w"> </span><span class="c1"># extra_proxy_timeout: 10.0</span>
+<span class="w"> </span><span class="c1">#</span>
+</pre></div>
+</div>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">request_timeout</span></code> :</dt><dd><p>Global timeout of the requests made to others engines in seconds. A bigger
+timeout will allow to wait for answers from slow engines, but in consequence
+will slow SearXNG reactivity (the result page may take the time specified in the
+timeout to load). Can be override by <code class="docutils literal notranslate"><span class="pre">timeout</span></code> in the <a class="reference internal" href="settings_engine.html#settings-engine"><span class="std std-ref">engine:</span></a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">useragent_suffix</span></code> :</dt><dd><p>Suffix to the user-agent SearXNG uses to send requests to others engines. If an
+engine wish to block you, a contact info here may be useful to avoid that.</p>
+</dd>
+</dl>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">pool_maxsize</span></code>:</dt><dd><p>Number of allowable keep-alive connections, or <code class="docutils literal notranslate"><span class="pre">null</span></code> to always allow. The
+default is 10. See <code class="docutils literal notranslate"><span class="pre">max_keepalive_connections</span></code> <a class="reference external" href="https://www.python-httpx.org/advanced/#pool-limit-configuration">Pool limit configuration</a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">pool_connections</span></code> :</dt><dd><p>Maximum number of allowable connections, or <code class="docutils literal notranslate"><span class="pre">null</span></code> # for no limits. The
+default is 100. See <code class="docutils literal notranslate"><span class="pre">max_connections</span></code> <a class="reference external" href="https://www.python-httpx.org/advanced/#pool-limit-configuration">Pool limit configuration</a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">keepalive_expiry</span></code> :</dt><dd><p>Number of seconds to keep a connection in the pool. By default 5.0 seconds.
+See <code class="docutils literal notranslate"><span class="pre">keepalive_expiry</span></code> <a class="reference external" href="https://www.python-httpx.org/advanced/#pool-limit-configuration">Pool limit configuration</a>.</p>
+</dd>
+</dl>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">proxies</span></code> :</dt><dd><p>Define one or more proxies you wish to use, see <a class="reference external" href="https://www.python-httpx.org/advanced/#http-proxying">httpx proxies</a>.
+If there are more than one proxy for one protocol (http, https),
+requests to the engines are distributed in a round-robin fashion.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">source_ips</span></code> :</dt><dd><p>If you use multiple network interfaces, define from which IP the requests must
+be made. Example:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">0.0.0.0</span></code> any local IPv4 address.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">::</span></code> any local IPv6 address.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">192.168.0.1</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">[</span> <span class="pre">192.168.0.1,</span> <span class="pre">192.168.0.2</span> <span class="pre">]</span></code> these two specific IP addresses</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">fe80::60a2:1691:e5a2:ee1f</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">fe80::60a2:1691:e5a2:ee1f/126</span></code> all IP addresses in this network.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">[</span> <span class="pre">192.168.0.1,</span> <span class="pre">fe80::/126</span> <span class="pre">]</span></code></p></li>
+</ul>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">retries</span></code> :</dt><dd><p>Number of retry in case of an HTTP error. On each retry, SearXNG uses an
+different proxy and source ip.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">enable_http2</span></code> :</dt><dd><p>Enable by default. Set to <code class="docutils literal notranslate"><span class="pre">false</span></code> to disable HTTP/2.</p>
+</dd>
+</dl>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">verify</span></code>:<span class="classifier"><code class="docutils literal notranslate"><span class="pre">$SSL_CERT_FILE</span></code>, <code class="docutils literal notranslate"><span class="pre">$SSL_CERT_DIR</span></code></span></dt><dd><p>Allow to specify a path to certificate.
+see <a class="reference external" href="https://www.python-httpx.org/advanced/#changing-the-verification-defaults">httpx verification defaults</a>.</p>
+<p>In addition to <code class="docutils literal notranslate"><span class="pre">verify</span></code>, SearXNG supports the <code class="docutils literal notranslate"><span class="pre">$SSL_CERT_FILE</span></code> (for a file) and
+<code class="docutils literal notranslate"><span class="pre">$SSL_CERT_DIR</span></code> (for a directory) OpenSSL variables.
+see <a class="reference external" href="https://www.python-httpx.org/compatibility/#ssl-configuration">httpx ssl configuration</a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">max_redirects</span></code> :</dt><dd><p>30 by default. Maximum redirect before it is an error.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">using_tor_proxy</span></code> :</dt><dd><p>Using tor proxy (<code class="docutils literal notranslate"><span class="pre">true</span></code>) or not (<code class="docutils literal notranslate"><span class="pre">false</span></code>) for all engines. The default is
+<code class="docutils literal notranslate"><span class="pre">false</span></code> and can be overwritten in the <a class="reference internal" href="settings_engine.html#settings-engine"><span class="std std-ref">engine:</span></a></p>
+</dd>
+</dl>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="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="settings_redis.html"><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_redis.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a>
+ <li>Next: <a href="settings_categories_as_tabs.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_outgoing.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_redis.html b/admin/settings/settings_redis.html
new file mode 100644
index 000000000..285ae3847
--- /dev/null
+++ b/admin/settings/settings_redis.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>redis: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="outgoing:" href="settings_outgoing.html" />
+ <link rel="prev" title="ui:" href="settings_ui.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_outgoing.html" title="outgoing:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_ui.html" title="ui:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="redis">
+<span id="settings-redis"></span><h1><code class="docutils literal notranslate"><span class="pre">redis:</span></code><a class="headerlink" href="#redis" title="Link to this heading">¶</a></h1>
+<p>A redis DB can be connected by an URL, in <a class="reference internal" href="../../src/searx.redisdb.html#module-searx.redisdb" title="searx.redisdb"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.redisdb</span></code></a> you
+will find a description to test your redis connection in SearXNG. When using
+sockets, don’t forget to check the access rights on the socket:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ls</span> <span class="o">-</span><span class="n">la</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">searxng</span><span class="o">-</span><span class="n">redis</span><span class="o">/</span><span class="n">run</span><span class="o">/</span><span class="n">redis</span><span class="o">.</span><span class="n">sock</span>
+<span class="n">srwxrwx</span><span class="o">---</span> <span class="mi">1</span> <span class="n">searxng</span><span class="o">-</span><span class="n">redis</span> <span class="n">searxng</span><span class="o">-</span><span class="n">redis</span> <span class="o">...</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">searxng</span><span class="o">-</span><span class="n">redis</span><span class="o">/</span><span class="n">run</span><span class="o">/</span><span class="n">redis</span><span class="o">.</span><span class="n">sock</span>
+</pre></div>
+</div>
+<p>In this example read/write access is given to the <em>searxng-redis</em> group. To get
+access rights to redis instance (the socket), your SearXNG (or even your
+developer) account needs to be added to the <em>searxng-redis</em> group.</p>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">url</span></code><span class="classifier"><code class="docutils literal notranslate"><span class="pre">$SEARXNG_REDIS_URL</span></code></span></dt><dd><p>URL to connect redis database, see <a class="reference external" href="https://redis-py.readthedocs.io/en/stable/connections.html#redis.client.Redis.from_url">Redis.from_url(url)</a> &amp; <a class="reference internal" href="../../src/searx.redisdb.html#redis-db"><span class="std std-ref">Redis DB</span></a>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>redis://[[username]:[password]]@localhost:6379/0
+rediss://[[username]:[password]]@localhost:6379/0
+unix://[[username]:[password]]@/path/to/socket.sock?db=0
+</pre></div>
+</div>
+</dd>
+</dl>
+<section id="redis-developer-notes">
+<span id="id1"></span><h2>Redis Developer Notes<a class="headerlink" href="#redis-developer-notes" title="Link to this heading">¶</a></h2>
+<p>To set up a local redis instance, first set the socket path of the Redis DB
+in your YAML setting:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">redis</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">unix:///usr/local/searxng-redis/run/redis.sock?db=0</span>
+</pre></div>
+</div>
+<p>Then use the following commands to install the redis instance (<a class="reference internal" href="../../dev/makefile.html#manage-redis-help"><span class="std std-ref">./manage redis.help</span></a>):</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>./manage<span class="w"> </span>redis.build
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./manage<span class="w"> </span>redis.install
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./manage<span class="w"> </span>redis.addgrp<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">USER</span><span class="si">}</span><span class="s2">&quot;</span>
+<span class="c1"># don&#39;t forget to logout &amp; login to get member of group</span>
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="settings_ui.html"><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#redis-developer-notes">Redis Developer Notes</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_ui.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a>
+ <li>Next: <a href="settings_outgoing.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_redis.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_search.html b/admin/settings/settings_search.html
new file mode 100644
index 000000000..68cf23bca
--- /dev/null
+++ b/admin/settings/settings_search.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>search: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="server:" href="settings_server.html" />
+ <link rel="prev" title="general:" href="settings_general.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_server.html" title="server:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_general.html" title="general:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">search:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="search">
+<span id="settings-search"></span><h1><code class="docutils literal notranslate"><span class="pre">search:</span></code><a class="headerlink" href="#search" title="Link to this heading">¶</a></h1>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">search</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">safe_search</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
+<span class="w"> </span><span class="nt">autocomplete</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="nt">default_lang</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="nt">ban_time_on_fail</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5</span>
+<span class="w"> </span><span class="nt">max_ban_time_on_fail</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">120</span>
+<span class="w"> </span><span class="nt">suspended_times</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">SearxEngineAccessDenied</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">86400</span>
+<span class="w"> </span><span class="nt">SearxEngineCaptcha</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">86400</span>
+<span class="w"> </span><span class="nt">SearxEngineTooManyRequests</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3600</span>
+<span class="w"> </span><span class="nt">cf_SearxEngineCaptcha</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1296000</span>
+<span class="w"> </span><span class="nt">cf_SearxEngineAccessDenied</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">86400</span>
+<span class="w"> </span><span class="nt">recaptcha_SearxEngineCaptcha</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">604800</span>
+<span class="w"> </span><span class="nt">formats</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">html</span>
+</pre></div>
+</div>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">safe_search</span></code>:</dt><dd><p>Filter results.</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">0</span></code>: None</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">1</span></code>: Moderate</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">2</span></code>: Strict</p></li>
+</ul>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">autocomplete</span></code>:</dt><dd><p>Existing autocomplete backends, leave blank to turn it off.</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">dbpedia</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">duckduckgo</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">google</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">mwmbl</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">startpage</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">swisscows</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">qwant</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">wikipedia</span></code></p></li>
+</ul>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">default_lang</span></code>:</dt><dd><p>Default search language - leave blank to detect from browser information or
+use codes from <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/languages.py">git://searx/languages.py</a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">languages</span></code>:</dt><dd><p>List of available languages - leave unset to use all codes from
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/languages.py">git://searx/languages.py</a>. Otherwise list codes of available languages.
+The <code class="docutils literal notranslate"><span class="pre">all</span></code> value is shown as the <code class="docutils literal notranslate"><span class="pre">Default</span> <span class="pre">language</span></code> in the user interface
+(in most cases, it is meant to send the query without a language parameter ;
+in some cases, it means the English language) Example:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">languages</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">all</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">en</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">en-US</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">de</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">it-IT</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">fr</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">fr-BE</span>
+</pre></div>
+</div>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">ban_time_on_fail</span></code>:</dt><dd><p>Ban time in seconds after engine errors.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">max_ban_time_on_fail</span></code>:</dt><dd><p>Max ban time in seconds after engine errors.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">suspended_times</span></code>:</dt><dd><p>Engine suspension time after error (in seconds; set to 0 to disable)</p>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">SearxEngineAccessDenied</span></code>: 86400</dt><dd><p>For error “Access denied” and “HTTP error [402, 403]”</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">SearxEngineCaptcha</span></code>: 86400</dt><dd><p>For error “CAPTCHA”</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">SearxEngineTooManyRequests</span></code>: 3600</dt><dd><p>For error “Too many request” and “HTTP error 429”</p>
+</dd>
+<dt>Cloudflare CAPTCHA:</dt><dd><ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">cf_SearxEngineCaptcha</span></code>: 1296000</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">cf_SearxEngineAccessDenied</span></code>: 86400</p></li>
+</ul>
+</dd>
+<dt>Google CAPTCHA:</dt><dd><ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">recaptcha_SearxEngineCaptcha</span></code>: 604800</p></li>
+</ul>
+</dd>
+</dl>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">formats</span></code>:</dt><dd><p>Result formats available from web, remove format to deny access (use lower
+case).</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">html</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">csv</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">json</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">rss</span></code></p></li>
+</ul>
+</dd>
+</dl>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="settings_general.html"><code class="docutils literal notranslate"><span class="pre">general:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">search:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_general.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">general:</span></code></a>
+ <li>Next: <a href="settings_server.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">server:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_search.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_server.html b/admin/settings/settings_server.html
new file mode 100644
index 000000000..51c31a0f4
--- /dev/null
+++ b/admin/settings/settings_server.html
@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>server: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="ui:" href="settings_ui.html" />
+ <link rel="prev" title="search:" href="settings_search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_ui.html" title="ui:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_search.html" title="search:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">server:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="server">
+<span id="settings-server"></span><h1><code class="docutils literal notranslate"><span class="pre">server:</span></code><a class="headerlink" href="#server" title="Link to this heading">¶</a></h1>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">server</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://example.org/location</span><span class="w"> </span><span class="c1"># change this!</span>
+<span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8888</span>
+<span class="w"> </span><span class="nt">bind_address</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;127.0.0.1&quot;</span>
+<span class="w"> </span><span class="nt">secret_key</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;ultrasecretkey&quot;</span><span class="w"> </span><span class="c1"># change this!</span>
+<span class="w"> </span><span class="nt">limiter</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">public_instance</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">image_proxy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">default_http_headers</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">X-Content-Type-Options </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">nosniff</span>
+<span class="w"> </span><span class="nt">X-Download-Options </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">noopen</span>
+<span class="w"> </span><span class="nt">X-Robots-Tag </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">noindex, nofollow</span>
+<span class="w"> </span><span class="nt">Referrer-Policy </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">no-referrer</span>
+</pre></div>
+</div>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">base_url</span></code><span class="classifier"><code class="docutils literal notranslate"><span class="pre">$SEARXNG_URL</span></code></span></dt><dd><p>The base URL where SearXNG is deployed. Used to create correct inbound links.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">port</span></code> &amp; <code class="docutils literal notranslate"><span class="pre">bind_address</span></code>: <code class="docutils literal notranslate"><span class="pre">$SEARXNG_PORT</span></code> &amp; <code class="docutils literal notranslate"><span class="pre">$SEARXNG_BIND_ADDRESS</span></code></dt><dd><p>Port number and <em>bind address</em> of the SearXNG web application if you run it
+directly using <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">searx/webapp.py</span></code>. Doesn’t apply to a SearXNG
+services running behind a proxy and using socket communications.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">secret_key</span></code><span class="classifier"><code class="docutils literal notranslate"><span class="pre">$SEARXNG_SECRET</span></code></span></dt><dd><p>Used for cryptography purpose.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">limiter</span></code> :</dt><dd><p>Rate limit the number of request on the instance, block some bots. The
+<a class="reference internal" href="../searx.limiter.html#limiter"><span class="std std-ref">Limiter</span></a> requires a <a class="reference internal" href="settings_redis.html#settings-redis"><span class="std std-ref">redis:</span></a> database.</p>
+</dd>
+</dl>
+<p id="public-instance"><code class="docutils literal notranslate"><span class="pre">public_instance</span></code> :</p>
+<blockquote>
+<div><p>Setting that allows to enable features specifically for public instances (not
+needed for local usage). By set to <code class="docutils literal notranslate"><span class="pre">true</span></code> the following features are
+activated:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../src/searx.botdetection.html#module-searx.botdetection.link_token" title="searx.botdetection.link_token"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.botdetection.link_token</span></code></a> in the <a class="reference internal" href="../searx.limiter.html#limiter"><span class="std std-ref">Limiter</span></a></p></li>
+</ul>
+</div></blockquote>
+<dl class="simple" id="image-proxy">
+<dt><code class="docutils literal notranslate"><span class="pre">image_proxy</span></code> :</dt><dd><p>Allow your instance of SearXNG of being able to proxy images. Uses memory space.</p>
+</dd>
+</dl>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">default_http_headers</span></code> :</dt><dd><p>Set additional HTTP headers, see <a class="reference external" href="https://github.com/searx/searx/issues/715">#755</a></p>
+</dd>
+</dl>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="settings_search.html"><code class="docutils literal notranslate"><span class="pre">search:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">server:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_search.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">search:</span></code></a>
+ <li>Next: <a href="settings_ui.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_server.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/settings/settings_ui.html b/admin/settings/settings_ui.html
new file mode 100644
index 000000000..7f683dbf2
--- /dev/null
+++ b/admin/settings/settings_ui.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>ui: &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="redis:" href="settings_redis.html" />
+ <link rel="prev" title="server:" href="settings_server.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="settings_redis.html" title="redis:"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="settings_server.html" title="server:"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Settings</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="ui">
+<span id="settings-ui"></span><h1><code class="docutils literal notranslate"><span class="pre">ui:</span></code><a class="headerlink" href="#ui" title="Link to this heading">¶</a></h1>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">ui</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">static_use_hash</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">default_locale</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span>
+<span class="w"> </span><span class="nt">query_in_title</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">infinite_scroll</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">center_alignment</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">cache_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://web.archive.org/web/</span>
+<span class="w"> </span><span class="nt">default_theme</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">simple</span>
+<span class="w"> </span><span class="nt">theme_args</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">simple_style</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">auto</span>
+<span class="w"> </span><span class="nt">search_on_category_select</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">hotkeys</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">default</span>
+</pre></div>
+</div>
+<dl id="static-use-hash">
+<dt><code class="docutils literal notranslate"><span class="pre">static_use_hash</span></code> :</dt><dd><p>Enables <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#caching_static_assets_with_cache_busting">cache busting</a> of static files.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">default_locale</span></code> :</dt><dd><p>SearXNG interface language. If blank, the locale is detected by using the
+browser language. If it doesn’t work, or you are deploying a language
+specific instance of searx, a locale can be defined using an ISO language
+code, like <code class="docutils literal notranslate"><span class="pre">fr</span></code>, <code class="docutils literal notranslate"><span class="pre">en</span></code>, <code class="docutils literal notranslate"><span class="pre">de</span></code>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">query_in_title</span></code> :</dt><dd><p>When true, the result page’s titles contains the query it decreases the
+privacy, since the browser can records the page titles.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">infinite_scroll</span></code>:</dt><dd><p>When true, automatically loads the next page when scrolling to bottom of the current page.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">center_alignment</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">false</span></code></span></dt><dd><p>When enabled, the results are centered instead of being in the left (or RTL)
+side of the screen. This setting only affects the <em>desktop layout</em>
+(<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/static/themes/simple/src/less/definitions.less">min-width: &#64;tablet</a>)</p>
+</dd>
+</dl>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">cache_url</span></code><span class="classifier"><code class="docutils literal notranslate"><span class="pre">https://web.archive.org/web/</span></code></span></dt><dd><p>URL prefix of the internet archive or cache, don’t forget trailing slash (if
+needed). The default is <a class="reference external" href="https://web.archive.org/web/">https://web.archive.org/web/</a> alternatives are:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://webcache.googleusercontent.com/search?q=cache">https://webcache.googleusercontent.com/search?q=cache</a>:</p></li>
+<li><p><a class="reference external" href="https://archive.today/">https://archive.today/</a></p></li>
+</ul>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">default_theme</span></code> :</dt><dd><p>Name of the theme you want to use by default on your SearXNG instance.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">theme_args.simple_style</span></code>:</dt><dd><p>Style of simple theme: <code class="docutils literal notranslate"><span class="pre">auto</span></code>, <code class="docutils literal notranslate"><span class="pre">light</span></code>, <code class="docutils literal notranslate"><span class="pre">dark</span></code></p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">results_on_new_tab</span></code>:</dt><dd><p>Open result links in a new tab by default.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">search_on_category_select</span></code>:</dt><dd><p>Perform search immediately if a category selected. Disable to select multiple categories.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">hotkeys</span></code>:</dt><dd><p>Hotkeys to use in the search interface: <code class="docutils literal notranslate"><span class="pre">default</span></code>, <code class="docutils literal notranslate"><span class="pre">vim</span></code> (Vim-like).</p>
+</dd>
+</dl>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Settings</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="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="settings_engine.html"><code class="docutils literal notranslate"><span class="pre">engine:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="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="settings_server.html"><code class="docutils literal notranslate"><span class="pre">server:</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="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="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="settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../installation-apache.html">Apache</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../update-searxng.html">SearXNG maintenance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Administrator documentation</a>
+ <ul>
+ <li><a href="index.html">Settings</a>
+ <ul>
+ <li>Previous: <a href="settings_server.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">server:</span></code></a>
+ <li>Next: <a href="settings_redis.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/admin/settings/settings_ui.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/update-searxng.html b/admin/update-searxng.html
new file mode 100644
index 000000000..df558091c
--- /dev/null
+++ b/admin/update-searxng.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>SearXNG maintenance &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Answer CAPTCHA from server’s IP" href="answer-captcha.html" />
+ <link rel="prev" title="Apache" href="installation-apache.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="answer-captcha.html" title="Answer CAPTCHA from server’s IP"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="installation-apache.html" title="Apache"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">SearXNG maintenance</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="searxng-maintenance">
+<span id="id1"></span><h1>SearXNG maintenance<a class="headerlink" href="#searxng-maintenance" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../utils/index.html#toolboxing"><span class="std std-ref">DevOps tooling box</span></a></p></li>
+<li><p><a class="reference internal" href="installation-uwsgi.html#uwsgi-maintenance"><span class="std std-ref">uWSGI maintenance</span></a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#how-to-update" id="id3">How to update</a></p></li>
+<li><p><a class="reference internal" href="#how-to-inspect-debug" id="id4">How to inspect &amp; debug</a></p></li>
+<li><p><a class="reference internal" href="#migrate-and-stay-tuned" id="id5">Migrate and stay tuned!</a></p>
+<ul>
+<li><p><a class="reference internal" href="#remove-obsolete-services" id="id6">remove obsolete services</a></p></li>
+<li><p><a class="reference internal" href="#check-after-installation" id="id7">Check after Installation</a></p></li>
+</ul>
+</li>
+</ul>
+</nav>
+<section id="how-to-update">
+<span id="update-searxng"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">How to update</a><a class="headerlink" href="#how-to-update" title="Link to this heading">¶</a></h2>
+<p>How to update depends on the <a class="reference internal" href="installation.html#installation"><span class="std std-ref">Installation</span></a> method. If you have used the
+<a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a>, use the <code class="docutils literal notranslate"><span class="pre">update</span></code> command from the <a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>
+script.</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>update
+</pre></div>
+</div>
+</section>
+<section id="how-to-inspect-debug">
+<span id="inspect-searxng"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">How to inspect &amp; debug</a><a class="headerlink" href="#how-to-inspect-debug" title="Link to this heading">¶</a></h2>
+<p>How to debug depends on the <a class="reference internal" href="installation.html#installation"><span class="std std-ref">Installation</span></a> method. If you have used the
+<a class="reference internal" href="installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a>, use the <code class="docutils literal notranslate"><span class="pre">inspect</span></code> command from the <a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>
+script.</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>inspect
+</pre></div>
+</div>
+</section>
+<section id="migrate-and-stay-tuned">
+<span id="id2"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Migrate and stay tuned!</a><a class="headerlink" href="#migrate-and-stay-tuned" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/pull/1332">PR 1332</a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/pull/456">PR 456</a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/pull/446#issuecomment-954730358">A comment about rolling release</a></p></li>
+</ul>
+</aside>
+<p>SearXNG is a <em>rolling release</em>; each commit to the master branch is a release.
+SearXNG is growing rapidly, the services and opportunities are change every now
+and then, to name just a few:</p>
+<ul class="simple">
+<li><p>Bot protection has been switched from filtron to SearXNG’s <a class="reference internal" href="searx.limiter.html#limiter"><span class="std std-ref">limiter</span></a>, this requires a <a class="reference internal" href="settings/settings_redis.html#settings-redis"><span class="std std-ref">Redis</span></a> database.</p></li>
+<li><p>The image proxy morty is no longer needed, it has been replaced by the
+<a class="reference internal" href="settings/settings_server.html#image-proxy"><span class="std std-ref">image proxy</span></a> from SearXNG.</p></li>
+<li><p>To save bandwidth <a class="reference internal" href="settings/settings_ui.html#static-use-hash"><span class="std std-ref">cache busting</span></a> has been implemented.
+To get in use, the <code class="docutils literal notranslate"><span class="pre">static-expires</span></code> needs to be set in the <a class="reference internal" href="installation-uwsgi.html#uwsgi-setup"><span class="std std-ref">uWSGI setup</span></a>.</p></li>
+</ul>
+<p>To stay tuned and get in use of the new features, instance maintainers have to
+update the SearXNG code regularly (see <a class="reference internal" href="#update-searxng"><span class="std std-ref">How to update</span></a>). As the above
+examples show, this is not always enough, sometimes services have to be set up
+or reconfigured and sometimes services that are no longer needed should be
+uninstalled.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>First of all: SearXNG is installed by the script <a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>. If you
+have old filtron, morty or searx setup you should consider complete
+uninstall/reinstall.</p>
+</div>
+<p>Here you will find a list of changes that affect the infrastructure. Please
+check to what extent it is necessary to update your installations:</p>
+<dl class="simple">
+<dt><a class="reference external" href="https://github.com/searxng/searxng/pull/1595">PR 1595</a>: <code class="docutils literal notranslate"><span class="pre">[fix]</span> <span class="pre">uWSGI:</span> <span class="pre">increase</span> <span class="pre">buffer-size</span></code></dt><dd><p>Re-install uWSGI (<a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>) or fix your uWSGI <code class="docutils literal notranslate"><span class="pre">searxng.ini</span></code>
+file manually.</p>
+</dd>
+</dl>
+<section id="remove-obsolete-services">
+<h3><a class="toc-backref" href="#id6" role="doc-backlink">remove obsolete services</a><a class="headerlink" href="#remove-obsolete-services" title="Link to this heading">¶</a></h3>
+<p>If your searx instance was installed <em>“Step by step”</em> or by the <em>“Installation
+scripts”</em>, you need to undo the installation procedure completely. If you have
+morty &amp; filtron installed, it is recommended to uninstall these services also.
+In case of scripts, to uninstall use the scripts from the origin you installed
+searx from or try:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/filtron.sh remove all
+$ sudo -H ./utils/morty.sh remove all
+$ sudo -H ./utils/searx.sh remove all
+</pre></div>
+</div>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>If you are migrate from searx take into account that the <code class="docutils literal notranslate"><span class="pre">.config.sh</span></code> is no
+longer used.</p>
+</div>
+<p>If you upgrade from searx or from before <a class="reference external" href="https://github.com/searxng/searxng/pull/1332">PR 1332</a> has been merged and you
+have filtron and/or morty installed, don’t forget to remove HTTP sites.</p>
+<p>Apache:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/filtron.sh apache remove
+$ sudo -H ./utils/morty.sh apache remove
+</pre></div>
+</div>
+<p>nginx:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/filtron.sh nginx remove
+$ sudo -H ./utils/morty.sh nginx remove
+</pre></div>
+</div>
+</section>
+<section id="check-after-installation">
+<h3><a class="toc-backref" href="#id7" role="doc-backlink">Check after Installation</a><a class="headerlink" href="#check-after-installation" title="Link to this heading">¶</a></h3>
+<p>Once you have done your installation, you can run a SearXNG <em>check</em> procedure,
+to see if there are some left overs. In this example there exists a <em>old</em>
+<code class="docutils literal notranslate"><span class="pre">/etc/searx/settings.yml</span></code>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/searxng.sh instance check
+
+SearXNG checks
+--------------
+ERROR: settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/
+INFO: [OK] (old) account &#39;searx&#39; does not exists
+INFO: [OK] (old) account &#39;filtron&#39; does not exists
+INFO: [OK] (old) account &#39;morty&#39; does not exists
+...
+INFO searx.redisdb : connecting to Redis db=0 path=&#39;/usr/local/searxng-redis/run/redis.sock&#39;
+INFO searx.redisdb : connected to Redis
+</pre></div>
+</div>
+</section>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Administrator documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="settings/index.html">Settings</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-docker.html">Docker Container</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-scripts.html">Installation Script</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-searxng.html">Step by step installation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-uwsgi.html">uWSGI</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-nginx.html">NGINX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation-apache.html">Apache</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">SearXNG maintenance</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#how-to-update">How to update</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#how-to-inspect-debug">How to inspect &amp; debug</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#migrate-and-stay-tuned">Migrate and stay tuned!</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#remove-obsolete-services">remove obsolete services</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#check-after-installation">Check after Installation</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="answer-captcha.html">Answer CAPTCHA from server’s IP</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.limiter.html">Limiter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="api.html">Administration API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Administrator documentation</a>
+ <ul>
+ <li>Previous: <a href="installation-apache.html" title="previous chapter">Apache</a>
+ <li>Next: <a href="answer-captcha.html" title="next chapter">Answer CAPTCHA from server’s IP</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/admin/update-searxng.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/contribution_guide.html b/dev/contribution_guide.html
new file mode 100644
index 000000000..b62db9809
--- /dev/null
+++ b/dev/contribution_guide.html
@@ -0,0 +1,305 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>How to contribute &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Engine Implementations" href="engines/index.html" />
+ <link rel="prev" title="Runtime Management" href="rtm_asdf.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="engines/index.html" title="Engine Implementations"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="rtm_asdf.html" title="Runtime Management"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">How to contribute</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="how-to-contribute">
+<span id="id1"></span><h1>How to contribute<a class="headerlink" href="#how-to-contribute" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#prime-directives-privacy-hackability" id="id3">Prime directives: Privacy, Hackability</a></p>
+<ul>
+<li><p><a class="reference internal" href="#privacy-by-design" id="id4">Privacy-by-design</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#code" id="id5">Code</a></p></li>
+<li><p><a class="reference internal" href="#translation" id="id6">Translation</a></p></li>
+<li><p><a class="reference internal" href="#documentation" id="id7">Documentation</a></p>
+<ul>
+<li><p><a class="reference internal" href="#live-build" id="id8">live build</a></p></li>
+<li><p><a class="reference internal" href="#deploy-on-github-io" id="id9">deploy on github.io</a></p></li>
+</ul>
+</li>
+</ul>
+</nav>
+<section id="prime-directives-privacy-hackability">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Prime directives: Privacy, Hackability</a><a class="headerlink" href="#prime-directives-privacy-hackability" title="Link to this heading">¶</a></h2>
+<p>SearXNG has two prime directives, <strong>privacy-by-design and hackability</strong> . The
+hackability comes in three levels:</p>
+<ul class="simple">
+<li><p>support of search engines</p></li>
+<li><p>plugins to alter search behaviour</p></li>
+<li><p>hacking SearXNG itself</p></li>
+</ul>
+<p>Note the lack of “world domination” among the directives. SearXNG has no
+intention of wide mass-adoption, rounded corners, etc. The prime directive
+“privacy” deserves a separate chapter, as it’s quite uncommon unfortunately.</p>
+<section id="privacy-by-design">
+<h3><a class="toc-backref" href="#id4" role="doc-backlink">Privacy-by-design</a><a class="headerlink" href="#privacy-by-design" title="Link to this heading">¶</a></h3>
+<p>SearXNG was born out of the need for a <strong>privacy-respecting</strong> search tool which
+can be extended easily to maximize both, its search and its privacy protecting
+capabilities.</p>
+<p>A few widely used features work differently or turned off by default or not
+implemented at all <strong>as a consequence of privacy-by-design</strong>.</p>
+<p>If a feature reduces the privacy preserving aspects of searx, it should be
+switched off by default or should not implemented at all. There are plenty of
+search engines already providing such features. If a feature reduces the
+protection of searx, users must be informed about the effect of choosing to
+enable it. Features that protect privacy but differ from the expectations of
+the user should also be explained.</p>
+<p>Also, if you think that something works weird with searx, it’s might be because
+of the tool you use is designed in a way to interfere with the privacy respect.
+Submitting a bugreport to the vendor of the tool that misbehaves might be a good
+feedback to reconsider the disrespect to its customers (e.g. <code class="docutils literal notranslate"><span class="pre">GET</span></code> vs <code class="docutils literal notranslate"><span class="pre">POST</span></code>
+requests in various browsers).</p>
+<p>Remember the other prime directive of SearXNG is to be hackable, so if the above
+privacy concerns do not fancy you, simply fork it.</p>
+<blockquote>
+<div><p><em>Happy hacking.</em></p>
+</div></blockquote>
+</section>
+</section>
+<section id="code">
+<h2><a class="toc-backref" href="#id5" role="doc-backlink">Code</a><a class="headerlink" href="#code" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Create good commits!</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes">Structural split of changes</a></p></li>
+<li><p><a class="reference external" href="https://www.conventionalcommits.org/">Conventional Commits</a></p></li>
+<li><p><a class="reference external" href="https://wiki.openstack.org/wiki/GitCommitMessages">Git Commit Good Practice</a></p></li>
+<li><p>some like to use: <a class="reference external" href="https://gitmoji.carloscuesta.me/">gitmoji</a></p></li>
+<li><p>not yet active: <a class="reference external" href="https://github.com/zeke/semantic-pull-requests">Semantic PR</a></p></li>
+</ul>
+</aside>
+<p>In order to submit a patch, please follow the steps below:</p>
+<ul>
+<li><p>Follow coding conventions.</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.python.org/dev/peps/pep-0008/">PEP8</a> standards apply, except the convention of line length</p></li>
+<li><p>Maximum line length is 120 characters</p></li>
+</ul>
+</li>
+<li><p>The cardinal rule for creating good commits is to ensure there is only one
+<em>logical change</em> per commit / read <a class="reference external" href="https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes">Structural split of changes</a></p></li>
+<li><p>Check if your code breaks existing tests. If so, update the tests or fix your
+code.</p></li>
+<li><p>If your code can be unit-tested, add unit tests.</p></li>
+<li><p>Add yourself to the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/AUTHORS.rst">git://AUTHORS.rst</a> file.</p></li>
+<li><p>Choose meaningful commit messages, read <a class="reference external" href="https://www.conventionalcommits.org/">Conventional Commits</a></p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nb">type</span><span class="o">&gt;</span><span class="p">[</span><span class="n">optional</span> <span class="n">scope</span><span class="p">]:</span> <span class="o">&lt;</span><span class="n">description</span><span class="o">&gt;</span>
+
+<span class="p">[</span><span class="n">optional</span> <span class="n">body</span><span class="p">]</span>
+
+<span class="p">[</span><span class="n">optional</span> <span class="n">footer</span><span class="p">(</span><span class="n">s</span><span class="p">)]</span>
+</pre></div>
+</div>
+</li>
+<li><p>Create a pull request.</p></li>
+</ul>
+<p>For more help on getting started with SearXNG development, see <a class="reference internal" href="quickstart.html#devquickstart"><span class="std std-ref">Development Quickstart</span></a>.</p>
+</section>
+<section id="translation">
+<h2><a class="toc-backref" href="#id6" role="doc-backlink">Translation</a><a class="headerlink" href="#translation" title="Link to this heading">¶</a></h2>
+<p>Translation currently takes place on <a class="reference internal" href="translation.html#translation"><span class="std std-ref">weblate</span></a>.</p>
+</section>
+<section id="documentation">
+<span id="contrib-docs"></span><h2><a class="toc-backref" href="#id7" role="doc-backlink">Documentation</a><a class="headerlink" href="#documentation" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">The reST sources</p>
+<p>has been moved from <code class="docutils literal notranslate"><span class="pre">gh-branch</span></code> into <code class="docutils literal notranslate"><span class="pre">master</span></code> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs">git://docs</a>).</p>
+</aside>
+<p>The documentation is built using <a class="reference external" href="https://www.sphinx-doc.org">Sphinx</a>. So in order to be able to generate
+the required files, you have to install it on your system. Much easier, use
+our <a class="reference internal" href="makefile.html#makefile"><span class="std std-ref">Makefile &amp; ./manage</span></a>.</p>
+<p>Here is an example which makes a complete rebuild:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>make<span class="w"> </span>docs.clean<span class="w"> </span>docs.html
+...
+The<span class="w"> </span>HTML<span class="w"> </span>pages<span class="w"> </span>are<span class="w"> </span><span class="k">in</span><span class="w"> </span>dist/docs.
+</pre></div>
+</div>
+<section id="live-build">
+<span id="make-docs-live"></span><h3><a class="toc-backref" href="#id8" role="doc-backlink">live build</a><a class="headerlink" href="#live-build" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">docs.clean</p>
+<p>It is recommended to assert a complete rebuild before deploying (use
+<code class="docutils literal notranslate"><span class="pre">docs.clean</span></code>).</p>
+</aside>
+<p>Live build is like WYSIWYG. If you want to edit the documentation, its
+recommended to use. The Makefile target <code class="docutils literal notranslate"><span class="pre">docs.live</span></code> builds the docs, opens
+URL in your favorite browser and rebuilds every time a reST file has been
+changed (<a class="reference internal" href="makefile.html#make-docs-clean"><span class="std std-ref">make docs.clean docs.live</span></a>).</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>make<span class="w"> </span>docs.live
+...
+The<span class="w"> </span>HTML<span class="w"> </span>pages<span class="w"> </span>are<span class="w"> </span><span class="k">in</span><span class="w"> </span>dist/docs.
+...<span class="w"> </span>Serving<span class="w"> </span>on<span class="w"> </span>http://0.0.0.0:8000
+...<span class="w"> </span>Start<span class="w"> </span>watching<span class="w"> </span>changes
+</pre></div>
+</div>
+<p>Live builds are implemented by <a class="reference external" href="https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md">sphinx-autobuild</a>. Use environment
+<code class="docutils literal notranslate"><span class="pre">$(SPHINXOPTS)</span></code> to pass arguments to the <a class="reference external" href="https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md">sphinx-autobuild</a> command. Except
+option <code class="docutils literal notranslate"><span class="pre">--host</span></code> (which is always set to <code class="docutils literal notranslate"><span class="pre">0.0.0.0</span></code>) you can pass any
+argument. E.g to find and use a free port, use:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nv">SPHINXOPTS</span><span class="o">=</span><span class="s2">&quot;--port 0&quot;</span><span class="w"> </span>make<span class="w"> </span>docs.live
+...
+...<span class="w"> </span>Serving<span class="w"> </span>on<span class="w"> </span>http://0.0.0.0:50593
+...
+</pre></div>
+</div>
+</section>
+<section id="deploy-on-github-io">
+<span id="id2"></span><h3><a class="toc-backref" href="#id9" role="doc-backlink">deploy on github.io</a><a class="headerlink" href="#deploy-on-github-io" title="Link to this heading">¶</a></h3>
+<p>To deploy documentation at <a class="reference external" href="https://docs.searxng.org//.">github.io</a> use Makefile target <a class="reference internal" href="makefile.html#make-docs-gh-pages"><span class="std std-ref">make docs.gh-pages</span></a>, which builds the documentation and runs all the needed git add,
+commit and push:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>make<span class="w"> </span>docs.clean<span class="w"> </span>docs.gh-pages
+</pre></div>
+</div>
+<div class="admonition attention">
+<p class="admonition-title">Attention</p>
+<p>If you are working in your own brand, don’t forget to adjust your
+<a class="reference internal" href="../admin/settings/settings_brand.html#settings-brand"><span class="std std-ref">brand:</span></a>.</p>
+</div>
+</section>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">How to contribute</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#prime-directives-privacy-hackability">Prime directives: Privacy, Hackability</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#privacy-by-design">Privacy-by-design</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#code">Code</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#translation">Translation</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#documentation">Documentation</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#live-build">live build</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#deploy-on-github-io">deploy on github.io</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="rtm_asdf.html" title="previous chapter">Runtime Management</a>
+ <li>Next: <a href="engines/index.html" title="next chapter">Engine Implementations</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/contribution_guide.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/demo/demo_offline.html b/dev/engines/demo/demo_offline.html
new file mode 100644
index 000000000..949ba5431
--- /dev/null
+++ b/dev/engines/demo/demo_offline.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Demo Offline Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Command Line Engines" href="../offline/command-line-engines.html" />
+ <link rel="prev" title="Offline Concept" href="../offline_concept.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../offline/command-line-engines.html" title="Command Line Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../offline_concept.html" title="Offline Concept"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Demo Offline Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="demo-offline-engine">
+<span id="id1"></span><h1>Demo Offline Engine<a class="headerlink" href="#demo-offline-engine" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.demo_offline">Within this module we implement a <em>demo offline engine</em>. Do not look to
+close to the implementation, its just a simple example. To get in use of this
+<em>demo</em> engine add the following entry to your engines list in <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my offline engine</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">demo_offline</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">demo</span>
+<span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+</pre></div>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.demo_offline.init">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.demo_offline.</span></span><span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_settings</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/demo_offline.html#init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.demo_offline.init" title="Link to this definition">¶</a></dt>
+<dd><p>Initialization of the (offline) engine. The origin of this demo engine is a
+simple json string which is loaded in this example while the engine is
+initialized.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.demo_offline.search">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.demo_offline.</span></span><span class="sig-name descname"><span class="pre">search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">request_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/demo_offline.html#search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.demo_offline.search" title="Link to this definition">¶</a></dt>
+<dd><p>Query (offline) engine and return results. Assemble the list of results from
+your local engine. In this demo engine we ignore the ‘query’ term, usual
+you would pass the ‘query’ term to your local engine to filter out the
+results.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-engines">Online Engines</a></li>
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../offline_concept.html">Offline Concept</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Demo Offline Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../offline/command-line-engines.html">Command Line Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../offline/nosql-engines.html">NoSQL databases</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../offline/search-indexer-engines.html">Local Search APIs</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../offline/sql-engines.html">SQL Engines</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="../offline_concept.html" title="previous chapter">Offline Concept</a>
+ <li>Next: <a href="../offline/command-line-engines.html" title="next chapter">Command Line Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/demo/demo_offline.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/demo/demo_online.html b/dev/engines/demo/demo_online.html
new file mode 100644
index 000000000..cc4ad0fc0
--- /dev/null
+++ b/dev/engines/demo/demo_online.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Demo Online Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="XPath Engine" href="../xpath.html" />
+ <link rel="prev" title="Engine Overview" href="../engine_overview.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../xpath.html" title="XPath Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../engine_overview.html" title="Engine Overview"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Demo Online Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="demo-online-engine">
+<span id="id1"></span><h1>Demo Online Engine<a class="headerlink" href="#demo-online-engine" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.demo_online">Within this module we implement a <em>demo online engine</em>. Do not look to
+close to the implementation, its just a simple example which queries <a class="reference external" href="https://www.artic.edu">The Art
+Institute of Chicago</a></p>
+<p>To get in use of this <em>demo</em> engine add the following entry to your engines
+list in <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my online engine</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">demo_online</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">demo</span>
+<span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+</pre></div>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.demo_online.init">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.demo_online.</span></span><span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_settings</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/demo_online.html#init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.demo_online.init" title="Link to this definition">¶</a></dt>
+<dd><p>Initialization of the (online) engine. If no initialization is needed, drop
+this init function.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.demo_online.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.demo_online.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/demo_online.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.demo_online.request" title="Link to this definition">¶</a></dt>
+<dd><p>Build up the <code class="docutils literal notranslate"><span class="pre">params</span></code> for the online request. In this example we build a
+URL to fetch images from <a class="reference external" href="https://artic.edu">artic.edu</a></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.demo_online.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.demo_online.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/demo_online.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.demo_online.response" title="Link to this definition">¶</a></dt>
+<dd><p>Parse out the result items from the response. In this example we parse the
+response from <a class="reference external" href="https://artic.edu">api.artic.edu</a> and filter out all
+images.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../online/zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="../engine_overview.html" title="previous chapter">Engine Overview</a>
+ <li>Next: <a href="../xpath.html" title="next chapter">XPath Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/demo/demo_online.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/engine_overview.html b/dev/engines/engine_overview.html
new file mode 100644
index 000000000..00c8fc274
--- /dev/null
+++ b/dev/engines/engine_overview.html
@@ -0,0 +1,939 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Engine Overview &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="Demo Online Engine" href="demo/demo_online.html" />
+ <link rel="prev" title="SearXNG’s engines loader" href="engines.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="demo/demo_online.html" title="Demo Online Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="engines.html" title="SearXNG’s engines loader"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Engine Overview</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="engine-overview">
+<span id="engines-dev"></span><h1>Engine Overview<a class="headerlink" href="#engine-overview" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#general-engine-configuration" id="id17">General Engine Configuration</a></p>
+<ul>
+<li><p><a class="reference internal" href="#engine-file" id="id18">Engine File</a></p></li>
+<li><p><a class="reference internal" href="#engine-settings-yml" id="id19">Engine <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></p></li>
+<li><p><a class="reference internal" href="#overrides" id="id20">Overrides</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#making-a-request" id="id21">Making a Request</a></p>
+<ul>
+<li><p><a class="reference internal" href="#passed-arguments-request" id="id22">Passed Arguments (request)</a></p></li>
+<li><p><a class="reference internal" href="#specify-request" id="id23">Specify Request</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#result-types-template" id="id24">Result Types (<code class="docutils literal notranslate"><span class="pre">template</span></code>)</a></p>
+<ul>
+<li><p><a class="reference internal" href="#default" id="id25"><code class="docutils literal notranslate"><span class="pre">default</span></code></a></p></li>
+<li><p><a class="reference internal" href="#images" id="id26"><code class="docutils literal notranslate"><span class="pre">images</span></code></a></p></li>
+<li><p><a class="reference internal" href="#videos" id="id27"><code class="docutils literal notranslate"><span class="pre">videos</span></code></a></p></li>
+<li><p><a class="reference internal" href="#torrent" id="id28"><code class="docutils literal notranslate"><span class="pre">torrent</span></code></a></p></li>
+<li><p><a class="reference internal" href="#map" id="id29"><code class="docutils literal notranslate"><span class="pre">map</span></code></a></p></li>
+<li><p><a class="reference internal" href="#paper" id="id30"><code class="docutils literal notranslate"><span class="pre">paper</span></code></a></p></li>
+<li><p><a class="reference internal" href="#packages" id="id31"><code class="docutils literal notranslate"><span class="pre">packages</span></code></a></p></li>
+</ul>
+</li>
+</ul>
+</nav>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../user/configured_engines.html#configured-engines"><span class="std std-ref">Configured Engines</span></a></p></li>
+<li><p><a class="reference internal" href="../../admin/settings/settings_engine.html#settings-engine"><span class="std std-ref">engine:</span></a></p></li>
+</ul>
+</aside>
+<p>SearXNG is a <a class="reference external" href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch-engine</a>, so it uses different search engines to provide
+better results.</p>
+<p>Because there is no general search API which could be used for every search
+engine, an adapter has to be built between SearXNG and the external search
+engines. Adapters are stored under the folder <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines">git://searx/engines</a>.</p>
+<section id="general-engine-configuration">
+<span id="id1"></span><h2><a class="toc-backref" href="#id17" role="doc-backlink">General Engine Configuration</a><a class="headerlink" href="#general-engine-configuration" title="Link to this heading">¶</a></h2>
+<p>It is required to tell SearXNG the type of results the engine provides. The
+arguments can be set in the engine file or in the settings file (normally
+<code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>). The arguments in the settings file override the ones in the
+engine file.</p>
+<p>It does not matter if an option is stored in the engine file or in the settings.
+However, the standard way is the following:</p>
+<section id="engine-file">
+<span id="id2"></span><h3><a class="toc-backref" href="#id18" role="doc-backlink">Engine File</a><a class="headerlink" href="#engine-file" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id3" style="width: 100%">
+<caption><span class="caption-number">Table 2 </span><span class="caption-text">Common options in the engine module</span><a class="headerlink" href="#id3" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>categories</p></td>
+<td><p>list</p></td>
+<td><p>categories, in which the engine is working</p></td>
+</tr>
+<tr class="row-odd"><td><p>paging</p></td>
+<td><p>boolean</p></td>
+<td><p>support multiple pages</p></td>
+</tr>
+<tr class="row-even"><td><p>time_range_support</p></td>
+<td><p>boolean</p></td>
+<td><p>support search time range</p></td>
+</tr>
+<tr class="row-odd"><td><p>engine_type</p></td>
+<td><p>str</p></td>
+<td><ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">online</span></code> <a class="reference internal" href="index.html#online-engines"><span class="std std-ref">[ref]</span></a> by
+default, other possibles values are:</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">offline</span></code> <a class="reference internal" href="index.html#offline-engines"><span class="std std-ref">[ref]</span></a></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">online_dictionary</span></code> <a class="reference internal" href="index.html#online-dictionary"><span class="std std-ref">[ref]</span></a></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">online_currency</span></code> <a class="reference internal" href="index.html#online-currency"><span class="std std-ref">[ref]</span></a></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">online_url_search</span></code> <a class="reference internal" href="index.html#online-url-search"><span class="std std-ref">[ref]</span></a></p></li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="engine-settings-yml">
+<span id="engine-settings"></span><h3><a class="toc-backref" href="#id19" role="doc-backlink">Engine <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a><a class="headerlink" href="#engine-settings-yml" title="Link to this heading">¶</a></h3>
+<p>For a more detailed description, see <a class="reference internal" href="../../admin/settings/settings_engine.html#settings-engine"><span class="std std-ref">engine:</span></a> in the <a class="reference internal" href="../../admin/settings/settings.html#settings-yml"><span class="std std-ref">settings.yml</span></a>.</p>
+<table class="docutils align-default" id="id4" style="width: 100%">
+<caption><span class="caption-number">Table 3 </span><span class="caption-text">Common options in the engine setup (<code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>)</span><a class="headerlink" href="#id4" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>name</p></td>
+<td><p>string</p></td>
+<td><p>name of search-engine</p></td>
+</tr>
+<tr class="row-odd"><td><p>engine</p></td>
+<td><p>string</p></td>
+<td><p>name of searxng-engine (file name without <code class="docutils literal notranslate"><span class="pre">.py</span></code>)</p></td>
+</tr>
+<tr class="row-even"><td><p>enable_http</p></td>
+<td><p>bool</p></td>
+<td><p>enable HTTP (by default only HTTPS is enabled).</p></td>
+</tr>
+<tr class="row-odd"><td><p>shortcut</p></td>
+<td><p>string</p></td>
+<td><p>shortcut of search-engine</p></td>
+</tr>
+<tr class="row-even"><td><p>timeout</p></td>
+<td><p>string</p></td>
+<td><p>specific timeout for search-engine</p></td>
+</tr>
+<tr class="row-odd"><td><p>display_error_messages</p></td>
+<td><p>boolean</p></td>
+<td><p>display error messages on the web UI</p></td>
+</tr>
+<tr class="row-even"><td><p>proxies</p></td>
+<td><p>dict</p></td>
+<td><p>set proxies for a specific engine
+(e.g. <code class="docutils literal notranslate"><span class="pre">proxies</span> <span class="pre">:</span> <span class="pre">{http:</span> <span class="pre">socks5://proxy:port,</span>
+<span class="pre">https:</span> <span class="pre">socks5://proxy:port}</span></code>)</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="overrides">
+<span id="engine-overrides"></span><h3><a class="toc-backref" href="#id20" role="doc-backlink">Overrides</a><a class="headerlink" href="#overrides" title="Link to this heading">¶</a></h3>
+<p>A few of the options have default values in the namespace of the engine’s python
+module, but are often overwritten by the settings. If <code class="docutils literal notranslate"><span class="pre">None</span></code> is assigned to an
+option in the engine file, it has to be redefined in the settings, otherwise
+SearXNG will not start with that engine (global names with a leading underline can
+be <code class="docutils literal notranslate"><span class="pre">None</span></code>).</p>
+<p>Here is an very simple example of the global names in the namespace of engine’s
+module:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># engine dependent config</span>
+<span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;general&#39;</span><span class="p">]</span>
+<span class="n">paging</span> <span class="o">=</span> <span class="kc">True</span>
+<span class="n">_non_overwritten_global</span> <span class="o">=</span> <span class="s1">&#39;foo&#39;</span>
+</pre></div>
+</div>
+<table class="docutils align-default" id="id5" style="width: 100%">
+<caption><span class="caption-number">Table 4 </span><span class="caption-text">The naming of overrides is arbitrary / recommended overrides are:</span><a class="headerlink" href="#id5" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>base_url</p></td>
+<td><p>string</p></td>
+<td><p>base-url, can be overwritten to use same
+engine on other URL</p></td>
+</tr>
+<tr class="row-odd"><td><p>number_of_results</p></td>
+<td><p>int</p></td>
+<td><p>maximum number of results per request</p></td>
+</tr>
+<tr class="row-even"><td><p>language</p></td>
+<td><p>string</p></td>
+<td><p>ISO code of language and country like en_US</p></td>
+</tr>
+<tr class="row-odd"><td><p>api_key</p></td>
+<td><p>string</p></td>
+<td><p>api-key if required by engine</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="making-a-request">
+<span id="engine-request"></span><h2><a class="toc-backref" href="#id21" role="doc-backlink">Making a Request</a><a class="headerlink" href="#making-a-request" title="Link to this heading">¶</a></h2>
+<p>To perform a search an URL have to be specified. In addition to specifying an
+URL, arguments can be passed to the query.</p>
+<section id="passed-arguments-request">
+<span id="engine-request-arguments"></span><h3><a class="toc-backref" href="#id22" role="doc-backlink">Passed Arguments (request)</a><a class="headerlink" href="#passed-arguments-request" title="Link to this heading">¶</a></h3>
+<p>These arguments can be used to construct the search query. Furthermore,
+parameters with default value can be redefined for special purposes.</p>
+<span id="engine-request-online"></span><table class="docutils align-default" id="id6" style="width: 100%">
+<caption><span class="caption-number">Table 5 </span><span class="caption-text">If the <code class="docutils literal notranslate"><span class="pre">engine_type</span></code> is <a class="reference internal" href="../../src/searx.search.processors.html#searx.search.processors.online.OnlineProcessor.get_params" title="searx.search.processors.online.OnlineProcessor.get_params"><code class="xref py py-obj docutils literal notranslate"><span class="pre">online</span></code></a></span><a class="headerlink" href="#id6" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>default-value, information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>url</p></td>
+<td><p>str</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">''</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>method</p></td>
+<td><p>str</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">'GET'</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>headers</p></td>
+<td><p>set</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">{}</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>data</p></td>
+<td><p>set</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">{}</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>cookies</p></td>
+<td><p>set</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">{}</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>verify</p></td>
+<td><p>bool</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>headers.User-Agent</p></td>
+<td><p>str</p></td>
+<td><p>a random User-Agent</p></td>
+</tr>
+<tr class="row-odd"><td><p>category</p></td>
+<td><p>str</p></td>
+<td><p>current category, like <code class="docutils literal notranslate"><span class="pre">'general'</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>safesearch</p></td>
+<td><p>int</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code>, between <code class="docutils literal notranslate"><span class="pre">0</span></code> and <code class="docutils literal notranslate"><span class="pre">2</span></code> (normal, moderate, strict)</p></td>
+</tr>
+<tr class="row-odd"><td><p>time_range</p></td>
+<td><p>Optional[str]</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">None</span></code>, can be <code class="docutils literal notranslate"><span class="pre">day</span></code>, <code class="docutils literal notranslate"><span class="pre">week</span></code>, <code class="docutils literal notranslate"><span class="pre">month</span></code>, <code class="docutils literal notranslate"><span class="pre">year</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>pageno</p></td>
+<td><p>int</p></td>
+<td><p>current pagenumber</p></td>
+</tr>
+<tr class="row-odd"><td><p>searxng_locale</p></td>
+<td><p>str</p></td>
+<td><p>SearXNG’s locale selected by user. Specific language code like
+<code class="docutils literal notranslate"><span class="pre">'en'</span></code>, <code class="docutils literal notranslate"><span class="pre">'en-US'</span></code>, or <code class="docutils literal notranslate"><span class="pre">'all'</span></code> if unspecified.</p></td>
+</tr>
+</tbody>
+</table>
+<span id="engine-request-online-dictionary"></span><table class="docutils align-default" id="id7" style="width: 100%">
+<caption><span class="caption-number">Table 6 </span><span class="caption-text">If the <code class="docutils literal notranslate"><span class="pre">engine_type</span></code> is <a class="reference internal" href="../../src/searx.search.processors.html#searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params" title="searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params"><code class="xref py py-obj docutils literal notranslate"><span class="pre">online_dictionary</span></code></a>,
+ in addition to the <a class="reference internal" href="#engine-request-online"><span class="std std-ref">online</span></a> arguments:</span><a class="headerlink" href="#id7" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>default-value, information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>from_lang</p></td>
+<td><p>str</p></td>
+<td><p>specific language code like <code class="docutils literal notranslate"><span class="pre">'en_US'</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>to_lang</p></td>
+<td><p>str</p></td>
+<td><p>specific language code like <code class="docutils literal notranslate"><span class="pre">'en_US'</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>query</p></td>
+<td><p>str</p></td>
+<td><p>the text query without the languages</p></td>
+</tr>
+</tbody>
+</table>
+<span id="engine-request-online-currency"></span><table class="docutils align-default" id="id8" style="width: 100%">
+<caption><span class="caption-number">Table 7 </span><span class="caption-text">If the <code class="docutils literal notranslate"><span class="pre">engine_type</span></code> is <a class="reference internal" href="../../src/searx.search.processors.html#searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params" title="searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params"><code class="xref py py-obj docutils literal notranslate"><span class="pre">online_currency</span></code></a>,
+ in addition to the <a class="reference internal" href="#engine-request-online"><span class="std std-ref">online</span></a> arguments:</span><a class="headerlink" href="#id8" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>default-value, information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>amount</p></td>
+<td><p>float</p></td>
+<td><p>the amount to convert</p></td>
+</tr>
+<tr class="row-odd"><td><p>from</p></td>
+<td><p>str</p></td>
+<td><p>ISO 4217 code</p></td>
+</tr>
+<tr class="row-even"><td><p>to</p></td>
+<td><p>str</p></td>
+<td><p>ISO 4217 code</p></td>
+</tr>
+<tr class="row-odd"><td><p>from_name</p></td>
+<td><p>str</p></td>
+<td><p>currency name</p></td>
+</tr>
+<tr class="row-even"><td><p>to_name</p></td>
+<td><p>str</p></td>
+<td><p>currency name</p></td>
+</tr>
+</tbody>
+</table>
+<span id="engine-request-online-url-search"></span><table class="docutils align-default" id="id9" style="width: 100%">
+<caption><span class="caption-number">Table 8 </span><span class="caption-text">If the <code class="docutils literal notranslate"><span class="pre">engine_type</span></code> is <a class="reference internal" href="../../src/searx.search.processors.html#searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params" title="searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params"><code class="xref py py-obj docutils literal notranslate"><span class="pre">online_url_search</span></code></a>,
+ in addition to the <a class="reference internal" href="#engine-request-online"><span class="std std-ref">online</span></a> arguments:</span><a class="headerlink" href="#id9" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>default-value, information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>search_url</p></td>
+<td><p>dict</p></td>
+<td><p>URLs from the search query:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
+ <span class="s1">&#39;http&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
+ <span class="s1">&#39;ftp&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
+ <span class="s1">&#39;data:image&#39;</span><span class="p">:</span> <span class="nb">str</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+</td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="specify-request">
+<h3><a class="toc-backref" href="#id23" role="doc-backlink">Specify Request</a><a class="headerlink" href="#specify-request" title="Link to this heading">¶</a></h3>
+<p>The function <a class="reference internal" href="demo/demo_online.html#searx.engines.demo_online.request" title="searx.engines.demo_online.request"><code class="xref py py-func docutils literal notranslate"><span class="pre">def</span> <span class="pre">request(query,</span> <span class="pre">params):</span></code></a> always returns the <code class="docutils literal notranslate"><span class="pre">params</span></code> variable, the
+following parameters can be used to specify a search request:</p>
+<table class="docutils align-default" style="width: 100%">
+<thead>
+<tr class="row-odd"><th class="head"><p>argument</p></th>
+<th class="head"><p>type</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>url</p></td>
+<td><p>str</p></td>
+<td><p>requested url</p></td>
+</tr>
+<tr class="row-odd"><td><p>method</p></td>
+<td><p>str</p></td>
+<td><p>HTTP request method</p></td>
+</tr>
+<tr class="row-even"><td><p>headers</p></td>
+<td><p>set</p></td>
+<td><p>HTTP header information</p></td>
+</tr>
+<tr class="row-odd"><td><p>data</p></td>
+<td><p>set</p></td>
+<td><p>HTTP data information</p></td>
+</tr>
+<tr class="row-even"><td><p>cookies</p></td>
+<td><p>set</p></td>
+<td><p>HTTP cookies</p></td>
+</tr>
+<tr class="row-odd"><td><p>verify</p></td>
+<td><p>bool</p></td>
+<td><p>Performing SSL-Validity check</p></td>
+</tr>
+<tr class="row-even"><td><p>allow_redirects</p></td>
+<td><p>bool</p></td>
+<td><p>Follow redirects</p></td>
+</tr>
+<tr class="row-odd"><td><p>max_redirects</p></td>
+<td><p>int</p></td>
+<td><p>maximum redirects, hard limit</p></td>
+</tr>
+<tr class="row-even"><td><p>soft_max_redirects</p></td>
+<td><p>int</p></td>
+<td><p>maximum redirects, soft limit. Record an error but don’t stop the engine</p></td>
+</tr>
+<tr class="row-odd"><td><p>raise_for_httperror</p></td>
+<td><p>bool</p></td>
+<td><p>True by default: raise an exception if the HTTP code of response is &gt;= 300</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="result-types-template">
+<span id="engine-media-types"></span><span id="engine-results"></span><h2><a class="toc-backref" href="#id24" role="doc-backlink">Result Types (<code class="docutils literal notranslate"><span class="pre">template</span></code>)</a><a class="headerlink" href="#result-types-template" title="Link to this heading">¶</a></h2>
+<p>Each result item of an engine can be of different media-types. Currently the
+following media-types are supported. To set another media-type as
+<a class="reference internal" href="#template-default"><span class="std std-ref">default</span></a>, the parameter <code class="docutils literal notranslate"><span class="pre">template</span></code> must be set to the desired
+type.</p>
+<section id="default">
+<span id="template-default"></span><h3><a class="toc-backref" href="#id25" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">default</span></code></a><a class="headerlink" href="#default" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id10" style="width: 100%">
+<caption><span class="caption-number">Table 9 </span><span class="caption-text">Parameter of the <strong>default</strong> media type:</span><a class="headerlink" href="#id10" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>result-parameter</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>url</p></td>
+<td><p>string, url of the result</p></td>
+</tr>
+<tr class="row-odd"><td><p>title</p></td>
+<td><p>string, title of the result</p></td>
+</tr>
+<tr class="row-even"><td><p>content</p></td>
+<td><p>string, general result-text</p></td>
+</tr>
+<tr class="row-odd"><td><p>publishedDate</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>, time of publish</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="images">
+<span id="template-images"></span><h3><a class="toc-backref" href="#id26" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">images</span></code></a><a class="headerlink" href="#images" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id11" style="width: 100%">
+<caption><span class="caption-number">Table 10 </span><span class="caption-text">Parameter of the <strong>images</strong> media type</span><a class="headerlink" href="#id11" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>result-parameter</p></th>
+<th class="head"><p>Python type</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+<tr class="row-even"><th class="head"><p>template</p></th>
+<th class="head"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></th>
+<th class="head"><p>is set to <code class="docutils literal notranslate"><span class="pre">images.html</span></code></p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><td><p>url</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>url to the result site</p></td>
+</tr>
+<tr class="row-even"><td><p>title</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>title of the result</p></td>
+</tr>
+<tr class="row-odd"><td><p>content</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>description of the image</p></td>
+</tr>
+<tr class="row-even"><td><p>publishedDate</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime</span></code></a></p></td>
+<td><p>time of publish</p></td>
+</tr>
+<tr class="row-odd"><td><p>img_src</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>url to the result image</p></td>
+</tr>
+<tr class="row-even"><td><p>thumbnail_src</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>url to a small-preview image</p></td>
+</tr>
+<tr class="row-odd"><td><p>resolution</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the resolution of the image (e.g. <code class="docutils literal notranslate"><span class="pre">1920</span> <span class="pre">x</span> <span class="pre">1080</span></code> pixel)</p></td>
+</tr>
+<tr class="row-even"><td><p>img_format</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the format of the image (e.g. <code class="docutils literal notranslate"><span class="pre">png</span></code>)</p></td>
+</tr>
+<tr class="row-odd"><td><p>filesize</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>size of bytes in <code class="xref py py-obj docutils literal notranslate"><span class="pre">human</span> <span class="pre">readable</span></code> notation
+(e.g. <code class="docutils literal notranslate"><span class="pre">MB</span></code> for 1024 * 1024 Bytes filesize).</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="videos">
+<span id="template-videos"></span><h3><a class="toc-backref" href="#id27" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">videos</span></code></a><a class="headerlink" href="#videos" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id12" style="width: 100%">
+<caption><span class="caption-number">Table 11 </span><span class="caption-text">Parameter of the <strong>videos</strong> media type:</span><a class="headerlink" href="#id12" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>result-parameter</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+<tr class="row-even"><th class="head"><p>template</p></th>
+<th class="head"><p>is set to <code class="docutils literal notranslate"><span class="pre">videos.html</span></code></p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><td><p>url</p></td>
+<td><p>string, url of the result</p></td>
+</tr>
+<tr class="row-even"><td><p>title</p></td>
+<td><p>string, title of the result</p></td>
+</tr>
+<tr class="row-odd"><td><p>content</p></td>
+<td><p><em>(not implemented yet)</em></p></td>
+</tr>
+<tr class="row-even"><td><p>publishedDate</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>, time of publish</p></td>
+</tr>
+<tr class="row-odd"><td><p>thumbnail</p></td>
+<td><p>string, url to a small-preview image</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="torrent">
+<span id="template-torrent"></span><h3><a class="toc-backref" href="#id28" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">torrent</span></code></a><a class="headerlink" href="#torrent" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id13" style="width: 100%">
+<caption><span class="caption-number">Table 12 </span><span class="caption-text">Parameter of the <strong>torrent</strong> media type:</span><a class="headerlink" href="#id13" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>result-parameter</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+<tr class="row-even"><th class="head"><p>template</p></th>
+<th class="head"><p>is set to <code class="docutils literal notranslate"><span class="pre">torrent.html</span></code></p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><td><p>url</p></td>
+<td><p>string, url of the result</p></td>
+</tr>
+<tr class="row-even"><td><p>title</p></td>
+<td><p>string, title of the result</p></td>
+</tr>
+<tr class="row-odd"><td><p>content</p></td>
+<td><p>string, general result-text</p></td>
+</tr>
+<tr class="row-even"><td><p>publishedDate</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>,
+time of publish <em>(not implemented yet)</em></p></td>
+</tr>
+<tr class="row-odd"><td><p>seed</p></td>
+<td><p>int, number of seeder</p></td>
+</tr>
+<tr class="row-even"><td><p>leech</p></td>
+<td><p>int, number of leecher</p></td>
+</tr>
+<tr class="row-odd"><td><p>filesize</p></td>
+<td><p>int, size of file in bytes</p></td>
+</tr>
+<tr class="row-even"><td><p>files</p></td>
+<td><p>int, number of files</p></td>
+</tr>
+<tr class="row-odd"><td><p>magnetlink</p></td>
+<td><p>string, <a class="reference external" href="https://en.wikipedia.org/wiki/Magnet_URI_scheme">magnetlink</a> of the result</p></td>
+</tr>
+<tr class="row-even"><td><p>torrentfile</p></td>
+<td><p>string, torrentfile of the result</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="map">
+<span id="template-map"></span><h3><a class="toc-backref" href="#id29" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">map</span></code></a><a class="headerlink" href="#map" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id14" style="width: 100%">
+<caption><span class="caption-number">Table 13 </span><span class="caption-text">Parameter of the <strong>map</strong> media type:</span><a class="headerlink" href="#id14" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>result-parameter</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+<tr class="row-even"><th class="head"><p>template</p></th>
+<th class="head"><p>is set to <code class="docutils literal notranslate"><span class="pre">map.html</span></code></p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><td><p>url</p></td>
+<td><p>string, url of the result</p></td>
+</tr>
+<tr class="row-even"><td><p>title</p></td>
+<td><p>string, title of the result</p></td>
+</tr>
+<tr class="row-odd"><td><p>content</p></td>
+<td><p>string, general result-text</p></td>
+</tr>
+<tr class="row-even"><td><p>publishedDate</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>, time of publish</p></td>
+</tr>
+<tr class="row-odd"><td><p>latitude</p></td>
+<td><p>latitude of result (in decimal format)</p></td>
+</tr>
+<tr class="row-even"><td><p>longitude</p></td>
+<td><p>longitude of result (in decimal format)</p></td>
+</tr>
+<tr class="row-odd"><td><p>boundingbox</p></td>
+<td><p>boundingbox of result (array of 4. values
+<code class="docutils literal notranslate"><span class="pre">[lat-min,</span> <span class="pre">lat-max,</span> <span class="pre">lon-min,</span> <span class="pre">lon-max]</span></code>)</p></td>
+</tr>
+<tr class="row-even"><td><p>geojson</p></td>
+<td><p>geojson of result (<a class="reference external" href="https://geojson.org/">https://geojson.org/</a>)</p></td>
+</tr>
+<tr class="row-odd"><td><p>osm.type</p></td>
+<td><p>type of osm-object (if OSM-Result)</p></td>
+</tr>
+<tr class="row-even"><td><p>osm.id</p></td>
+<td><p>id of osm-object (if OSM-Result)</p></td>
+</tr>
+<tr class="row-odd"><td><p>address.name</p></td>
+<td><p>name of object</p></td>
+</tr>
+<tr class="row-even"><td><p>address.road</p></td>
+<td><p>street name of object</p></td>
+</tr>
+<tr class="row-odd"><td><p>address.house_number</p></td>
+<td><p>house number of object</p></td>
+</tr>
+<tr class="row-even"><td><p>address.locality</p></td>
+<td><p>city, place of object</p></td>
+</tr>
+<tr class="row-odd"><td><p>address.postcode</p></td>
+<td><p>postcode of object</p></td>
+</tr>
+<tr class="row-even"><td><p>address.country</p></td>
+<td><p>country of object</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="paper">
+<span id="template-paper"></span><h3><a class="toc-backref" href="#id30" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">paper</span></code></a><a class="headerlink" href="#paper" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id15" style="width: 100%">
+<caption><span class="caption-number">Table 14 </span><span class="caption-text">Parameter of the <strong>paper</strong> media type /
+ see <a class="reference external" href="https://en.wikipedia.org/wiki/BibTeX#Field_types">BibTeX field types</a> and <a class="reference external" href="https://www.bibtex.com/g/bibtex-format/">BibTeX format</a></span><a class="headerlink" href="#id15" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>result-parameter</p></th>
+<th class="head"><p>Python type</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+<tr class="row-even"><th class="head"><p>template</p></th>
+<th class="head"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></th>
+<th class="head"><p>is set to <code class="docutils literal notranslate"><span class="pre">paper.html</span></code></p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><td><p>title</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>title of the result</p></td>
+</tr>
+<tr class="row-even"><td><p>content</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>abstract</p></td>
+</tr>
+<tr class="row-odd"><td><p>comments</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>free text display in italic below the content</p></td>
+</tr>
+<tr class="row-even"><td><p>tags</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">List</span></code></a>[<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a>]</p></td>
+<td><p>free tag list</p></td>
+</tr>
+<tr class="row-odd"><td><p>publishedDate</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime</span></code></a></p></td>
+<td><p>last publication date</p></td>
+</tr>
+<tr class="row-even"><td><p>type</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>short description of medium type, e.g. <em>book</em>, <em>pdf</em> or <em>html</em> …</p></td>
+</tr>
+<tr class="row-odd"><td><p>authors</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">List</span></code></a>[<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a>]</p></td>
+<td><p>list of authors of the work (authors with a “s”)</p></td>
+</tr>
+<tr class="row-even"><td><p>editor</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>list of editors of a book</p></td>
+</tr>
+<tr class="row-odd"><td><p>publisher</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>name of the publisher</p></td>
+</tr>
+<tr class="row-even"><td><p>journal</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>name of the journal or magazine the article was
+published in</p></td>
+</tr>
+<tr class="row-odd"><td><p>volume</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>volume number</p></td>
+</tr>
+<tr class="row-even"><td><p>pages</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>page range where the article is</p></td>
+</tr>
+<tr class="row-odd"><td><p>number</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>number of the report or the issue number for a journal article</p></td>
+</tr>
+<tr class="row-even"><td><p>doi</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>DOI number (like <code class="docutils literal notranslate"><span class="pre">10.1038/d41586-018-07848-2</span></code>)</p></td>
+</tr>
+<tr class="row-odd"><td><p>issn</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">List</span></code></a>[<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a>]</p></td>
+<td><p>ISSN number like <code class="docutils literal notranslate"><span class="pre">1476-4687</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>isbn</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">List</span></code></a>[<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a>]</p></td>
+<td><p>ISBN number like <code class="docutils literal notranslate"><span class="pre">9780201896831</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>pdf_url</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>URL to the full article, the PDF version</p></td>
+</tr>
+<tr class="row-even"><td><p>html_url</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>URL to full article, HTML version</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="packages">
+<span id="template-packages"></span><h3><a class="toc-backref" href="#id31" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">packages</span></code></a><a class="headerlink" href="#packages" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default" id="id16" style="width: 100%">
+<caption><span class="caption-number">Table 15 </span><span class="caption-text">Parameter of the <strong>packages</strong> media type</span><a class="headerlink" href="#id16" title="Link to this table">¶</a></caption>
+<thead>
+<tr class="row-odd"><th class="head"><p>result-parameter</p></th>
+<th class="head"><p>Python type</p></th>
+<th class="head"><p>information</p></th>
+</tr>
+<tr class="row-even"><th class="head"><p>template</p></th>
+<th class="head"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></th>
+<th class="head"><p>is set to <code class="docutils literal notranslate"><span class="pre">packages.html</span></code></p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><td><p>title</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>title of the result</p></td>
+</tr>
+<tr class="row-even"><td><p>content</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>abstract</p></td>
+</tr>
+<tr class="row-odd"><td><p>package_name</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the name of the package</p></td>
+</tr>
+<tr class="row-even"><td><p>version</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the current version of the package</p></td>
+</tr>
+<tr class="row-odd"><td><p>maintainer</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the maintainer or author of the project</p></td>
+</tr>
+<tr class="row-even"><td><p>publishedDate</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime</span></code></a></p></td>
+<td><p>date of latest update or release</p></td>
+</tr>
+<tr class="row-odd"><td><p>tags</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">List</span></code></a>[<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a>]</p></td>
+<td><p>free tag list</p></td>
+</tr>
+<tr class="row-even"><td><p>popularity</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the popularity of the package, e.g. rating or download count</p></td>
+</tr>
+<tr class="row-odd"><td><p>license_name</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the name of the license</p></td>
+</tr>
+<tr class="row-even"><td><p>license_url</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the web location of a license copy</p></td>
+</tr>
+<tr class="row-odd"><td><p>homepage</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the url of the project’s homepage</p></td>
+</tr>
+<tr class="row-even"><td><p>source_code_url</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
+<td><p>the location of the project’s source code</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#">Engine Overview</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#general-engine-configuration">General Engine Configuration</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#engine-file">Engine File</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#engine-settings-yml">Engine <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#overrides">Overrides</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#making-a-request">Making a Request</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#passed-arguments-request">Passed Arguments (request)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#specify-request">Specify Request</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#result-types-template">Result Types (<code class="docutils literal notranslate"><span class="pre">template</span></code>)</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#default"><code class="docutils literal notranslate"><span class="pre">default</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#images"><code class="docutils literal notranslate"><span class="pre">images</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#videos"><code class="docutils literal notranslate"><span class="pre">videos</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#torrent"><code class="docutils literal notranslate"><span class="pre">torrent</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#map"><code class="docutils literal notranslate"><span class="pre">map</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#paper"><code class="docutils literal notranslate"><span class="pre">paper</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#packages"><code class="docutils literal notranslate"><span class="pre">packages</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="index.html#engine-types">Engine Types</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="engines.html" title="previous chapter">SearXNG’s engines loader</a>
+ <li>Next: <a href="demo/demo_online.html" title="next chapter">Demo Online Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/engines/engine_overview.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/enginelib.html b/dev/engines/enginelib.html
new file mode 100644
index 000000000..138abefc4
--- /dev/null
+++ b/dev/engines/enginelib.html
@@ -0,0 +1,571 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Engine Library &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="SearXNG’s engines loader" href="engines.html" />
+ <link rel="prev" title="Engine Implementations" href="index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="engines.html" title="SearXNG’s engines loader"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="Engine Implementations"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Engine Library</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="engine-library">
+<span id="searx-enginelib"></span><h1>Engine Library<a class="headerlink" href="#engine-library" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.enginelib.traits" id="id1">Engine traits</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.enginelib">Implementations of the framework for the SearXNG engines.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>The long term goal is to modularize all implementations of the engine
+framework here in this Python package. ToDo:</p>
+<ul class="simple">
+<li><p>move implementations of the <a class="reference internal" href="engines.html#searx-engines-loader"><span class="std std-ref">SearXNG’s engines loader</span></a> to a new module in
+the <a class="reference internal" href="#module-searx.enginelib" title="searx.enginelib"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.enginelib</span></code></a> namespace.</p></li>
+</ul>
+</div>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.enginelib.Engine">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.enginelib.</span></span><span class="sig-name descname"><span class="pre">Engine</span></span><a class="reference internal" href="../../_modules/searx/enginelib.html#Engine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.Engine" title="Link to this definition">¶</a></dt>
+<dd><p>Class of engine instances build from YAML settings.</p>
+<p>Further documentation see <a class="reference internal" href="engine_overview.html#general-engine-configuration"><span class="std std-ref">General Engine Configuration</span></a>.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>This class is currently never initialized and only used for type hinting.</p>
+</div>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.about">
+<span class="sig-name descname"><span class="pre">about</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><span class="pre">dict</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.about" title="Link to this definition">¶</a></dt>
+<dd><p>Additional fields describing the engine.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">about</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">website</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://example.com</span>
+<span class="w"> </span><span class="nt">wikidata_id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Q306656</span>
+<span class="w"> </span><span class="nt">official_api_documentation</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://example.com/api-doc</span>
+<span class="w"> </span><span class="nt">use_official_api</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">require_api_key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">results</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">HTML</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.categories">
+<span class="sig-name descname"><span class="pre">categories</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.enginelib.Engine.categories" title="Link to this definition">¶</a></dt>
+<dd><p>Specifies to which <a class="reference internal" href="../../admin/settings/settings_engine.html#engine-categories"><span class="std std-ref">categories</span></a> the engine should be added.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.disabled">
+<span class="sig-name descname"><span class="pre">disabled</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.disabled" title="Link to this definition">¶</a></dt>
+<dd><p>To disable by default the engine, but not deleting it. It will allow the
+user to manually activate it in the settings.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.display_error_messages">
+<span class="sig-name descname"><span class="pre">display_error_messages</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.display_error_messages" title="Link to this definition">¶</a></dt>
+<dd><p>Display error messages on the web UI.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.enable_http">
+<span class="sig-name descname"><span class="pre">enable_http</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.enable_http" title="Link to this definition">¶</a></dt>
+<dd><p>Enable HTTP (by default only HTTPS is enabled).</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.engine">
+<span class="sig-name descname"><span class="pre">engine</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.engine" title="Link to this definition">¶</a></dt>
+<dd><p>Name of the python file used to handle requests and responses to and from
+this search engine (file name from <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines">git://searx/engines</a> without
+<code class="docutils literal notranslate"><span class="pre">.py</span></code>).</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.engine_type">
+<span class="sig-name descname"><span class="pre">engine_type</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.engine_type" title="Link to this definition">¶</a></dt>
+<dd><p>Type of the engine (<a class="reference internal" href="../../src/searx.search.processors.html#searx-search-processors"><span class="std std-ref">Search processors</span></a>)</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.fetch_traits">
+<span class="sig-name descname"><span class="pre">fetch_traits</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Callable" title="(in Python v3.12)"><span class="pre">Callable</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Function to to fetch engine’s traits from origin.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.inactive">
+<span class="sig-name descname"><span class="pre">inactive</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.inactive" title="Link to this definition">¶</a></dt>
+<dd><p>Remove the engine from the settings (<em>disabled &amp; removed</em>).</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.language">
+<span class="sig-name descname"><span class="pre">language</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.language" title="Link to this definition">¶</a></dt>
+<dd><p>For an engine, when there is <code class="docutils literal notranslate"><span class="pre">language:</span> <span class="pre">...</span></code> in the YAML settings the engine
+does support only this one language:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">google french</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">google</span>
+<span class="w"> </span><span class="nt">language</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">fr</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.language_support">
+<span class="sig-name descname"><span class="pre">language_support</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.language_support" title="Link to this definition">¶</a></dt>
+<dd><p>Engine supports languages (locales) search.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.name">
+<span class="sig-name descname"><span class="pre">name</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.name" title="Link to this definition">¶</a></dt>
+<dd><p>Name that will be used across SearXNG to define this engine. In settings, on
+the result page ..</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.paging">
+<span class="sig-name descname"><span class="pre">paging</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.paging" title="Link to this definition">¶</a></dt>
+<dd><p>Engine supports multiple pages.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.proxies">
+<span class="sig-name descname"><span class="pre">proxies</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><span class="pre">dict</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.proxies" title="Link to this definition">¶</a></dt>
+<dd><p>Set proxies for a specific engine (YAML):</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">proxies </span><span class="p">:</span>
+<span class="w"> </span><span class="nt">http</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">socks5://proxy:port</span>
+<span class="w"> </span><span class="nt">https</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">socks5://proxy:port</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.region">
+<span class="sig-name descname"><span class="pre">region</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.region" title="Link to this definition">¶</a></dt>
+<dd><p>For an engine, when there is <code class="docutils literal notranslate"><span class="pre">region:</span> <span class="pre">...</span></code> in the YAML settings the engine
+does support only this one region:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">..</span> <span class="n">code</span><span class="p">::</span> <span class="n">yaml</span>
+</pre></div>
+</div>
+<blockquote>
+<div><ul class="simple">
+<li><p>name: google belgium
+engine: google
+region: fr-BE</p></li>
+</ul>
+</div></blockquote>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.safesearch">
+<span class="sig-name descname"><span class="pre">safesearch</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.safesearch" title="Link to this definition">¶</a></dt>
+<dd><p>Engine supports SafeSearch</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.send_accept_language_header">
+<span class="sig-name descname"><span class="pre">send_accept_language_header</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.send_accept_language_header" title="Link to this definition">¶</a></dt>
+<dd><p>When this option is activated, the language (locale) that is selected by
+the user is used to build and send a <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> header in the
+request to the origin search engine.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.shortcut">
+<span class="sig-name descname"><span class="pre">shortcut</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.shortcut" title="Link to this definition">¶</a></dt>
+<dd><p>Code used to execute bang requests (<code class="docutils literal notranslate"><span class="pre">!foo</span></code>)</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.time_range_support">
+<span class="sig-name descname"><span class="pre">time_range_support</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.time_range_support" title="Link to this definition">¶</a></dt>
+<dd><p>Engine supports search time range.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.timeout">
+<span class="sig-name descname"><span class="pre">timeout</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.12)"><span class="pre">float</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.timeout" title="Link to this definition">¶</a></dt>
+<dd><p>Specific timeout for search-engine.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.tokens">
+<span class="sig-name descname"><span class="pre">tokens</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.enginelib.Engine.tokens" title="Link to this definition">¶</a></dt>
+<dd><p>A list of secret tokens to make this engine <em>private</em>, more details see
+<a class="reference internal" href="../../admin/settings/settings_engine.html#private-engines"><span class="std std-ref">Private Engines (tokens)</span></a>.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.traits">
+<span class="sig-name descname"><span class="pre">traits</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference internal" href="#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.traits" title="Link to this definition">¶</a></dt>
+<dd><p>Traits of the engine.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.Engine.using_tor_proxy">
+<span class="sig-name descname"><span class="pre">using_tor_proxy</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><a class="headerlink" href="#searx.enginelib.Engine.using_tor_proxy" title="Link to this definition">¶</a></dt>
+<dd><p>Using tor proxy (<code class="docutils literal notranslate"><span class="pre">true</span></code>) or not (<code class="docutils literal notranslate"><span class="pre">false</span></code>) for this engine.</p>
+</dd></dl>
+
+</dd></dl>
+
+<section id="module-searx.enginelib.traits">
+<span id="engine-traits"></span><span id="searx-enginelib-traits"></span><h2><a class="toc-backref" href="#id1" role="doc-backlink">Engine traits</a><a class="headerlink" href="#module-searx.enginelib.traits" title="Link to this heading">¶</a></h2>
+<p>Engine’s traits are fetched from the origin engines and stored in a JSON file
+in the <em>data folder</em>. Most often traits are languages and region codes and
+their mapping from SearXNG’s representation to the representation in the origin
+search engine. For new traits new properties can be added to the class
+<a class="reference internal" href="#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><code class="xref py py-class docutils literal notranslate"><span class="pre">EngineTraits</span></code></a>.</p>
+<p>To load traits from the persistence <a class="reference internal" href="#searx.enginelib.traits.EngineTraitsMap.from_data" title="searx.enginelib.traits.EngineTraitsMap.from_data"><code class="xref py py-obj docutils literal notranslate"><span class="pre">EngineTraitsMap.from_data</span></code></a> can be
+used.</p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.enginelib.traits.</span></span><span class="sig-name descname"><span class="pre">EngineTraits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">regions:</span> <span class="pre">~typing.Dict[str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">str]</span> <span class="pre">=</span> <span class="pre">&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">languages:</span> <span class="pre">~typing.Dict[str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">str]</span> <span class="pre">=</span> <span class="pre">&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">all_locale:</span> <span class="pre">str</span> <span class="pre">|</span> <span class="pre">None</span> <span class="pre">=</span> <span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">data_type:</span> <span class="pre">~typing.Literal['traits_v1']</span> <span class="pre">=</span> <span class="pre">'traits_v1'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">custom:</span> <span class="pre">~typing.Dict[str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">~typing.Dict[str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">~typing.Dict]</span> <span class="pre">|</span> <span class="pre">~typing.Iterable[str]]</span> <span class="pre">=</span> <span class="pre">&lt;factory&gt;</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraits" title="Link to this definition">¶</a></dt>
+<dd><p>The class is intended to be instantiated for each engine.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.copy">
+<span class="sig-name descname"><span class="pre">copy</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraits.copy"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.copy" title="Link to this definition">¶</a></dt>
+<dd><p>Create a copy of the dataclass object.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.fetch_traits">
+<em class="property"><span class="pre">classmethod</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.enginelib.Engine" title="searx.enginelib.Engine"><span class="pre">Engine</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="s"><span class="pre">'EngineTraits'</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraits.fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Call a function <code class="docutils literal notranslate"><span class="pre">fetch_traits(engine_traits)</span></code> from engines namespace to fetch
+and set properties from the origin engine in the object <code class="docutils literal notranslate"><span class="pre">engine_traits</span></code>. If
+function does not exists, <code class="docutils literal notranslate"><span class="pre">None</span></code> is returned.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.get_language">
+<span class="sig-name descname"><span class="pre">get_language</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">searxng_locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraits.get_language"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.get_language" title="Link to this definition">¶</a></dt>
+<dd><p>Return engine’s language string that <em>best fits</em> to SearXNG’s locale.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>searxng_locale</strong> – SearXNG’s internal representation of locale
+selected by the user.</p></li>
+<li><p><strong>default</strong> – engine’s default language</p></li>
+</ul>
+</dd>
+</dl>
+<p>The <em>best fits</em> rules are implemented in
+<a class="reference internal" href="../../src/searx.locales.html#searx.locales.get_engine_locale" title="searx.locales.get_engine_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.locales.get_engine_locale</span></code></a>. Except for the special value <code class="docutils literal notranslate"><span class="pre">all</span></code>
+which is determined from <a class="reference internal" href="#searx.enginelib.traits.EngineTraits.all_locale" title="searx.enginelib.traits.EngineTraits.all_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">EngineTraits.all_locale</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.get_region">
+<span class="sig-name descname"><span class="pre">get_region</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">searxng_locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraits.get_region"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.get_region" title="Link to this definition">¶</a></dt>
+<dd><p>Return engine’s region string that best fits to SearXNG’s locale.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>searxng_locale</strong> – SearXNG’s internal representation of locale
+selected by the user.</p></li>
+<li><p><strong>default</strong> – engine’s default region</p></li>
+</ul>
+</dd>
+</dl>
+<p>The <em>best fits</em> rules are implemented in
+<a class="reference internal" href="../../src/searx.locales.html#searx.locales.get_engine_locale" title="searx.locales.get_engine_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.locales.get_engine_locale</span></code></a>. Except for the special value <code class="docutils literal notranslate"><span class="pre">all</span></code>
+which is determined from <a class="reference internal" href="#searx.enginelib.traits.EngineTraits.all_locale" title="searx.enginelib.traits.EngineTraits.all_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">EngineTraits.all_locale</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.is_locale_supported">
+<span class="sig-name descname"><span class="pre">is_locale_supported</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">searxng_locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span></span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraits.is_locale_supported"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.is_locale_supported" title="Link to this definition">¶</a></dt>
+<dd><p>A <em>locale</em> (SearXNG’s internal representation) is considered to be
+supported by the engine if the <em>region</em> or the <em>language</em> is supported
+by the engine.</p>
+<p>For verification the functions <a class="reference internal" href="#searx.enginelib.traits.EngineTraits.get_region" title="searx.enginelib.traits.EngineTraits.get_region"><code class="xref py py-func docutils literal notranslate"><span class="pre">EngineTraits.get_region()</span></code></a> and
+<a class="reference internal" href="#searx.enginelib.traits.EngineTraits.get_language" title="searx.enginelib.traits.EngineTraits.get_language"><code class="xref py py-func docutils literal notranslate"><span class="pre">EngineTraits.get_language()</span></code></a> are used.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.set_traits">
+<span class="sig-name descname"><span class="pre">set_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.enginelib.Engine" title="searx.enginelib.Engine"><span class="pre">Engine</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraits.set_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.set_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Set traits from self object in a <a class="reference internal" href="#searx.enginelib.Engine" title="searx.enginelib.Engine"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Engine</span></code></a> namespace.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>engine</strong> – engine instance build by <a class="reference internal" href="engines.html#searx.engines.load_engine" title="searx.engines.load_engine"><code class="xref py py-func docutils literal notranslate"><span class="pre">searx.engines.load_engine()</span></code></a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.all_locale">
+<span class="sig-name descname"><span class="pre">all_locale</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></em><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.all_locale" title="Link to this definition">¶</a></dt>
+<dd><p>To which locale value SearXNG’s <code class="docutils literal notranslate"><span class="pre">all</span></code> language is mapped (shown a “Default
+language”).</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.custom">
+<span class="sig-name descname"><span class="pre">custom</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Iterable" title="(in Python v3.12)"><span class="pre">Iterable</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.custom" title="Link to this definition">¶</a></dt>
+<dd><p>A place to store engine’s custom traits, not related to the SearXNG core.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.data_type">
+<span class="sig-name descname"><span class="pre">data_type</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Literal" title="(in Python v3.12)"><span class="pre">Literal</span></a><span class="p"><span class="pre">[</span></span><span class="s"><span class="pre">'traits_v1'</span></span><span class="p"><span class="pre">]</span></span></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'traits_v1'</span></em><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.data_type" title="Link to this definition">¶</a></dt>
+<dd><p>Data type, default is ‘traits_v1’.</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.languages">
+<span class="sig-name descname"><span class="pre">languages</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.languages" title="Link to this definition">¶</a></dt>
+<dd><p>Maps SearXNG’s internal representation of a language to the one of the engine.</p>
+<p>SearXNG’s internal representation can be parsed by babel and the value is
+send to the engine:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">languages</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;ca&#39;</span> <span class="p">:</span> <span class="o">&lt;</span><span class="n">engine</span><span class="s1">&#39;s language name&gt;,</span>
+<span class="p">}</span>
+
+<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">egnine_lang</span> <span class="ow">in</span> <span class="n">languages</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">searxng_lang</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">key</span><span class="p">)</span>
+ <span class="o">...</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraits.regions">
+<span class="sig-name descname"><span class="pre">regions</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.enginelib.traits.EngineTraits.regions" title="Link to this definition">¶</a></dt>
+<dd><p>Maps SearXNG’s internal representation of a region to the one of the engine.</p>
+<p>SearXNG’s internal representation can be parsed by babel and the value is
+send to the engine:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">regions</span> <span class="o">=</span><span class="p">{</span>
+ <span class="s1">&#39;fr-BE&#39;</span> <span class="p">:</span> <span class="o">&lt;</span><span class="n">engine</span><span class="s1">&#39;s region name&gt;,</span>
+<span class="p">}</span>
+
+<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">egnine_region</span> <span class="n">regions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">searxng_region</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">key</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="o">...</span>
+</pre></div>
+</div>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraitsEncoder">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.enginelib.traits.</span></span><span class="sig-name descname"><span class="pre">EngineTraitsEncoder</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">skipkeys</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ensure_ascii</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">check_circular</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">allow_nan</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sort_keys</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">indent</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">separators</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraitsEncoder"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraitsEncoder" title="Link to this definition">¶</a></dt>
+<dd><p>Encodes <a class="reference internal" href="#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><code class="xref py py-class docutils literal notranslate"><span class="pre">EngineTraits</span></code></a> to a serializable object, see
+<a class="reference external" href="https://docs.python.org/3/library/json.html#json.JSONEncoder" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">json.JSONEncoder</span></code></a>.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraitsEncoder.default">
+<span class="sig-name descname"><span class="pre">default</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">o</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraitsEncoder.default"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraitsEncoder.default" title="Link to this definition">¶</a></dt>
+<dd><p>Return dictionary of a <a class="reference internal" href="#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><code class="xref py py-class docutils literal notranslate"><span class="pre">EngineTraits</span></code></a> object.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraitsMap">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.enginelib.traits.</span></span><span class="sig-name descname"><span class="pre">EngineTraitsMap</span></span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraitsMap"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraitsMap" title="Link to this definition">¶</a></dt>
+<dd><p>A python dictionary to map <a class="reference internal" href="#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><code class="xref py py-class docutils literal notranslate"><span class="pre">EngineTraits</span></code></a> by engine name.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraitsMap.from_data">
+<em class="property"><span class="pre">classmethod</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">from_data</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#searx.enginelib.traits.EngineTraitsMap" title="searx.enginelib.traits.EngineTraitsMap"><span class="pre">EngineTraitsMap</span></a></span></span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraitsMap.from_data"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraitsMap.from_data" title="Link to this definition">¶</a></dt>
+<dd><p>Instantiate <a class="reference internal" href="#searx.enginelib.traits.EngineTraitsMap" title="searx.enginelib.traits.EngineTraitsMap"><code class="xref py py-class docutils literal notranslate"><span class="pre">EngineTraitsMap</span></code></a> object from <code class="xref py py-obj docutils literal notranslate"><span class="pre">ENGINE_TRAITS</span></code></p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraitsMap.save_data">
+<span class="sig-name descname"><span class="pre">save_data</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraitsMap.save_data"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraitsMap.save_data" title="Link to this definition">¶</a></dt>
+<dd><p>Store EngineTraitsMap in in file <code class="xref py py-obj docutils literal notranslate"><span class="pre">self.ENGINE_TRAITS_FILE</span></code></p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraitsMap.set_traits">
+<span class="sig-name descname"><span class="pre">set_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.enginelib.Engine" title="searx.enginelib.Engine"><span class="pre">Engine</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/types.html#types.ModuleType" title="(in Python v3.12)"><span class="pre">types.ModuleType</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/enginelib/traits.html#EngineTraitsMap.set_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.enginelib.traits.EngineTraitsMap.set_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Set traits in a <code class="xref py py-obj docutils literal notranslate"><span class="pre">Engine</span></code> namespace.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>engine</strong> – engine instance build by <a class="reference internal" href="engines.html#searx.engines.load_engine" title="searx.engines.load_engine"><code class="xref py py-func docutils literal notranslate"><span class="pre">searx.engines.load_engine()</span></code></a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE">
+<span class="sig-name descname"><span class="pre">ENGINE_TRAITS_FILE</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">PosixPath('/home/runner/work/searxng/searxng/searx/data/engine_traits.json')</span></em><a class="headerlink" href="#searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE" title="Link to this definition">¶</a></dt>
+<dd><p>File with persistence of the <a class="reference internal" href="#searx.enginelib.traits.EngineTraitsMap" title="searx.enginelib.traits.EngineTraitsMap"><code class="xref py py-obj docutils literal notranslate"><span class="pre">EngineTraitsMap</span></code></a>.</p>
+</dd></dl>
+
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3 current"><a class="current reference internal" href="#">Engine Library</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.enginelib.Engine"><code class="docutils literal notranslate"><span class="pre">Engine</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.about"><code class="docutils literal notranslate"><span class="pre">Engine.about</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.categories"><code class="docutils literal notranslate"><span class="pre">Engine.categories</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.disabled"><code class="docutils literal notranslate"><span class="pre">Engine.disabled</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.display_error_messages"><code class="docutils literal notranslate"><span class="pre">Engine.display_error_messages</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.enable_http"><code class="docutils literal notranslate"><span class="pre">Engine.enable_http</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.engine"><code class="docutils literal notranslate"><span class="pre">Engine.engine</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.engine_type"><code class="docutils literal notranslate"><span class="pre">Engine.engine_type</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.fetch_traits"><code class="docutils literal notranslate"><span class="pre">Engine.fetch_traits</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.inactive"><code class="docutils literal notranslate"><span class="pre">Engine.inactive</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.language"><code class="docutils literal notranslate"><span class="pre">Engine.language</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.language_support"><code class="docutils literal notranslate"><span class="pre">Engine.language_support</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.name"><code class="docutils literal notranslate"><span class="pre">Engine.name</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.paging"><code class="docutils literal notranslate"><span class="pre">Engine.paging</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.proxies"><code class="docutils literal notranslate"><span class="pre">Engine.proxies</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.region"><code class="docutils literal notranslate"><span class="pre">Engine.region</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.safesearch"><code class="docutils literal notranslate"><span class="pre">Engine.safesearch</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.send_accept_language_header"><code class="docutils literal notranslate"><span class="pre">Engine.send_accept_language_header</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.shortcut"><code class="docutils literal notranslate"><span class="pre">Engine.shortcut</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.time_range_support"><code class="docutils literal notranslate"><span class="pre">Engine.time_range_support</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.timeout"><code class="docutils literal notranslate"><span class="pre">Engine.timeout</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.tokens"><code class="docutils literal notranslate"><span class="pre">Engine.tokens</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.traits"><code class="docutils literal notranslate"><span class="pre">Engine.traits</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.Engine.using_tor_proxy"><code class="docutils literal notranslate"><span class="pre">Engine.using_tor_proxy</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#module-searx.enginelib.traits">Engine traits</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.traits.EngineTraits"><code class="docutils literal notranslate"><span class="pre">EngineTraits</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.traits.EngineTraitsEncoder"><code class="docutils literal notranslate"><span class="pre">EngineTraitsEncoder</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.enginelib.traits.EngineTraitsMap"><code class="docutils literal notranslate"><span class="pre">EngineTraitsMap</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3"><a class="reference internal" href="index.html#engine-types">Engine Types</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="index.html" title="previous chapter">Engine Implementations</a>
+ <li>Next: <a href="engines.html" title="next chapter">SearXNG’s engines loader</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/engines/enginelib.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/engines.html b/dev/engines/engines.html
new file mode 100644
index 000000000..98b506a66
--- /dev/null
+++ b/dev/engines/engines.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>SearXNG’s engines loader &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="Engine Overview" href="engine_overview.html" />
+ <link rel="prev" title="Engine Library" href="enginelib.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="engine_overview.html" title="Engine Overview"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="enginelib.html" title="Engine Library"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">SearXNG’s engines loader</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="module-searx.engines">
+<span id="searxng-s-engines-loader"></span><span id="searx-engines-loader"></span><h1>SearXNG’s engines loader<a class="headerlink" href="#module-searx.engines" title="Link to this heading">¶</a></h1>
+<p>Load and initialize the <code class="docutils literal notranslate"><span class="pre">engines</span></code>, see <a class="reference internal" href="#searx.engines.load_engines" title="searx.engines.load_engines"><code class="xref py py-func docutils literal notranslate"><span class="pre">load_engines()</span></code></a> and register
+<a class="reference internal" href="#searx.engines.engine_shortcuts" title="searx.engines.engine_shortcuts"><code class="xref py py-obj docutils literal notranslate"><span class="pre">engine_shortcuts</span></code></a>.</p>
+<p>usage:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">load_engines</span><span class="p">(</span> <span class="n">settings</span><span class="p">[</span><span class="s1">&#39;engines&#39;</span><span class="p">]</span> <span class="p">)</span>
+</pre></div>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.is_missing_required_attributes">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.</span></span><span class="sig-name descname"><span class="pre">is_missing_required_attributes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/engines.html#is_missing_required_attributes"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.is_missing_required_attributes" title="Link to this definition">¶</a></dt>
+<dd><p>An attribute is required when its name doesn’t start with <code class="docutils literal notranslate"><span class="pre">_</span></code> (underline).
+Required attributes must not be <code class="docutils literal notranslate"><span class="pre">None</span></code>.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.load_engine">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.</span></span><span class="sig-name descname"><span class="pre">load_engine</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><span class="pre">dict</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="enginelib.html#searx.enginelib.Engine" title="searx.enginelib.Engine"><span class="pre">Engine</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/types.html#types.ModuleType" title="(in Python v3.12)"><span class="pre">types.ModuleType</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../_modules/searx/engines.html#load_engine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.load_engine" title="Link to this definition">¶</a></dt>
+<dd><p>Load engine from <code class="docutils literal notranslate"><span class="pre">engine_data</span></code>.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>engine_data</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><em>dict</em></a>) – Attributes from YAML <code class="docutils literal notranslate"><span class="pre">settings:engines/&lt;engine&gt;</span></code></p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>initialized namespace of the <code class="docutils literal notranslate"><span class="pre">&lt;engine&gt;</span></code>.</p>
+</dd>
+</dl>
+<ol class="arabic simple">
+<li><p>create a namespace and load module of the <code class="docutils literal notranslate"><span class="pre">&lt;engine&gt;</span></code></p></li>
+<li><p>update namespace with the defaults from <code class="xref py py-obj docutils literal notranslate"><span class="pre">ENGINE_DEFAULT_ARGS</span></code></p></li>
+<li><p>update namespace with values from <code class="docutils literal notranslate"><span class="pre">engine_data</span></code></p></li>
+</ol>
+<p>If engine <em>is active</em>, return namespace of the engine, otherwise return
+<code class="docutils literal notranslate"><span class="pre">None</span></code>.</p>
+<p>This function also returns <code class="docutils literal notranslate"><span class="pre">None</span></code> if initialization of the namespace fails
+for one of the following reasons:</p>
+<ul class="simple">
+<li><p>engine name contains underscore</p></li>
+<li><p>engine name is not lowercase</p></li>
+<li><p>required attribute is not set <a class="reference internal" href="#searx.engines.is_missing_required_attributes" title="searx.engines.is_missing_required_attributes"><code class="xref py py-func docutils literal notranslate"><span class="pre">is_missing_required_attributes()</span></code></a></p></li>
+</ul>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.load_engines">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.</span></span><span class="sig-name descname"><span class="pre">load_engines</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_list</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/engines.html#load_engines"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.load_engines" title="Link to this definition">¶</a></dt>
+<dd><p>usage: <code class="docutils literal notranslate"><span class="pre">engine_list</span> <span class="pre">=</span> <span class="pre">settings['engines']</span></code></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.using_tor_proxy">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.</span></span><span class="sig-name descname"><span class="pre">using_tor_proxy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="enginelib.html#searx.enginelib.Engine" title="searx.enginelib.Engine"><span class="pre">Engine</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/types.html#types.ModuleType" title="(in Python v3.12)"><span class="pre">types.ModuleType</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/engines.html#using_tor_proxy"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.using_tor_proxy" title="Link to this definition">¶</a></dt>
+<dd><p>Return True if the engine configuration declares to use Tor.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.engine_shortcuts">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.</span></span><span class="sig-name descname"><span class="pre">engine_shortcuts</span></span><a class="headerlink" href="#searx.engines.engine_shortcuts" title="Link to this definition">¶</a></dt>
+<dd><p>Simple map of registered <em>shortcuts</em> to name of the engine (or <code class="docutils literal notranslate"><span class="pre">None</span></code>).</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">engine_shortcuts</span><span class="p">[</span><span class="n">engine</span><span class="o">.</span><span class="n">shortcut</span><span class="p">]</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">name</span>
+</pre></div>
+</div>
+<dl class="field-list simple">
+</dl>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="enginelib.html">Engine Library</a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#">SearXNG’s engines loader</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.engines.is_missing_required_attributes"><code class="docutils literal notranslate"><span class="pre">is_missing_required_attributes()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.engines.load_engine"><code class="docutils literal notranslate"><span class="pre">load_engine()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.engines.load_engines"><code class="docutils literal notranslate"><span class="pre">load_engines()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.engines.using_tor_proxy"><code class="docutils literal notranslate"><span class="pre">using_tor_proxy()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.engines.engine_shortcuts"><code class="docutils literal notranslate"><span class="pre">engine_shortcuts</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3"><a class="reference internal" href="index.html#engine-types">Engine Types</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="enginelib.html" title="previous chapter">Engine Library</a>
+ <li>Next: <a href="engine_overview.html" title="next chapter">Engine Overview</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/engines/engines.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/index.html b/dev/engines/index.html
new file mode 100644
index 000000000..e48caa302
--- /dev/null
+++ b/dev/engines/index.html
@@ -0,0 +1,350 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Engine Implementations &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="Engine Library" href="enginelib.html" />
+ <link rel="prev" title="How to contribute" href="../contribution_guide.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="enginelib.html" title="Engine Library"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../contribution_guide.html" title="How to contribute"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Engine Implementations</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="engine-implementations">
+<span id="id1"></span><h1>Engine Implementations<a class="headerlink" href="#engine-implementations" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#engine-types" id="id7">Engine Types</a></p>
+<ul>
+<li><p><a class="reference internal" href="#online-engines" id="id8">Online Engines</a></p></li>
+<li><p><a class="reference internal" href="#offline-engines" id="id9">Offline Engines</a></p></li>
+<li><p><a class="reference internal" href="#online-url-search" id="id10">Online URL Search</a></p></li>
+<li><p><a class="reference internal" href="#online-currency" id="id11">Online Currency</a></p></li>
+<li><p><a class="reference internal" href="#online-dictionary" id="id12">Online Dictionary</a></p></li>
+</ul>
+</li>
+</ul>
+</nav>
+<div class="toctree-wrapper compound">
+<p class="caption" role="heading"><span class="caption-text">Framework Components</span></p>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="enginelib.html">Engine Library</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="enginelib.html#searx.enginelib.Engine"><code class="docutils literal notranslate"><span class="pre">Engine</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="enginelib.html#module-searx.enginelib.traits">Engine traits</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="engines.html">SearXNG’s engines loader</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="engines.html#searx.engines.is_missing_required_attributes"><code class="docutils literal notranslate"><span class="pre">is_missing_required_attributes()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines.html#searx.engines.load_engine"><code class="docutils literal notranslate"><span class="pre">load_engine()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines.html#searx.engines.load_engines"><code class="docutils literal notranslate"><span class="pre">load_engines()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines.html#searx.engines.using_tor_proxy"><code class="docutils literal notranslate"><span class="pre">using_tor_proxy()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines.html#searx.engines.engine_shortcuts"><code class="docutils literal notranslate"><span class="pre">engine_shortcuts</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="engine_overview.html">Engine Overview</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="engine_overview.html#general-engine-configuration">General Engine Configuration</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engine_overview.html#making-a-request">Making a Request</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engine_overview.html#result-types-template">Result Types (<code class="docutils literal notranslate"><span class="pre">template</span></code>)</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<section id="engine-types">
+<h2><a class="toc-backref" href="#id7" role="doc-backlink">Engine Types</a><a class="headerlink" href="#engine-types" title="Link to this heading">¶</a></h2>
+<p>The <a class="reference internal" href="enginelib.html#searx.enginelib.Engine.engine_type" title="searx.enginelib.Engine.engine_type"><code class="xref py py-obj docutils literal notranslate"><span class="pre">engine_type</span></code></a> of an engine
+determines which <a class="reference internal" href="../../src/searx.search.processors.html#searx-search-processors"><span class="std std-ref">search processor</span></a> is used by
+the engine.</p>
+<p>In this section a list of the engines that are documented is given, a complete
+list of the engines can be found in the source under: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines">git://searx/engines</a>.</p>
+<section id="online-engines">
+<span id="id2"></span><h3><a class="toc-backref" href="#id8" role="doc-backlink">Online Engines</a><a class="headerlink" href="#online-engines" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../src/searx.search.processors.html#module-searx.search.processors.online" title="searx.search.processors.online"><code class="xref py py-obj docutils literal notranslate"><span class="pre">processors.online</span></code></a></p></li>
+</ul>
+</aside>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l1"><a class="reference internal" href="xpath.html">XPath Engine</a></li>
+<li class="toctree-l1"><a class="reference internal" href="mediawiki.html">MediaWiki Engine</a></li>
+</ul>
+</div>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="online/annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/archlinux.html">Arch Linux</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/bing.html">Bing Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/bpb.html">Bpb</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/brave.html">Brave Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/bt4g.html">BT4G</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/google.html">Google Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/lemmy.html">Lemmy</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/loc.html">Library of Congress</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/mastodon.html">Mastodon</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/odysee.html">Odysee</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/peertube.html">Peertube Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/piped.html">Piped</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/presearch.html">Presearch Engine</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/qwant.html">Qwant</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/recoll.html">Recoll Engine</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/seekr.html">Seekr Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/startpage.html">Startpage Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/void.html">Void Linux binary packages</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/yacy.html">Yacy</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l1"><a class="reference internal" href="online/zlibrary.html">Z-Library</a></li>
+</ul>
+</div>
+</section>
+<section id="offline-engines">
+<span id="id3"></span><h3><a class="toc-backref" href="#id9" role="doc-backlink">Offline Engines</a><a class="headerlink" href="#offline-engines" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../src/searx.search.processors.html#module-searx.search.processors.offline" title="searx.search.processors.offline"><code class="xref py py-obj docutils literal notranslate"><span class="pre">processors.offline</span></code></a></p></li>
+</ul>
+</aside>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="offline_concept.html">Offline Concept</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demo/demo_offline.html">Demo Offline Engine</a></li>
+<li class="toctree-l1"><a class="reference internal" href="offline/command-line-engines.html">Command Line Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="offline/nosql-engines.html">NoSQL databases</a></li>
+<li class="toctree-l1"><a class="reference internal" href="offline/search-indexer-engines.html">Local Search APIs</a></li>
+<li class="toctree-l1"><a class="reference internal" href="offline/sql-engines.html">SQL Engines</a></li>
+</ul>
+</div>
+</section>
+<section id="online-url-search">
+<span id="id4"></span><h3><a class="toc-backref" href="#id10" role="doc-backlink">Online URL Search</a><a class="headerlink" href="#online-url-search" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../src/searx.search.processors.html#module-searx.search.processors.online_url_search" title="searx.search.processors.online_url_search"><code class="xref py py-obj docutils literal notranslate"><span class="pre">processors.online_url_search</span></code></a></p></li>
+</ul>
+</aside>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="online_url_search/tineye.html">Tineye</a></li>
+</ul>
+</div>
+</section>
+<section id="online-currency">
+<span id="id5"></span><h3><a class="toc-backref" href="#id11" role="doc-backlink">Online Currency</a><a class="headerlink" href="#online-currency" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../src/searx.search.processors.html#module-searx.search.processors.online_currency" title="searx.search.processors.online_currency"><code class="xref py py-obj docutils literal notranslate"><span class="pre">processors.online_currency</span></code></a></p></li>
+</ul>
+</aside>
+<p><em>no engine of this type is documented yet / comming soon</em></p>
+</section>
+<section id="online-dictionary">
+<span id="id6"></span><h3><a class="toc-backref" href="#id12" role="doc-backlink">Online Dictionary</a><a class="headerlink" href="#online-dictionary" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../src/searx.search.processors.html#module-searx.search.processors.online_dictionary" title="searx.search.processors.online_dictionary"><code class="xref py py-obj docutils literal notranslate"><span class="pre">processors.online_dictionary</span></code></a></p></li>
+</ul>
+</aside>
+<p><em>no engine of this type is documented yet / comming soon</em></p>
+</section>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Engine Implementations</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#engine-types">Engine Types</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#online-engines">Online Engines</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#offline-engines">Offline Engines</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="offline_concept.html">Offline Concept</a></li>
+<li class="toctree-l5"><a class="reference internal" href="demo/demo_offline.html">Demo Offline Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/command-line-engines.html">Command Line Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/nosql-engines.html">NoSQL databases</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/search-indexer-engines.html">Local Search APIs</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/sql-engines.html">SQL Engines</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#online-url-search">Online URL Search</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="online_url_search/tineye.html">Tineye</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="../contribution_guide.html" title="previous chapter">How to contribute</a>
+ <li>Next: <a href="enginelib.html" title="next chapter">Engine Library</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/engines/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/mediawiki.html b/dev/engines/mediawiki.html
new file mode 100644
index 000000000..5d6834f65
--- /dev/null
+++ b/dev/engines/mediawiki.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>MediaWiki Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="Anna’s Archive" href="online/annas_archive.html" />
+ <link rel="prev" title="XPath Engine" href="xpath.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="online/annas_archive.html" title="Anna’s Archive"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="xpath.html" title="XPath Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">MediaWiki Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="mediawiki-engine">
+<span id="id1"></span><h1>MediaWiki Engine<a class="headerlink" href="#mediawiki-engine" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id2">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.mediawiki">The MediaWiki engine is a <em>generic</em> engine to <strong>query</strong> Wikimedia wikis by
+the <a class="reference external" href="https://www.mediawiki.org/wiki/API:Main_page">MediaWiki Action API</a>. For a <a class="reference external" href="https://www.mediawiki.org/w/api.php?action=help&amp;modules=query">query action</a> all Wikimedia wikis have
+endpoints that follow this pattern:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>https://{base_url}/w/api.php?action=query&amp;list=search&amp;format=json
+</pre></div>
+</div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>In its actual state, this engine is implemented to parse JSON result
+(<a class="reference external" href="https://www.mediawiki.org/w/api.php?action=help&amp;modules=json">format=json</a>) from a search query (<a class="reference external" href="https://www.mediawiki.org/w/api.php?action=help&amp;modules=query%2Bsearch">list=search</a>). If you need other
+<code class="docutils literal notranslate"><span class="pre">action</span></code> and <code class="docutils literal notranslate"><span class="pre">list</span></code> types ask SearXNG developers to extend the
+implementation according to your needs.</p>
+</div>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>Request:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.mediawiki.base_url" title="searx.engines.mediawiki.base_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">base_url</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.mediawiki.search_type" title="searx.engines.mediawiki.search_type"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_type</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.mediawiki.srenablerewrites" title="searx.engines.mediawiki.srenablerewrites"><code class="xref py py-obj docutils literal notranslate"><span class="pre">srenablerewrites</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.mediawiki.srsort" title="searx.engines.mediawiki.srsort"><code class="xref py py-obj docutils literal notranslate"><span class="pre">srsort</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.mediawiki.srprop" title="searx.engines.mediawiki.srprop"><code class="xref py py-obj docutils literal notranslate"><span class="pre">srprop</span></code></a></p></li>
+</ul>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.mediawiki.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mediawiki.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://{language}.wikipedia.org/'</span></em><a class="headerlink" href="#searx.engines.mediawiki.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>Base URL of the Wikimedia wiki.</p>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">{language}</span></code>:</dt><dd><p>ISO 639-1 language code (en, de, fr ..) of the search language.</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.mediawiki.search_type">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mediawiki.</span></span><span class="sig-name descname"><span class="pre">search_type</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'nearmatch'</span></em><a class="headerlink" href="#searx.engines.mediawiki.search_type" title="Link to this definition">¶</a></dt>
+<dd><p>Which type of search to perform. One of the following values: <code class="docutils literal notranslate"><span class="pre">nearmatch</span></code>,
+<code class="docutils literal notranslate"><span class="pre">text</span></code> or <code class="docutils literal notranslate"><span class="pre">title</span></code>.</p>
+<p>See <code class="docutils literal notranslate"><span class="pre">srwhat</span></code> argument in <a class="reference external" href="https://www.mediawiki.org/w/api.php?action=help&amp;modules=query%2Bsearch">list=search</a> documentation.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.mediawiki.srenablerewrites">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mediawiki.</span></span><span class="sig-name descname"><span class="pre">srenablerewrites</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">True</span></em><a class="headerlink" href="#searx.engines.mediawiki.srenablerewrites" title="Link to this definition">¶</a></dt>
+<dd><p>Enable internal query rewriting (Type: boolean). Some search backends can
+rewrite the query into another which is thought to provide better results, for
+instance by correcting spelling errors.</p>
+<p>See <code class="docutils literal notranslate"><span class="pre">srenablerewrites</span></code> argument in <a class="reference external" href="https://www.mediawiki.org/w/api.php?action=help&amp;modules=query%2Bsearch">list=search</a> documentation.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.mediawiki.srprop">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mediawiki.</span></span><span class="sig-name descname"><span class="pre">srprop</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'sectiontitle|snippet|timestamp|categorysnippet'</span></em><a class="headerlink" href="#searx.engines.mediawiki.srprop" title="Link to this definition">¶</a></dt>
+<dd><p>Which properties to return.</p>
+<p>See <code class="docutils literal notranslate"><span class="pre">srprop</span></code> argument in <a class="reference external" href="https://www.mediawiki.org/w/api.php?action=help&amp;modules=query%2Bsearch">list=search</a> documentation.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.mediawiki.srsort">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mediawiki.</span></span><span class="sig-name descname"><span class="pre">srsort</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'relevance'</span></em><a class="headerlink" href="#searx.engines.mediawiki.srsort" title="Link to this definition">¶</a></dt>
+<dd><p>Set the sort order of returned results. One of the following values:
+<code class="docutils literal notranslate"><span class="pre">create_timestamp_asc</span></code>, <code class="docutils literal notranslate"><span class="pre">create_timestamp_desc</span></code>, <code class="docutils literal notranslate"><span class="pre">incoming_links_asc</span></code>,
+<code class="docutils literal notranslate"><span class="pre">incoming_links_desc</span></code>, <code class="docutils literal notranslate"><span class="pre">just_match</span></code>, <code class="docutils literal notranslate"><span class="pre">last_edit_asc</span></code>, <code class="docutils literal notranslate"><span class="pre">last_edit_desc</span></code>,
+<code class="docutils literal notranslate"><span class="pre">none</span></code>, <code class="docutils literal notranslate"><span class="pre">random</span></code>, <code class="docutils literal notranslate"><span class="pre">relevance</span></code>, <code class="docutils literal notranslate"><span class="pre">user_random</span></code>.</p>
+<p>See <code class="docutils literal notranslate"><span class="pre">srenablerewrites</span></code> argument in <a class="reference external" href="https://www.mediawiki.org/w/api.php?action=help&amp;modules=query%2Bsearch">list=search</a> documentation.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.mediawiki.timestamp_format">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mediawiki.</span></span><span class="sig-name descname"><span class="pre">timestamp_format</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'%Y-%m-%dT%H:%M:%SZ'</span></em><a class="headerlink" href="#searx.engines.mediawiki.timestamp_format" title="Link to this definition">¶</a></dt>
+<dd><p>The longhand version of MediaWiki time strings.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="xpath.html">XPath Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="xpath.html" title="previous chapter">XPath Engine</a>
+ <li>Next: <a href="online/annas_archive.html" title="next chapter">Anna’s Archive</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/engines/mediawiki.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/offline/command-line-engines.html b/dev/engines/offline/command-line-engines.html
new file mode 100644
index 000000000..51ae3d37f
--- /dev/null
+++ b/dev/engines/offline/command-line-engines.html
@@ -0,0 +1,252 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Command Line Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="NoSQL databases" href="nosql-engines.html" />
+ <link rel="prev" title="Demo Offline Engine" href="../demo/demo_offline.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="nosql-engines.html" title="NoSQL databases"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../demo/demo_offline.html" title="Demo Offline Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Command Line Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="command-line-engines">
+<span id="engine-command"></span><h1>Command Line Engines<a class="headerlink" href="#command-line-engines" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/command.py">command.py</a></p></li>
+<li><p><a class="reference internal" href="../index.html#offline-engines"><span class="std std-ref">Offline Engines</span></a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#example" id="id2">Example</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<p>Initial sponsored by <a class="reference external" href="https://nlnet.nl/discovery">Search and Discovery Fund</a> of <a class="reference external" href="https://nlnet.nl/">NLnet Foundation</a>.</p>
+</aside>
+<p id="module-searx.engines.command">With <em>command engines</em> administrators can run engines to integrate arbitrary
+shell commands.</p>
+<div class="admonition attention">
+<p class="admonition-title">Attention</p>
+<p>When creating and enabling a <code class="docutils literal notranslate"><span class="pre">command</span></code> engine on a public instance, you
+must be careful to avoid leaking private data.</p>
+</div>
+<p>The easiest solution is to limit the access by setting <code class="docutils literal notranslate"><span class="pre">tokens</span></code> as described
+in section <a class="reference internal" href="../../../admin/settings/settings_engine.html#private-engines"><span class="std std-ref">Private Engines (tokens)</span></a>. The engine base is flexible. Only your
+imagination can limit the power of this engine (and maybe security concerns).</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The following options are available:</p>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">command</span></code>:</dt><dd><p>A comma separated list of the elements of the command. A special token
+<code class="docutils literal notranslate"><span class="pre">{{QUERY}}</span></code> tells where to put the search terms of the user. Example:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">[</span><span class="s">&#39;ls&#39;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&#39;-l&#39;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&#39;-h&#39;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&#39;{{QUERY}}&#39;</span><span class="p p-Indicator">]</span>
+</pre></div>
+</div>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">delimiter</span></code>:</dt><dd><p>A mapping containing a delimiter <code class="docutils literal notranslate"><span class="pre">char</span></code> and the <em>titles</em> of each element in
+<code class="docutils literal notranslate"><span class="pre">keys</span></code>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">parse_regex</span></code>:</dt><dd><p>A dict containing the regular expressions for each result key.</p>
+</dd>
+</dl>
+<p><code class="docutils literal notranslate"><span class="pre">query_type</span></code>:</p>
+<blockquote>
+<div><p>The expected type of user search terms. Possible values: <code class="docutils literal notranslate"><span class="pre">path</span></code> and
+<code class="docutils literal notranslate"><span class="pre">enum</span></code>.</p>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">path</span></code>:</dt><dd><p>Checks if the user provided path is inside the working directory. If not,
+the query is not executed.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">enum</span></code>:</dt><dd><p>Is a list of allowed search terms. If the user submits something which is
+not included in the list, the query returns an error.</p>
+</dd>
+</dl>
+</div></blockquote>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">query_enum</span></code>:</dt><dd><p>A list containing allowed search terms if <code class="docutils literal notranslate"><span class="pre">query_type</span></code> is set to <code class="docutils literal notranslate"><span class="pre">enum</span></code>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">working_dir</span></code>:</dt><dd><p>The directory where the command has to be executed. Default: <code class="docutils literal notranslate"><span class="pre">./</span></code>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">result_separator</span></code>:</dt><dd><p>The character that separates results. Default: <code class="docutils literal notranslate"><span class="pre">\n</span></code>.</p>
+</dd>
+</dl>
+</section>
+<section id="example">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Example</a><a class="headerlink" href="#example" title="Link to this heading">¶</a></h2>
+<p>The example engine below can be used to find files with a specific name in the
+configured working directory:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">find</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">command</span>
+<span class="w"> </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&#39;find&#39;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&#39;.&#39;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&#39;-name&#39;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&#39;{{QUERY}}&#39;</span><span class="p p-Indicator">]</span>
+<span class="w"> </span><span class="nt">query_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">path</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">fnd</span>
+<span class="w"> </span><span class="nt">delimiter</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">chars</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="nv"> </span><span class="s">&#39;</span>
+<span class="w"> </span><span class="nt">keys</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&#39;line&#39;</span><span class="p p-Indicator">]</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.command.check_parsing_options">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.command.</span></span><span class="sig-name descname"><span class="pre">check_parsing_options</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_settings</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/command.html#check_parsing_options"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.command.check_parsing_options" title="Link to this definition">¶</a></dt>
+<dd><p>Checks if delimiter based parsing or regex parsing is configured correctly</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-engines">Online Engines</a></li>
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../offline_concept.html">Offline Concept</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_offline.html">Demo Offline Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Command Line Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="nosql-engines.html">NoSQL databases</a></li>
+<li class="toctree-l5"><a class="reference internal" href="search-indexer-engines.html">Local Search APIs</a></li>
+<li class="toctree-l5"><a class="reference internal" href="sql-engines.html">SQL Engines</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="../demo/demo_offline.html" title="previous chapter">Demo Offline Engine</a>
+ <li>Next: <a href="nosql-engines.html" title="next chapter">NoSQL databases</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/offline/command-line-engines.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/offline/nosql-engines.html b/dev/engines/offline/nosql-engines.html
new file mode 100644
index 000000000..1261bbc0e
--- /dev/null
+++ b/dev/engines/offline/nosql-engines.html
@@ -0,0 +1,303 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>NoSQL databases &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Local Search APIs" href="search-indexer-engines.html" />
+ <link rel="prev" title="Command Line Engines" href="command-line-engines.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="search-indexer-engines.html" title="Local Search APIs"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="command-line-engines.html" title="Command Line Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">NoSQL databases</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="nosql-databases">
+<span id="nosql-engines"></span><h1>NoSQL databases<a class="headerlink" href="#nosql-databases" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://en.wikipedia.org/wiki/NoSQL">NoSQL databases</a></p></li>
+<li><p><a class="reference external" href="https://redis.io/">redis.io</a></p></li>
+<li><p><a class="reference external" href="https://www.mongodb.com">MongoDB</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#extra-dependencies" id="id6">Extra Dependencies</a></p></li>
+<li><p><a class="reference internal" href="#configure-the-engines" id="id7">Configure the engines</a></p>
+<ul>
+<li><p><a class="reference internal" href="#redis-server" id="id8">Redis Server</a></p></li>
+<li><p><a class="reference internal" href="#engine-mongodb" id="id9">MongoDB</a></p></li>
+</ul>
+</li>
+</ul>
+</nav>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<p>Initial sponsored by <a class="reference external" href="https://nlnet.nl/discovery">Search and Discovery Fund</a> of <a class="reference external" href="https://nlnet.nl/">NLnet Foundation</a>.</p>
+</aside>
+<p>The following <a class="reference external" href="https://en.wikipedia.org/wiki/NoSQL">NoSQL databases</a> are supported:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#engine-redis-server"><span class="std std-ref">Redis Server</span></a></p></li>
+<li><p><a class="reference internal" href="#engine-mongodb"><span class="std std-ref">MongoDB</span></a></p></li>
+</ul>
+<p>All of the engines above are just commented out in the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">settings.yml</a>, as you have to set various options and install
+dependencies before using them.</p>
+<p>By default, the engines use the <code class="docutils literal notranslate"><span class="pre">key-value</span></code> template for displaying results /
+see <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/templates/simple/result_templates/key-value.html">simple</a>
+theme. If you are not satisfied with the original result layout, you can use
+your own template, set <code class="docutils literal notranslate"><span class="pre">result_template</span></code> attribute to <code class="docutils literal notranslate"><span class="pre">{template_name}</span></code> and
+place the templates at:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">searx</span><span class="o">/</span><span class="n">templates</span><span class="o">/</span><span class="p">{</span><span class="n">theme_name</span><span class="p">}</span><span class="o">/</span><span class="n">result_templates</span><span class="o">/</span><span class="p">{</span><span class="n">template_name</span><span class="p">}</span>
+</pre></div>
+</div>
+<p>Furthermore, if you do not wish to expose these engines on a public instance, you
+can still add them and limit the access by setting <code class="docutils literal notranslate"><span class="pre">tokens</span></code> as described in
+section <a class="reference internal" href="../../../admin/settings/settings_engine.html#private-engines"><span class="std std-ref">Private Engines (tokens)</span></a>.</p>
+<section id="extra-dependencies">
+<h2><a class="toc-backref" href="#id6" role="doc-backlink">Extra Dependencies</a><a class="headerlink" href="#extra-dependencies" title="Link to this heading">¶</a></h2>
+<p>For using <a class="reference internal" href="#engine-redis-server"><span class="std std-ref">Redis Server</span></a> or <a class="reference internal" href="#engine-mongodb"><span class="std std-ref">MongoDB</span></a> you need to
+install additional packages in Python’s Virtual Environment of your SearXNG
+instance. To switch into the environment (<a class="reference internal" href="../../../admin/installation-searxng.html#searxng-src"><span class="std std-ref">Install SearXNG &amp; dependencies</span></a>) you can use
+<a class="reference internal" href="../../../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo utils/searxng.sh instance cmd bash
+(searxng-pyenv)$ pip install ...
+</pre></div>
+</div>
+</section>
+<section id="configure-the-engines">
+<h2><a class="toc-backref" href="#id7" role="doc-backlink">Configure the engines</a><a class="headerlink" href="#configure-the-engines" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://en.wikipedia.org/wiki/NoSQL">NoSQL databases</a> are used for storing arbitrary data without first defining
+their structure.</p>
+<section id="redis-server">
+<span id="engine-redis-server"></span><h3><a class="toc-backref" href="#id8" role="doc-backlink">Redis Server</a><a class="headerlink" href="#redis-server" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code> <a class="reference external" href="https://github.com/andymccurdy/redis-py#installation">redis</a></p></li>
+<li><p><a class="reference external" href="https://redis.io/">redis.io</a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/redis_server.py">redis_server.py</a></p></li>
+</ul>
+</aside>
+<p id="module-searx.engines.redis_server">Redis is an open source (BSD licensed), in-memory data structure (key value
+based) store. Before configuring the <code class="docutils literal notranslate"><span class="pre">redis_server</span></code> engine, you must install
+the dependency <a class="reference external" href="https://github.com/andymccurdy/redis-py#installation">redis</a>.</p>
+<section id="configuration">
+<h4>Configuration<a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h4>
+<p>Select a database to search in and set its index in the option <code class="docutils literal notranslate"><span class="pre">db</span></code>. You can
+either look for exact matches or use partial keywords to find what you are
+looking for by configuring <code class="docutils literal notranslate"><span class="pre">exact_match_only</span></code>.</p>
+</section>
+<section id="example">
+<h4>Example<a class="headerlink" href="#example" title="Link to this heading">¶</a></h4>
+<p>Below is an example configuration:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="c1"># Required dependency: redis</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">myredis</span>
+<span class="w"> </span><span class="nt">shortcut </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">rds</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">redis_server</span>
+<span class="w"> </span><span class="nt">exact_match_only</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;127.0.0.1&#39;</span>
+<span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">6379</span>
+<span class="w"> </span><span class="nt">enable_http</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">password</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&#39;</span>
+<span class="w"> </span><span class="nt">db</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h4>Implementations<a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h4>
+</section>
+</section>
+<section id="engine-mongodb">
+<span id="id2"></span><h3><a class="toc-backref" href="#id9" role="doc-backlink">MongoDB</a><a class="headerlink" href="#engine-mongodb" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code> <a class="reference external" href="https://github.com/mongodb/mongo-python-driver#installation">pymongo</a></p></li>
+<li><p><a class="reference external" href="https://www.mongodb.com">MongoDB</a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/mongodb.py">mongodb.py</a></p></li>
+</ul>
+</aside>
+<p id="module-searx.engines.mongodb"><a class="reference external" href="https://www.mongodb.com">MongoDB</a> is a document based database program that handles JSON like data.
+Before configuring the <code class="docutils literal notranslate"><span class="pre">mongodb</span></code> engine, you must install the dependency
+<a class="reference external" href="https://github.com/mongodb/mongo-python-driver#installation">pymongo</a>.</p>
+<section id="id3">
+<h4>Configuration<a class="headerlink" href="#id3" title="Link to this heading">¶</a></h4>
+<p>In order to query <a class="reference external" href="https://www.mongodb.com">MongoDB</a>, you have to select a <code class="docutils literal notranslate"><span class="pre">database</span></code> and a
+<code class="docutils literal notranslate"><span class="pre">collection</span></code>. Furthermore, you have to select a <code class="docutils literal notranslate"><span class="pre">key</span></code> that is going to be
+searched. <a class="reference external" href="https://www.mongodb.com">MongoDB</a> also supports the option <code class="docutils literal notranslate"><span class="pre">exact_match_only</span></code>, so configure
+it as you wish.</p>
+</section>
+<section id="id4">
+<h4>Example<a class="headerlink" href="#id4" title="Link to this heading">¶</a></h4>
+<p>Below is an example configuration for using a MongoDB collection:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="c1"># MongoDB engine</span>
+<span class="c1"># Required dependency: pymongo</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mymongo</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mongodb</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">md</span>
+<span class="w"> </span><span class="nt">exact_match_only</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
+<span class="w"> </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;127.0.0.1&#39;</span>
+<span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">27017</span>
+<span class="w"> </span><span class="nt">enable_http</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">results_per_page</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">20</span>
+<span class="w"> </span><span class="nt">database</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;business&#39;</span>
+<span class="w"> </span><span class="nt">collection</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;reviews&#39;</span><span class="w"> </span><span class="c1"># name of the db collection</span>
+<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;name&#39;</span><span class="w"> </span><span class="c1"># key in the collection to search for</span>
+</pre></div>
+</div>
+</section>
+<section id="id5">
+<h4>Implementations<a class="headerlink" href="#id5" title="Link to this heading">¶</a></h4>
+</section>
+</section>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-engines">Online Engines</a></li>
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../offline_concept.html">Offline Concept</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_offline.html">Demo Offline Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="command-line-engines.html">Command Line Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">NoSQL databases</a></li>
+<li class="toctree-l5"><a class="reference internal" href="search-indexer-engines.html">Local Search APIs</a></li>
+<li class="toctree-l5"><a class="reference internal" href="sql-engines.html">SQL Engines</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="command-line-engines.html" title="previous chapter">Command Line Engines</a>
+ <li>Next: <a href="search-indexer-engines.html" title="next chapter">Local Search APIs</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/offline/nosql-engines.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/offline/search-indexer-engines.html b/dev/engines/offline/search-indexer-engines.html
new file mode 100644
index 000000000..137072a95
--- /dev/null
+++ b/dev/engines/offline/search-indexer-engines.html
@@ -0,0 +1,292 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Local Search APIs &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="SQL Engines" href="sql-engines.html" />
+ <link rel="prev" title="NoSQL databases" href="nosql-engines.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="sql-engines.html" title="SQL Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="nosql-engines.html" title="NoSQL databases"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Local Search APIs</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="local-search-apis">
+<h1>Local Search APIs<a class="headerlink" href="#local-search-apis" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://docs.meilisearch.com/learn/what_is_meilisearch/comparison_to_alternatives.html">Comparison to alternatives</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.engines.meilisearch" id="id6">MeiliSearch</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.elasticsearch" id="id7">Elasticsearch</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.solr" id="id8">Solr</a></p></li>
+</ul>
+</nav>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<p>Initial sponsored by <a class="reference external" href="https://nlnet.nl/discovery">Search and Discovery Fund</a> of <a class="reference external" href="https://nlnet.nl/">NLnet Foundation</a>.</p>
+</aside>
+<p>Administrators might find themselves wanting to integrate locally running search
+engines. The following ones are supported for now:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.elastic.co/elasticsearch/">Elasticsearch</a></p></li>
+<li><p><a class="reference external" href="https://www.meilisearch.com">Meilisearch</a></p></li>
+<li><p><a class="reference external" href="https://solr.apache.org">Solr</a></p></li>
+</ul>
+<p>Each search engine is powerful, capable of full-text search. All of the engines
+above are added to <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code> just commented out, as you have to
+<code class="docutils literal notranslate"><span class="pre">base_url</span></code> for all them.</p>
+<p>Please note that if you are not using HTTPS to access these engines, you have to
+enable HTTP requests by setting <code class="docutils literal notranslate"><span class="pre">enable_http</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code>.</p>
+<p>Furthermore, if you do not want to expose these engines on a public instance,
+you can still add them and limit the access by setting <code class="docutils literal notranslate"><span class="pre">tokens</span></code> as described
+in section <a class="reference internal" href="../../../admin/settings/settings_engine.html#private-engines"><span class="std std-ref">Private Engines (tokens)</span></a>.</p>
+<section id="module-searx.engines.meilisearch">
+<span id="meilisearch"></span><span id="engine-meilisearch"></span><h2><a class="toc-backref" href="#id6" role="doc-backlink">MeiliSearch</a><a class="headerlink" href="#module-searx.engines.meilisearch" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/meilisearch.py">meilisearch.py</a></p></li>
+<li><p><a class="reference external" href="https://www.meilisearch.com">MeiliSearch</a></p></li>
+<li><p><a class="reference external" href="https://docs.meilisearch.com/">MeiliSearch Documentation</a></p></li>
+<li><p><a class="reference external" href="https://docs.meilisearch.com/learn/getting_started/installation.html">Install MeiliSearch</a></p></li>
+</ul>
+</aside>
+<p><a class="reference external" href="https://www.meilisearch.com">MeiliSearch</a> is aimed at individuals and small companies. It is designed for
+small-scale (less than 10 million documents) data collections. E.g. it is great
+for storing web pages you have visited and searching in the contents later.</p>
+<p>The engine supports faceted search, so you can search in a subset of documents
+of the collection. Furthermore, you can search in <a class="reference external" href="https://www.meilisearch.com">MeiliSearch</a> instances that
+require authentication by setting <code class="docutils literal notranslate"><span class="pre">auth_token</span></code>.</p>
+<section id="example">
+<h3>Example<a class="headerlink" href="#example" title="Link to this heading">¶</a></h3>
+<p>Here is a simple example to query a Meilisearch instance:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">meilisearch</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">meilisearch</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mes</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://localhost:7700</span>
+<span class="w"> </span><span class="nt">index</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my-index</span>
+<span class="w"> </span><span class="nt">enable_http</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+</pre></div>
+</div>
+</section>
+</section>
+<section id="module-searx.engines.elasticsearch">
+<span id="elasticsearch"></span><span id="engine-elasticsearch"></span><h2><a class="toc-backref" href="#id7" role="doc-backlink">Elasticsearch</a><a class="headerlink" href="#module-searx.engines.elasticsearch" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/elasticsearch.py">elasticsearch.py</a></p></li>
+<li><p><a class="reference external" href="https://www.elastic.co/elasticsearch/">Elasticsearch</a></p></li>
+<li><p><a class="reference external" href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">Elasticsearch Guide</a></p></li>
+<li><p><a class="reference external" href="https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html">Install Elasticsearch</a></p></li>
+</ul>
+</aside>
+<p><a class="reference external" href="https://www.elastic.co/elasticsearch/">Elasticsearch</a> supports numerous ways to query the data it is storing. At the
+moment the engine supports the most popular search methods (<code class="docutils literal notranslate"><span class="pre">query_type</span></code>):</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">match</span></code>,</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">simple_query_string</span></code>,</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">term</span></code> and</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">terms</span></code>.</p></li>
+</ul>
+<p>If none of the methods fit your use case, you can select <code class="docutils literal notranslate"><span class="pre">custom</span></code> query type
+and provide the JSON payload to submit to Elasticsearch in
+<code class="docutils literal notranslate"><span class="pre">custom_query_json</span></code>.</p>
+<section id="id3">
+<h3>Example<a class="headerlink" href="#id3" title="Link to this heading">¶</a></h3>
+<p>The following is an example configuration for an <a class="reference external" href="https://www.elastic.co/elasticsearch/">Elasticsearch</a> instance with
+authentication configured to read from <code class="docutils literal notranslate"><span class="pre">my-index</span></code> index.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">elasticsearch</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">es</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">elasticsearch</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://localhost:9200</span>
+<span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">elastic</span>
+<span class="w"> </span><span class="nt">password</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">changeme</span>
+<span class="w"> </span><span class="nt">index</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my-index</span>
+<span class="w"> </span><span class="nt">query_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">match</span>
+<span class="w"> </span><span class="c1"># custom_query_json: &#39;{ ... }&#39;</span>
+<span class="w"> </span><span class="nt">enable_http</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+</pre></div>
+</div>
+</section>
+</section>
+<section id="module-searx.engines.solr">
+<span id="solr"></span><span id="engine-solr"></span><h2><a class="toc-backref" href="#id8" role="doc-backlink">Solr</a><a class="headerlink" href="#module-searx.engines.solr" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/solr.py">solr.py</a></p></li>
+<li><p><a class="reference external" href="https://solr.apache.org">Solr</a></p></li>
+<li><p><a class="reference external" href="https://solr.apache.org/resources.html">Solr Resources</a></p></li>
+<li><p><a class="reference external" href="https://solr.apache.org/guide/installing-solr.html">Install Solr</a></p></li>
+</ul>
+</aside>
+<p><a class="reference external" href="https://solr.apache.org">Solr</a> is a popular search engine based on Lucene, just like <a class="reference external" href="https://www.elastic.co/elasticsearch/">Elasticsearch</a>. But
+instead of searching in indices, you can search in collections.</p>
+<section id="id5">
+<h3>Example<a class="headerlink" href="#id5" title="Link to this heading">¶</a></h3>
+<p>This is an example configuration for searching in the collection
+<code class="docutils literal notranslate"><span class="pre">my-collection</span></code> and get the results in ascending order.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">solr</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">solr</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">slr</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://localhost:8983</span>
+<span class="w"> </span><span class="nt">collection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my-collection</span>
+<span class="w"> </span><span class="nt">sort</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">asc</span>
+<span class="w"> </span><span class="nt">enable_http</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+</pre></div>
+</div>
+</section>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-engines">Online Engines</a></li>
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../offline_concept.html">Offline Concept</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_offline.html">Demo Offline Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="command-line-engines.html">Command Line Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="nosql-engines.html">NoSQL databases</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Local Search APIs</a></li>
+<li class="toctree-l5"><a class="reference internal" href="sql-engines.html">SQL Engines</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="nosql-engines.html" title="previous chapter">NoSQL databases</a>
+ <li>Next: <a href="sql-engines.html" title="next chapter">SQL Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/offline/search-indexer-engines.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/offline/sql-engines.html b/dev/engines/offline/sql-engines.html
new file mode 100644
index 000000000..33ddd7b02
--- /dev/null
+++ b/dev/engines/offline/sql-engines.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>SQL Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Tineye" href="../online_url_search/tineye.html" />
+ <link rel="prev" title="Local Search APIs" href="search-indexer-engines.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../online_url_search/tineye.html" title="Tineye"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="search-indexer-engines.html" title="Local Search APIs"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">SQL Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="sql-engines">
+<span id="id1"></span><h1>SQL Engines<a class="headerlink" href="#sql-engines" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.sqlite.org/index.html">SQLite</a></p></li>
+<li><p><a class="reference external" href="https://www.postgresql.org">PostgreSQL</a></p></li>
+<li><p><a class="reference external" href="https://www.mysql.com">MySQL</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#extra-dependencies" id="id9">Extra Dependencies</a></p></li>
+<li><p><a class="reference internal" href="#configure-the-engines" id="id10">Configure the engines</a></p>
+<ul>
+<li><p><a class="reference internal" href="#engine-sqlite" id="id11">SQLite</a></p></li>
+<li><p><a class="reference internal" href="#engine-postgresql" id="id12">PostgreSQL</a></p></li>
+<li><p><a class="reference internal" href="#engine-mysql-server" id="id13">MySQL</a></p></li>
+</ul>
+</li>
+</ul>
+</nav>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<p>Initial sponsored by <a class="reference external" href="https://nlnet.nl/discovery">Search and Discovery Fund</a> of <a class="reference external" href="https://nlnet.nl/">NLnet Foundation</a>.</p>
+</aside>
+<p>With the <em>SQL engines</em> you can bind SQL databases into SearXNG. The following
+Relational Database Management System (RDBMS) are supported:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#engine-sqlite"><span class="std std-ref">SQLite</span></a></p></li>
+<li><p><a class="reference internal" href="#engine-postgresql"><span class="std std-ref">PostgreSQL</span></a></p></li>
+<li><p><a class="reference internal" href="#engine-mysql-server"><span class="std std-ref">MySQL</span></a></p></li>
+</ul>
+<p>All of the engines above are just commented out in the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">settings.yml</a>, as you have to set the required attributes for the
+engines, e.g. <code class="docutils literal notranslate"><span class="pre">database:</span></code> …</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">{</span><span class="nv">sqlite|postgresql|mysql_server</span><span class="p p-Indicator">}</span>
+<span class="w"> </span><span class="nt">database</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">result_template</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">{</span><span class="nv">template_name</span><span class="p p-Indicator">}</span>
+<span class="w"> </span><span class="nt">query_str</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+<p>By default, the engines use the <code class="docutils literal notranslate"><span class="pre">key-value</span></code> template for displaying results /
+see <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/templates/simple/result_templates/key-value.html">simple</a>
+theme. If you are not satisfied with the original result layout, you can use
+your own template, set <code class="docutils literal notranslate"><span class="pre">result_template</span></code> attribute to <code class="docutils literal notranslate"><span class="pre">{template_name}</span></code> and
+place the templates at:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">searx</span><span class="o">/</span><span class="n">templates</span><span class="o">/</span><span class="p">{</span><span class="n">theme_name</span><span class="p">}</span><span class="o">/</span><span class="n">result_templates</span><span class="o">/</span><span class="p">{</span><span class="n">template_name</span><span class="p">}</span>
+</pre></div>
+</div>
+<p>If you do not wish to expose these engines on a public instance, you can still
+add them and limit the access by setting <code class="docutils literal notranslate"><span class="pre">tokens</span></code> as described in section
+<a class="reference internal" href="../../../admin/settings/settings_engine.html#private-engines"><span class="std std-ref">Private Engines (tokens)</span></a>.</p>
+<section id="extra-dependencies">
+<h2><a class="toc-backref" href="#id9" role="doc-backlink">Extra Dependencies</a><a class="headerlink" href="#extra-dependencies" title="Link to this heading">¶</a></h2>
+<p>For using <a class="reference internal" href="#engine-postgresql"><span class="std std-ref">PostgreSQL</span></a> or <a class="reference internal" href="#engine-mysql-server"><span class="std std-ref">MySQL</span></a> you need to
+install additional packages in Python’s Virtual Environment of your SearXNG
+instance. To switch into the environment (<a class="reference internal" href="../../../admin/installation-searxng.html#searxng-src"><span class="std std-ref">Install SearXNG &amp; dependencies</span></a>) you can use
+<a class="reference internal" href="../../../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo utils/searxng.sh instance cmd bash
+(searxng-pyenv)$ pip install ...
+</pre></div>
+</div>
+</section>
+<section id="configure-the-engines">
+<h2><a class="toc-backref" href="#id10" role="doc-backlink">Configure the engines</a><a class="headerlink" href="#configure-the-engines" title="Link to this heading">¶</a></h2>
+<p>The configuration of the new database engines are similar. You must put a valid
+SQL-SELECT query in <code class="docutils literal notranslate"><span class="pre">query_str</span></code>. At the moment you can only bind at most one
+parameter in your query. By setting the attribute <code class="docutils literal notranslate"><span class="pre">limit</span></code> you can define how
+many results you want from the SQL server. Basically, it is the same as the
+<code class="docutils literal notranslate"><span class="pre">LIMIT</span></code> keyword in SQL.</p>
+<p>Please, do not include <code class="docutils literal notranslate"><span class="pre">LIMIT</span></code> or <code class="docutils literal notranslate"><span class="pre">OFFSET</span></code> in your SQL query as the engines
+rely on these keywords during paging. If you want to configure the number of
+returned results use the option <code class="docutils literal notranslate"><span class="pre">limit</span></code>.</p>
+<section id="engine-sqlite">
+<span id="id2"></span><h3><a class="toc-backref" href="#id11" role="doc-backlink">SQLite</a><a class="headerlink" href="#engine-sqlite" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/sqlite.py">sqlite.py</a></p></li>
+</ul>
+</aside>
+<p id="module-searx.engines.sqlite">SQLite is a small, fast and reliable SQL database engine. It does not require
+any extra dependency.</p>
+<section id="example">
+<h4>Example<a class="headerlink" href="#example" title="Link to this heading">¶</a></h4>
+<p>To demonstrate the power of database engines, here is a more complex example
+which reads from a <a class="reference external" href="https://mediathekview.de/">MediathekView</a> (DE) movie database. For this example of the
+SQLite engine download the database:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://liste.mediathekview.de/filmliste-v2.db.bz2">https://liste.mediathekview.de/filmliste-v2.db.bz2</a></p></li>
+</ul>
+<p>and unpack into <code class="docutils literal notranslate"><span class="pre">searx/data/filmliste-v2.db</span></code>. To search the database use e.g
+Query to test: <code class="docutils literal notranslate"><span class="pre">!mediathekview</span> <span class="pre">concert</span></code></p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mediathekview</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sqlite</span>
+<span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">False</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">general</span>
+<span class="w"> </span><span class="nt">result_template</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">default.html</span>
+<span class="w"> </span><span class="nt">database</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">searx/data/filmliste-v2.db</span>
+<span class="w"> </span><span class="nt">query_str</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">&gt;-</span>
+<span class="w"> </span><span class="no">SELECT title || &#39; (&#39; || time(duration, &#39;unixepoch&#39;) || &#39;)&#39; AS title,</span>
+<span class="w"> </span><span class="no">COALESCE( NULLIF(url_video_hd,&#39;&#39;), NULLIF(url_video_sd,&#39;&#39;), url_video) AS url,</span>
+<span class="w"> </span><span class="no">description AS content</span>
+<span class="w"> </span><span class="no">FROM film</span>
+<span class="w"> </span><span class="no">WHERE title LIKE :wildcard OR description LIKE :wildcard</span>
+<span class="w"> </span><span class="no">ORDER BY duration DESC</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h4>Implementations<a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h4>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.sqlite.sqlite_cursor">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.sqlite.</span></span><span class="sig-name descname"><span class="pre">sqlite_cursor</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/sqlite.html#sqlite_cursor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.sqlite.sqlite_cursor" title="Link to this definition">¶</a></dt>
+<dd><p>Implements a <a class="reference external" href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Context</span> <span class="pre">Manager</span></code></a> for a
+<a class="reference external" href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sqlite3.Cursor</span></code></a>.</p>
+<p>Open database in read only mode: if the database doesn’t exist. The default
+mode creates an empty file on the file system. See:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://docs.python.org/3/library/sqlite3.html#sqlite3.connect">https://docs.python.org/3/library/sqlite3.html#sqlite3.connect</a></p></li>
+<li><p><a class="reference external" href="https://www.sqlite.org/uri.html">https://www.sqlite.org/uri.html</a></p></li>
+</ul>
+</dd></dl>
+
+</section>
+<section id="engine-postgresql">
+<span id="id3"></span><h3><a class="toc-backref" href="#id12" role="doc-backlink">PostgreSQL</a><a class="headerlink" href="#engine-postgresql" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/postgresql.py">postgresql.py</a></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code> <a class="reference external" href="psycopg2">psycopg2-binary</a></p></li>
+</ul>
+</aside>
+<p id="module-searx.engines.postgresql">PostgreSQL is a powerful and robust open source database. Before configuring
+the PostgreSQL engine, you must install the dependency <code class="docutils literal notranslate"><span class="pre">psychopg2</span></code>.</p>
+<section id="id4">
+<h4>Example<a class="headerlink" href="#id4" title="Link to this heading">¶</a></h4>
+<p>Below is an example configuration:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my_database</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">postgresql</span>
+<span class="w"> </span><span class="nt">database</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my_database</span>
+<span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">searxng</span>
+<span class="w"> </span><span class="nt">password</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">password</span>
+<span class="w"> </span><span class="nt">query_str</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;SELECT</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">my_table</span><span class="nv"> </span><span class="s">WHERE</span><span class="nv"> </span><span class="s">my_column</span><span class="nv"> </span><span class="s">=</span><span class="nv"> </span><span class="s">%(query)s&#39;</span>
+</pre></div>
+</div>
+</section>
+<section id="id5">
+<h4>Implementations<a class="headerlink" href="#id5" title="Link to this heading">¶</a></h4>
+</section>
+</section>
+<section id="engine-mysql-server">
+<span id="id6"></span><h3><a class="toc-backref" href="#id13" role="doc-backlink">MySQL</a><a class="headerlink" href="#engine-mysql-server" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/mysql_server.py">mysql_server.py</a></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code> <a class="reference external" href="https://pypi.org/project/mysql-connector-python">mysql-connector-python</a></p></li>
+</ul>
+</aside>
+<p id="module-searx.engines.mysql_server">MySQL is said to be the most popular open source database. Before enabling
+MySQL engine, you must install the package <code class="docutils literal notranslate"><span class="pre">mysql-connector-python</span></code>.</p>
+<p>The authentication plugin is configurable by setting <code class="docutils literal notranslate"><span class="pre">auth_plugin</span></code> in the
+attributes. By default it is set to <code class="docutils literal notranslate"><span class="pre">caching_sha2_password</span></code>.</p>
+<section id="id7">
+<h4>Example<a class="headerlink" href="#id7" title="Link to this heading">¶</a></h4>
+<p>This is an example configuration for querying a MySQL server:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my_database</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mysql_server</span>
+<span class="w"> </span><span class="nt">database</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my_database</span>
+<span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">searxng</span>
+<span class="w"> </span><span class="nt">password</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">password</span>
+<span class="w"> </span><span class="nt">limit</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5</span>
+<span class="w"> </span><span class="nt">query_str</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;SELECT</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">my_table</span><span class="nv"> </span><span class="s">WHERE</span><span class="nv"> </span><span class="s">my_column=%(query)s&#39;</span>
+</pre></div>
+</div>
+</section>
+<section id="id8">
+<h4>Implementations<a class="headerlink" href="#id8" title="Link to this heading">¶</a></h4>
+</section>
+</section>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-engines">Online Engines</a></li>
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../offline_concept.html">Offline Concept</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_offline.html">Demo Offline Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="command-line-engines.html">Command Line Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="nosql-engines.html">NoSQL databases</a></li>
+<li class="toctree-l5"><a class="reference internal" href="search-indexer-engines.html">Local Search APIs</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">SQL Engines</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="search-indexer-engines.html" title="previous chapter">Local Search APIs</a>
+ <li>Next: <a href="../online_url_search/tineye.html" title="next chapter">Tineye</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/offline/sql-engines.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/offline_concept.html b/dev/engines/offline_concept.html
new file mode 100644
index 000000000..908e34dc2
--- /dev/null
+++ b/dev/engines/offline_concept.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Offline Concept &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="Demo Offline Engine" href="demo/demo_offline.html" />
+ <link rel="prev" title="Z-Library" href="online/zlibrary.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="demo/demo_offline.html" title="Demo Offline Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="online/zlibrary.html" title="Z-Library"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Offline Concept</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="offline-concept">
+<h1>Offline Concept<a class="headerlink" href="#offline-concept" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">offline engines</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="demo/demo_offline.html#demo-offline-engine"><span class="std std-ref">Demo Offline Engine</span></a></p></li>
+<li><p><a class="reference internal" href="offline/command-line-engines.html#engine-command"><span class="std std-ref">Command Line Engines</span></a></p></li>
+<li><p><a class="reference internal" href="offline/sql-engines.html#sql-engines"><span class="std std-ref">SQL Engines</span></a></p></li>
+<li><p><a class="reference internal" href="offline/nosql-engines.html#nosql-engines"><span class="std std-ref">NoSQL databases</span></a></p></li>
+<li><p><a class="reference internal" href="../../src/searx.search.processors.html#module-searx.search.processors.offline" title="searx.search.processors.offline"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.search.processors.offline</span></code></a></p></li>
+</ul>
+</aside>
+<p>To extend the functionality of SearXNG, offline engines are going to be
+introduced. An offline engine is an engine which does not need Internet
+connection to perform a search and does not use HTTP to communicate.</p>
+<p>Offline engines can be configured, by adding those to the <cite>engines</cite> list of
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">settings.yml</a>. An example skeleton for offline
+engines can be found in <a class="reference internal" href="demo/demo_offline.html#demo-offline-engine"><span class="std std-ref">Demo Offline Engine</span></a> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/demo_offline.py">demo_offline.py</a>).</p>
+<section id="programming-interface">
+<h2>Programming Interface<a class="headerlink" href="#programming-interface" title="Link to this heading">¶</a></h2>
+<dl>
+<dt><a class="reference internal" href="demo/demo_offline.html#searx.engines.demo_offline.init" title="searx.engines.demo_offline.init"><code class="xref py py-func docutils literal notranslate"><span class="pre">init(engine_settings=None)</span></code></a></dt><dd><p>All offline engines can have their own init function to setup the engine before
+accepting requests. The function gets the settings from settings.yml as a
+parameter. This function can be omitted, if there is no need to setup anything
+in advance.</p>
+</dd>
+<dt><code class="xref py py-func docutils literal notranslate"><span class="pre">search(query,</span> <span class="pre">params)</span></code></dt><dd><p>Each offline engine has a function named <code class="docutils literal notranslate"><span class="pre">search</span></code>. This function is
+responsible to perform a search and return the results in a presentable
+format. (Where <em>presentable</em> means presentable by the selected result
+template.)</p>
+<p>The return value is a list of results retrieved by the engine.</p>
+</dd>
+<dt>Engine representation in <code class="docutils literal notranslate"><span class="pre">/config</span></code></dt><dd><p>If an engine is offline, the attribute <code class="docutils literal notranslate"><span class="pre">offline</span></code> is set to <code class="docutils literal notranslate"><span class="pre">True</span></code>.</p>
+</dd>
+</dl>
+</section>
+<section id="extra-dependencies">
+<span id="offline-requirements"></span><h2>Extra Dependencies<a class="headerlink" href="#extra-dependencies" title="Link to this heading">¶</a></h2>
+<p>If an offline engine depends on an external tool, SearXNG does not install it by
+default. When an administrator configures such engine and starts the instance,
+the process returns an error with the list of missing dependencies. Also,
+required dependencies will be added to the comment/description of the engine, so
+admins can install packages in advance.</p>
+<p>If there is a need to install additional packages in <em>Python’s Virtual
+Environment</em> of your SearXNG instance you need to switch into the environment
+(<a class="reference internal" href="../../admin/installation-searxng.html#searxng-src"><span class="std std-ref">Install SearXNG &amp; dependencies</span></a>) first, for this you can use <a class="reference internal" href="../../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo utils/searxng.sh instance cmd bash
+(searxng-pyenv)$ pip install ...
+</pre></div>
+</div>
+</section>
+<section id="private-engines-security">
+<h2>Private engines (Security)<a class="headerlink" href="#private-engines-security" title="Link to this heading">¶</a></h2>
+<p>To limit the access to offline engines, if an instance is available publicly,
+administrators can set token(s) for each of the <a class="reference internal" href="../../admin/settings/settings_engine.html#private-engines"><span class="std std-ref">Private Engines (tokens)</span></a>. If a
+query contains a valid token, then SearXNG performs the requested private
+search. If not, requests from an offline engines return errors.</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-engines">Online Engines</a></li>
+<li class="toctree-l4 current"><a class="reference internal" href="index.html#offline-engines">Offline Engines</a><ul class="current">
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Offline Concept</a></li>
+<li class="toctree-l5"><a class="reference internal" href="demo/demo_offline.html">Demo Offline Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/command-line-engines.html">Command Line Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/nosql-engines.html">NoSQL databases</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/search-indexer-engines.html">Local Search APIs</a></li>
+<li class="toctree-l5"><a class="reference internal" href="offline/sql-engines.html">SQL Engines</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="online/zlibrary.html" title="previous chapter">Z-Library</a>
+ <li>Next: <a href="demo/demo_offline.html" title="next chapter">Demo Offline Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/engines/offline_concept.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/annas_archive.html b/dev/engines/online/annas_archive.html
new file mode 100644
index 000000000..4d6d5fb6b
--- /dev/null
+++ b/dev/engines/online/annas_archive.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Anna’s Archive &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Arch Linux" href="archlinux.html" />
+ <link rel="prev" title="MediaWiki Engine" href="../mediawiki.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="archlinux.html" title="Arch Linux"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../mediawiki.html" title="MediaWiki Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Anna’s Archive</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="anna-s-archive">
+<span id="annas-archive-engine"></span><h1>Anna’s Archive<a class="headerlink" href="#anna-s-archive" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id2">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.annas_archive"><a class="reference external" href="https://annas-archive.org/">Anna’s Archive</a> is a free non-profit online shadow library metasearch
+engine providing access to a variety of book resources (also via IPFS), created
+by a team of anonymous archivists (<a class="reference external" href="https://annas-software.org/AnnaArchivist/annas-archive">AnnaArchivist</a>).</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following additional settings:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.annas_archive.aa_content" title="searx.engines.annas_archive.aa_content"><code class="xref py py-obj docutils literal notranslate"><span class="pre">aa_content</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.annas_archive.aa_ext" title="searx.engines.annas_archive.aa_ext"><code class="xref py py-obj docutils literal notranslate"><span class="pre">aa_ext</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.annas_archive.aa_sort" title="searx.engines.annas_archive.aa_sort"><code class="xref py py-obj docutils literal notranslate"><span class="pre">aa_sort</span></code></a></p></li>
+</ul>
+<p>With this options a SearXNG maintainer is able to configure <strong>additional</strong>
+engines for specific searches in Anna’s Archive. For example a engine to search
+for <em>newest</em> articles and journals (PDF) / by shortcut <code class="docutils literal notranslate"><span class="pre">!aaa</span> <span class="pre">&lt;search-term&gt;</span></code>.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">annas articles</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">annas_archive</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">aaa</span>
+<span class="w"> </span><span class="nt">aa_content</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;magazine&#39;</span>
+<span class="w"> </span><span class="nt">aa_ext</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;pdf&#39;</span>
+<span class="w"> </span><span class="nt">aa_sort</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;newest&#39;</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.annas_archive.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.annas_archive.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/annas_archive.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.annas_archive.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages and other search arguments from Anna’s search form.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.annas_archive.init">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.annas_archive.</span></span><span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_settings</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/annas_archive.html#init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.annas_archive.init" title="Link to this definition">¶</a></dt>
+<dd><p>Check of engine’s settings.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.annas_archive.aa_content">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.annas_archive.</span></span><span class="sig-name descname"><span class="pre">aa_content</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.annas_archive.aa_content" title="Link to this definition">¶</a></dt>
+<dd><p>Anan’s search form field <strong>Content</strong> / possible values:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">book_fiction</span><span class="p">,</span> <span class="n">book_unknown</span><span class="p">,</span> <span class="n">book_nonfiction</span><span class="p">,</span>
+<span class="n">book_comic</span><span class="p">,</span> <span class="n">magazine</span><span class="p">,</span> <span class="n">standards_document</span>
+</pre></div>
+</div>
+<p>To not filter use an empty string (default).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.annas_archive.aa_ext">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.annas_archive.</span></span><span class="sig-name descname"><span class="pre">aa_ext</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.annas_archive.aa_ext" title="Link to this definition">¶</a></dt>
+<dd><p>Filter Anna’s results by a file ending. Common filters for example are
+<code class="docutils literal notranslate"><span class="pre">pdf</span></code> and <code class="docutils literal notranslate"><span class="pre">epub</span></code>.</p>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>Anna’s Archive is a beta release: Filter results by file extension does not
+really work on Anna’s Archive.</p>
+</div>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.annas_archive.aa_sort">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.annas_archive.</span></span><span class="sig-name descname"><span class="pre">aa_sort</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.annas_archive.aa_sort" title="Link to this definition">¶</a></dt>
+<dd><p>Sort Anna’s results, possible values:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">newest</span><span class="p">,</span> <span class="n">oldest</span><span class="p">,</span> <span class="n">largest</span><span class="p">,</span> <span class="n">smallest</span>
+</pre></div>
+</div>
+<p>To sort by <em>most relevant</em> use an empty string (default).</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="../mediawiki.html" title="previous chapter">MediaWiki Engine</a>
+ <li>Next: <a href="archlinux.html" title="next chapter">Arch Linux</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/annas_archive.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/archlinux.html b/dev/engines/online/archlinux.html
new file mode 100644
index 000000000..7353e0bd1
--- /dev/null
+++ b/dev/engines/online/archlinux.html
@@ -0,0 +1,224 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Arch Linux &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Bing Engines" href="bing.html" />
+ <link rel="prev" title="Anna’s Archive" href="annas_archive.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="bing.html" title="Bing Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="annas_archive.html" title="Anna’s Archive"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Arch Linux</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="arch-linux">
+<span id="archlinux-engine"></span><h1>Arch Linux<a class="headerlink" href="#arch-linux" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#arch-linux-wiki" id="id1">Arch Linux Wiki</a></p></li>
+</ul>
+</nav>
+<section id="arch-linux-wiki">
+<span id="module-searx.engines.archlinux"></span><h2><a class="toc-backref" href="#id1" role="doc-backlink">Arch Linux Wiki</a><a class="headerlink" href="#arch-linux-wiki" title="Link to this heading">¶</a></h2>
+<p>This implementation does not use a official API: Mediawiki provides API, but
+Arch Wiki blocks access to it.</p>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.archlinux.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.archlinux.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/archlinux.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.archlinux.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages from Archlinux-Wiki. The location of the Wiki address of a
+language is mapped in a <a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits.custom" title="searx.enginelib.traits.EngineTraits.custom"><code class="xref py py-obj docutils literal notranslate"><span class="pre">custom</span> <span class="pre">field</span></code></a> (<code class="docutils literal notranslate"><span class="pre">wiki_netloc</span></code>). Depending
+on the location, the <code class="docutils literal notranslate"><span class="pre">title</span></code> argument in the request is translated.</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="s2">&quot;custom&quot;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s2">&quot;wiki_netloc&quot;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s2">&quot;de&quot;</span><span class="p">:</span> <span class="s2">&quot;wiki.archlinux.de&quot;</span><span class="p">,</span>
+ <span class="c1"># ...</span>
+ <span class="s2">&quot;zh&quot;</span><span class="p">:</span> <span class="s2">&quot;wiki.archlinuxcn.org&quot;</span>
+ <span class="p">}</span>
+ <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s2">&quot;de&quot;</span><span class="p">:</span> <span class="s2">&quot;Spezial:Suche&quot;</span><span class="p">,</span>
+ <span class="c1"># ...</span>
+ <span class="s2">&quot;zh&quot;</span><span class="p">:</span> <span class="s2">&quot;Special:搜索&quot;</span>
+ <span class="p">},</span>
+<span class="p">},</span>
+</pre></div>
+</div>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="annas_archive.html" title="previous chapter">Anna’s Archive</a>
+ <li>Next: <a href="bing.html" title="next chapter">Bing Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/archlinux.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/bing.html b/dev/engines/online/bing.html
new file mode 100644
index 000000000..261f9ffc3
--- /dev/null
+++ b/dev/engines/online/bing.html
@@ -0,0 +1,343 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Bing Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Bpb" href="bpb.html" />
+ <link rel="prev" title="Arch Linux" href="archlinux.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="bpb.html" title="Bpb"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="archlinux.html" title="Arch Linux"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Bing Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="bing-engines">
+<span id="id1"></span><h1>Bing Engines<a class="headerlink" href="#bing-engines" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.engines.bing" id="id2">Bing WEB</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.bing_images" id="id3">Bing Images</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.bing_videos" id="id4">Bing Videos</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.bing_news" id="id5">Bing News</a></p></li>
+</ul>
+</nav>
+<section id="module-searx.engines.bing">
+<span id="bing-web"></span><span id="bing-web-engine"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Bing WEB</a><a class="headerlink" href="#module-searx.engines.bing" title="Link to this heading">¶</a></h2>
+<p>This is the implementation of the Bing-WEB engine. Some of this
+implementations are shared by other engines:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#bing-images-engine"><span class="std std-ref">Bing Images</span></a></p></li>
+<li><p><a class="reference internal" href="#bing-news-engine"><span class="std std-ref">Bing News</span></a></p></li>
+<li><p><a class="reference internal" href="#bing-videos-engine"><span class="std std-ref">Bing Videos</span></a></p></li>
+</ul>
+<p>On the <a class="reference external" href="https://www.bing.com/account/general">preference page</a> Bing offers a lot of languages an regions (see section
+LANGUAGE and COUNTRY/REGION). The Language is the language of the UI, we need
+in SearXNG to get the translations of data such as <em>“published last week”</em>.</p>
+<p>There is a description of the offical <a class="reference external" href="https://learn.microsoft.com/en-us/bing/search-apis/">search-APIs</a>, unfortunately this is not
+the API we can use or that bing itself would use. You can look up some things
+in the API to get a better picture of bing, but the value specifications like
+the market codes are usually outdated or at least no longer used by bing itself.</p>
+<p>The market codes have been harmonized and are identical for web, video and
+images. The news area has also been harmonized with the other categories. Only
+political adjustments still seem to be made – for example, there is no news
+category for the Chinese market.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages and regions from Bing-Web.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble a Bing-Web request.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://www.bing.com/search'</span></em><a class="headerlink" href="#searx.engines.bing.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>Bing (Web) search URL</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing.max_page">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing.</span></span><span class="sig-name descname"><span class="pre">max_page</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">200</span></em><a class="headerlink" href="#searx.engines.bing.max_page" title="Link to this definition">¶</a></dt>
+<dd><p>200 pages maximum (<code class="docutils literal notranslate"><span class="pre">&amp;first=1991</span></code>)</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing.safesearch">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing.</span></span><span class="sig-name descname"><span class="pre">safesearch</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">True</span></em><a class="headerlink" href="#searx.engines.bing.safesearch" title="Link to this definition">¶</a></dt>
+<dd><p>Bing results are always SFW. To get NSFW links from bing some age
+verification by a cookie is needed / thats not possible in SearXNG.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.bing_images">
+<span id="bing-images"></span><span id="bing-images-engine"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Bing Images</a><a class="headerlink" href="#module-searx.engines.bing_images" title="Link to this heading">¶</a></h2>
+<p>Bing-Images: description see <a class="reference internal" href="#module-searx.engines.bing" title="searx.engines.bing"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.engines.bing</span></code></a>.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing_images.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_images.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing_images.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing_images.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble a Bing-Image request.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing_images.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_images.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing_images.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing_images.response" title="Link to this definition">¶</a></dt>
+<dd><p>Get response from Bing-Images</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing_images.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_images.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://www.bing.com/images/async'</span></em><a class="headerlink" href="#searx.engines.bing_images.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>Bing (Images) search URL</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.bing_videos">
+<span id="bing-videos"></span><span id="bing-videos-engine"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Bing Videos</a><a class="headerlink" href="#module-searx.engines.bing_videos" title="Link to this heading">¶</a></h2>
+<p>Bing-Videos: description see <a class="reference internal" href="#module-searx.engines.bing" title="searx.engines.bing"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.engines.bing</span></code></a>.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing_videos.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_videos.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing_videos.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing_videos.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble a Bing-Video request.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing_videos.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_videos.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing_videos.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing_videos.response" title="Link to this definition">¶</a></dt>
+<dd><p>Get response from Bing-Video</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing_videos.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_videos.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://www.bing.com/videos/asyncv2'</span></em><a class="headerlink" href="#searx.engines.bing_videos.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>Bing (Videos) async search URL.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.bing_news">
+<span id="bing-news"></span><span id="bing-news-engine"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Bing News</a><a class="headerlink" href="#module-searx.engines.bing_news" title="Link to this heading">¶</a></h2>
+<p>Bing-News: description see <a class="reference internal" href="#module-searx.engines.bing" title="searx.engines.bing"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.engines.bing</span></code></a>.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>Bing News is <em>different</em> in some ways!</p>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing_news.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_news.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing_news.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing_news.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages and regions from Bing-News.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing_news.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_news.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing_news.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing_news.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble a Bing-News request.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.bing_news.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_news.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/bing_news.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.bing_news.response" title="Link to this definition">¶</a></dt>
+<dd><p>Get response from Bing-Video</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing_news.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_news.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://www.bing.com/news/infinitescrollajax'</span></em><a class="headerlink" href="#searx.engines.bing_news.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>Bing (News) search URL</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing_news.paging">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_news.</span></span><span class="sig-name descname"><span class="pre">paging</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">True</span></em><a class="headerlink" href="#searx.engines.bing_news.paging" title="Link to this definition">¶</a></dt>
+<dd><p>If go through the pages and there are actually no new results for another
+page, then bing returns the results from the last page again.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bing_news.time_map">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bing_news.</span></span><span class="sig-name descname"><span class="pre">time_map</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'day':</span> <span class="pre">'interval=&quot;4&quot;',</span> <span class="pre">'month':</span> <span class="pre">'interval=&quot;9&quot;',</span> <span class="pre">'week':</span> <span class="pre">'interval=&quot;7&quot;'}</span></em><a class="headerlink" href="#searx.engines.bing_news.time_map" title="Link to this definition">¶</a></dt>
+<dd><p>A string ‘4’ means <em>last hour</em>. We use <em>last hour</em> for <code class="docutils literal notranslate"><span class="pre">day</span></code> here since the
+difference of <em>last day</em> and <em>last week</em> in the result list is just marginally.
+Bing does not have news range <code class="docutils literal notranslate"><span class="pre">year</span></code> / we use <code class="docutils literal notranslate"><span class="pre">month</span></code> instead.</p>
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="archlinux.html" title="previous chapter">Arch Linux</a>
+ <li>Next: <a href="bpb.html" title="next chapter">Bpb</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/bing.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/bpb.html b/dev/engines/online/bpb.html
new file mode 100644
index 000000000..bb7735ac9
--- /dev/null
+++ b/dev/engines/online/bpb.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Bpb &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Brave Engines" href="brave.html" />
+ <link rel="prev" title="Bing Engines" href="bing.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="brave.html" title="Brave Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="bing.html" title="Bing Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Bpb</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="bpb">
+<span id="bpb-engine"></span><h1>Bpb<a class="headerlink" href="#bpb" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.bpb">BPB refers to <code class="docutils literal notranslate"><span class="pre">Bundeszentrale</span> <span class="pre">für</span> <span class="pre">poltische</span> <span class="pre">Bildung</span></code>, which is a German
+governmental institution aiming to reduce misinformation by providing resources
+about politics and history.</p>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="bing.html" title="previous chapter">Bing Engines</a>
+ <li>Next: <a href="brave.html" title="next chapter">Brave Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/bpb.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/brave.html b/dev/engines/online/brave.html
new file mode 100644
index 000000000..9aad64442
--- /dev/null
+++ b/dev/engines/online/brave.html
@@ -0,0 +1,341 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Brave Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="BT4G" href="bt4g.html" />
+ <link rel="prev" title="Bpb" href="bpb.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="bt4g.html" title="BT4G"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="bpb.html" title="Bpb"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Brave Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="brave-engines">
+<span id="brave-engine"></span><h1>Brave Engines<a class="headerlink" href="#brave-engines" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#brave-regions" id="id3">Brave regions</a></p></li>
+<li><p><a class="reference internal" href="#brave-goggles" id="id4">Brave Goggles</a></p></li>
+<li><p><a class="reference internal" href="#brave-languages" id="id5">Brave languages</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id6">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.brave">Brave supports the categories listed in <code class="xref py py-obj docutils literal notranslate"><span class="pre">brave_category</span></code> (General,
+news, videos, images). The support of <a class="reference internal" href="#searx.engines.brave.paging" title="searx.engines.brave.paging"><code class="xref py py-obj docutils literal notranslate"><span class="pre">paging</span></code></a> and <a class="reference internal" href="#searx.engines.brave.time_range_support" title="searx.engines.brave.time_range_support"><code class="xref py py-obj docutils literal notranslate"><span class="pre">time</span> <span class="pre">range</span></code></a> is limited (see remarks).</p>
+<p>Configured <code class="docutils literal notranslate"><span class="pre">brave</span></code> engines:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">brave_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">search</span>
+<span class="w"> </span><span class="nt">time_range_support</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">paging</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave.images</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">brave_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">images</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave.videos</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">brave_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">videos</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave.news</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">brave_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">news</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">brave.goggles</span>
+<span class="w"> </span><span class="nt">brave_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">goggles</span>
+<span class="w"> </span><span class="nt">time_range_support</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="nt">paging</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">brave_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">goggles</span>
+</pre></div>
+</div>
+<section id="brave-regions">
+<span id="id1"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Brave regions</a><a class="headerlink" href="#brave-regions" title="Link to this heading">¶</a></h2>
+<p>Brave uses two-digit tags for the regions like <code class="docutils literal notranslate"><span class="pre">ca</span></code> while SearXNG deals with
+locales. To get a mapping, all <em>officiat de-facto</em> languages of the Brave
+region are mapped to regions in SearXNG (see <a class="reference external" href="https://babel.readthedocs.io/en/latest/api/languages.html#babel.languages.get_official_languages" title="(in Babel v2.2)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">babel</span></code></a>):</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="s2">&quot;regions&quot;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="o">..</span>
+ <span class="s2">&quot;en-CA&quot;</span><span class="p">:</span> <span class="s2">&quot;ca&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;fr-CA&quot;</span><span class="p">:</span> <span class="s2">&quot;ca&quot;</span><span class="p">,</span>
+ <span class="o">..</span>
+ <span class="p">}</span>
+</pre></div>
+</div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>The language (aka region) support of Brave’s index is limited to very basic
+languages. The search results for languages like Chinese or Arabic are of
+low quality.</p>
+</div>
+</section>
+<section id="brave-goggles">
+<span id="brave-googles"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Brave Goggles</a><a class="headerlink" href="#brave-goggles" title="Link to this heading">¶</a></h2>
+<p>Goggles allow you to choose, alter, or extend the ranking of Brave Search
+results (<a class="reference external" href="https://brave.com/static-assets/files/goggles.pdf">Goggles Whitepaper</a>). Goggles are openly developed by the community
+of Brave Search users.</p>
+<p>Select from the <a class="reference external" href="https://search.brave.com/goggles/discover">list of Goggles</a> people have published, or create your own
+(<a class="reference external" href="https://github.com/brave/goggles-quickstart">Goggles Quickstart</a>).</p>
+</section>
+<section id="brave-languages">
+<span id="id2"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Brave languages</a><a class="headerlink" href="#brave-languages" title="Link to this heading">¶</a></h2>
+<p>Brave’s language support is limited to the UI (menus, area local notations,
+etc). Brave’s index only seems to support a locale, but it does not seem to
+support any languages in its index. The choice of available languages is very
+small (and its not clear to me where the difference in UI is when switching
+from en-us to en-ca or en-gb).</p>
+<p>In the <a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><code class="xref py py-obj docutils literal notranslate"><span class="pre">EngineTraits</span> <span class="pre">object</span></code></a> the
+UI languages are stored in a custom field named <code class="docutils literal notranslate"><span class="pre">ui_lang</span></code>:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="s2">&quot;custom&quot;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s2">&quot;ui_lang&quot;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s2">&quot;ca&quot;</span><span class="p">:</span> <span class="s2">&quot;ca&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;de-DE&quot;</span><span class="p">:</span> <span class="s2">&quot;de-de&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;en-CA&quot;</span><span class="p">:</span> <span class="s2">&quot;en-ca&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;en-GB&quot;</span><span class="p">:</span> <span class="s2">&quot;en-gb&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;en-US&quot;</span><span class="p">:</span> <span class="s2">&quot;en-us&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;es&quot;</span><span class="p">:</span> <span class="s2">&quot;es&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;fr-CA&quot;</span><span class="p">:</span> <span class="s2">&quot;fr-ca&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;fr-FR&quot;</span><span class="p">:</span> <span class="s2">&quot;fr-fr&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;ja-JP&quot;</span><span class="p">:</span> <span class="s2">&quot;ja-jp&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;pt-BR&quot;</span><span class="p">:</span> <span class="s2">&quot;pt-br&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;sq-AL&quot;</span><span class="p">:</span> <span class="s2">&quot;sq-al&quot;</span>
+ <span class="p">}</span>
+<span class="p">},</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id6" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.brave.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.brave.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/brave.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.brave.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch <a class="reference internal" href="#brave-languages"><span class="std std-ref">languages</span></a> and <a class="reference internal" href="#brave-regions"><span class="std std-ref">regions</span></a> from Brave.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.brave.Goggles">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.brave.</span></span><span class="sig-name descname"><span class="pre">Goggles</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">typing.Any</span></em><a class="headerlink" href="#searx.engines.brave.Goggles" title="Link to this definition">¶</a></dt>
+<dd><p>Brave supports common web-search, videos, images, news, and goggles search.</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">search</span></code>: Common WEB search</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">videos</span></code>: search for videos</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">images</span></code>: search for images</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">news</span></code>: search for news</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">goggles</span></code>: Common WEB search with custom rules</p></li>
+</ul>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.brave.brave_spellcheck">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.brave.</span></span><span class="sig-name descname"><span class="pre">brave_spellcheck</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.engines.brave.brave_spellcheck" title="Link to this definition">¶</a></dt>
+<dd><p>Brave supports some kind of spell checking. When activated, Brave tries to
+fix typos, e.g. it searches for <code class="docutils literal notranslate"><span class="pre">food</span></code> when the user queries for <code class="docutils literal notranslate"><span class="pre">fooh</span></code>. In
+the UI of Brave the user gets warned about this, since we can not warn the user
+in SearXNG, the spellchecking is disabled by default.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.brave.max_page">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.brave.</span></span><span class="sig-name descname"><span class="pre">max_page</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">10</span></em><a class="headerlink" href="#searx.engines.brave.max_page" title="Link to this definition">¶</a></dt>
+<dd><p>Tested 9 pages maximum (<code class="docutils literal notranslate"><span class="pre">&amp;offset=8</span></code>), to be save max is set to 10. Trying
+to do more won’t return any result and you will most likely be flagged as a bot.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.brave.paging">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.brave.</span></span><span class="sig-name descname"><span class="pre">paging</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.engines.brave.paging" title="Link to this definition">¶</a></dt>
+<dd><p>Brave only supports paging in <code class="xref py py-obj docutils literal notranslate"><span class="pre">brave_category</span></code> <code class="docutils literal notranslate"><span class="pre">search</span></code> (UI
+category All) and in the goggles category.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.brave.time_range_support">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.brave.</span></span><span class="sig-name descname"><span class="pre">time_range_support</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.engines.brave.time_range_support" title="Link to this definition">¶</a></dt>
+<dd><p>Brave only supports time-range in <code class="xref py py-obj docutils literal notranslate"><span class="pre">brave_category</span></code> <code class="docutils literal notranslate"><span class="pre">search</span></code> (UI
+category All) and in the goggles category.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="bpb.html" title="previous chapter">Bpb</a>
+ <li>Next: <a href="bt4g.html" title="next chapter">BT4G</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/brave.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/bt4g.html b/dev/engines/online/bt4g.html
new file mode 100644
index 000000000..ea9e4b6d3
--- /dev/null
+++ b/dev/engines/online/bt4g.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>BT4G &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Dailymotion" href="dailymotion.html" />
+ <link rel="prev" title="Brave Engines" href="brave.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="dailymotion.html" title="Dailymotion"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="brave.html" title="Brave Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">BT4G</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="bt4g">
+<span id="bt4g-engine"></span><h1>BT4G<a class="headerlink" href="#bt4g" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id2">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.bt4g"><a class="reference external" href="https://bt4g.com/">BT4G</a> (bt4g.com) is not a tracker and doesn’t store any content and only
+collects torrent metadata (such as file names and file sizes) and a magnet link
+(torrent identifier).</p>
+<p>This engine does not parse the HTML page because there is an API in XML (RSS).
+The RSS feed provides fewer data like amount of seeders/leechers and the files
+in the torrent file. It’s a tradeoff for a “stable” engine as the XML from RSS
+content will change way less than the HTML page.</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following additional settings:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.bt4g.bt4g_order_by" title="searx.engines.bt4g.bt4g_order_by"><code class="xref py py-obj docutils literal notranslate"><span class="pre">bt4g_order_by</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.bt4g.bt4g_category" title="searx.engines.bt4g.bt4g_category"><code class="xref py py-obj docutils literal notranslate"><span class="pre">bt4g_category</span></code></a></p></li>
+</ul>
+<p>With this options a SearXNG maintainer is able to configure <strong>additional</strong>
+engines for specific torrent searches. For example a engine to search only for
+Movies and sort the result list by the count of seeders.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bt4g.movie</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bt4g</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bt4gv</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">video</span>
+<span class="w"> </span><span class="nt">bt4g_order_by</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">seeders</span>
+<span class="w"> </span><span class="nt">bt4g_category</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;movie&#39;</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bt4g.bt4g_category">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bt4g.</span></span><span class="sig-name descname"><span class="pre">bt4g_category</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'all'</span></em><a class="headerlink" href="#searx.engines.bt4g.bt4g_category" title="Link to this definition">¶</a></dt>
+<dd><p>BT$G offers categories: <code class="docutils literal notranslate"><span class="pre">all</span></code> (default), <code class="docutils literal notranslate"><span class="pre">audio</span></code>, <code class="docutils literal notranslate"><span class="pre">movie</span></code>, <code class="docutils literal notranslate"><span class="pre">doc</span></code>,
+<code class="docutils literal notranslate"><span class="pre">app</span></code> and `` other``.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.bt4g.bt4g_order_by">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.bt4g.</span></span><span class="sig-name descname"><span class="pre">bt4g_order_by</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'relevance'</span></em><a class="headerlink" href="#searx.engines.bt4g.bt4g_order_by" title="Link to this definition">¶</a></dt>
+<dd><p>Result list can be ordered by <code class="docutils literal notranslate"><span class="pre">relevance</span></code> (default), <code class="docutils literal notranslate"><span class="pre">size</span></code>, <code class="docutils literal notranslate"><span class="pre">seeders</span></code>
+or <code class="docutils literal notranslate"><span class="pre">time</span></code>.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>When <em>time_range</em> is activate, the results always ordered by <code class="docutils literal notranslate"><span class="pre">time</span></code>.</p>
+</div>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="brave.html" title="previous chapter">Brave Engines</a>
+ <li>Next: <a href="dailymotion.html" title="next chapter">Dailymotion</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/bt4g.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/dailymotion.html b/dev/engines/online/dailymotion.html
new file mode 100644
index 000000000..7f7f22539
--- /dev/null
+++ b/dev/engines/online/dailymotion.html
@@ -0,0 +1,256 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Dailymotion &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="DuckDuckGo Engines" href="duckduckgo.html" />
+ <link rel="prev" title="BT4G" href="bt4g.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="duckduckgo.html" title="DuckDuckGo Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="bt4g.html" title="BT4G"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Dailymotion</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="dailymotion">
+<span id="dailymotion-engine"></span><h1>Dailymotion<a class="headerlink" href="#dailymotion" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#dailymotion-videos" id="id1">Dailymotion (Videos)</a></p></li>
+</ul>
+</nav>
+<section id="dailymotion-videos">
+<span id="module-searx.engines.dailymotion"></span><h2><a class="toc-backref" href="#id1" role="doc-backlink">Dailymotion (Videos)</a><a class="headerlink" href="#dailymotion-videos" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.dailymotion.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.dailymotion.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/dailymotion.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.dailymotion.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch locales &amp; languages from dailymotion.</p>
+<p>Locales fetched from <a class="reference external" href="https://api.dailymotion.com/locales">api/locales</a>.
+There are duplications in the locale codes returned from Dailymotion which
+can be ignored:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">en_EN</span> <span class="o">--&gt;</span> <span class="n">en_GB</span><span class="p">,</span> <span class="n">en_US</span>
+<span class="n">ar_AA</span> <span class="o">--&gt;</span> <span class="n">ar_EG</span><span class="p">,</span> <span class="n">ar_AE</span><span class="p">,</span> <span class="n">ar_SA</span>
+</pre></div>
+</div>
+<p>The language list <a class="reference external" href="https://api.dailymotion.com/languages">api/languages</a>
+contains over 7000 <em>languages</em> codes (see <a class="reference external" href="https://github.com/searxng/searxng/pull/1071">PR1071</a>). We use only those
+language codes that are used in the locales.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.dailymotion.family_filter_map">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.dailymotion.</span></span><span class="sig-name descname"><span class="pre">family_filter_map</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{0:</span> <span class="pre">'false',</span> <span class="pre">1:</span> <span class="pre">'true',</span> <span class="pre">2:</span> <span class="pre">'true'}</span></em><a class="headerlink" href="#searx.engines.dailymotion.family_filter_map" title="Link to this definition">¶</a></dt>
+<dd><p>By default, the family filter is turned on. Setting this parameter to
+<code class="docutils literal notranslate"><span class="pre">false</span></code> will stop filtering-out explicit content from searches and global
+contexts (<code class="docutils literal notranslate"><span class="pre">family_filter</span></code> in <a class="reference external" href="https://developers.dailymotion.com/api/#global-parameters">Global API Parameters</a> ).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.dailymotion.iframe_src">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.dailymotion.</span></span><span class="sig-name descname"><span class="pre">iframe_src</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://www.dailymotion.com/embed/video/{video_id}'</span></em><a class="headerlink" href="#searx.engines.dailymotion.iframe_src" title="Link to this definition">¶</a></dt>
+<dd><p>URL template to embed video in SearXNG’s result list.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.dailymotion.result_fields">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.dailymotion.</span></span><span class="sig-name descname"><span class="pre">result_fields</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">['allow_embed',</span> <span class="pre">'description',</span> <span class="pre">'title',</span> <span class="pre">'created_time',</span> <span class="pre">'duration',</span> <span class="pre">'url',</span> <span class="pre">'thumbnail_360_url',</span> <span class="pre">'id']</span></em><a class="headerlink" href="#searx.engines.dailymotion.result_fields" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://developers.dailymotion.com/api/#fields-selection">Fields selection</a>, by default, a few fields are returned. To request more
+specific fields, the <code class="docutils literal notranslate"><span class="pre">fields</span></code> parameter is used with the list of fields
+SearXNG needs in the response to build a video result list.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.dailymotion.safesearch_params">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.dailymotion.</span></span><span class="sig-name descname"><span class="pre">safesearch_params</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{0:</span> <span class="pre">{},</span> <span class="pre">1:</span> <span class="pre">{'is_created_for_kids':</span> <span class="pre">'true'},</span> <span class="pre">2:</span> <span class="pre">{'is_created_for_kids':</span> <span class="pre">'true'}}</span></em><a class="headerlink" href="#searx.engines.dailymotion.safesearch_params" title="Link to this definition">¶</a></dt>
+<dd><p>True if this video is “Created for Kids” / intends to target an audience
+under the age of 16 (<code class="docutils literal notranslate"><span class="pre">is_created_for_kids</span></code> in <a class="reference external" href="https://developers.dailymotion.com/api/#video-filters">Video filters API</a> )</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.dailymotion.search_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.dailymotion.</span></span><span class="sig-name descname"><span class="pre">search_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://api.dailymotion.com/videos?'</span></em><a class="headerlink" href="#searx.engines.dailymotion.search_url" title="Link to this definition">¶</a></dt>
+<dd><p>URL to retrieve a list of videos.</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://developers.dailymotion.com/tools/">REST GET</a></p></li>
+<li><p><a class="reference external" href="https://developers.dailymotion.com/api/#global-parameters">Global API Parameters</a></p></li>
+<li><p><a class="reference external" href="https://developers.dailymotion.com/api/#video-filters">Video filters API</a></p></li>
+</ul>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="bt4g.html" title="previous chapter">BT4G</a>
+ <li>Next: <a href="duckduckgo.html" title="next chapter">DuckDuckGo Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/dailymotion.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/duckduckgo.html b/dev/engines/online/duckduckgo.html
new file mode 100644
index 000000000..f5dd97506
--- /dev/null
+++ b/dev/engines/online/duckduckgo.html
@@ -0,0 +1,335 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>DuckDuckGo Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Google Engines" href="google.html" />
+ <link rel="prev" title="Dailymotion" href="dailymotion.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="google.html" title="Google Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="dailymotion.html" title="Dailymotion"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">DuckDuckGo Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="duckduckgo-engines">
+<span id="id1"></span><h1>DuckDuckGo Engines<a class="headerlink" href="#duckduckgo-engines" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#duckduckgo-lite" id="id2">DuckDuckGo Lite</a></p></li>
+<li><p><a class="reference internal" href="#duckduckgo-extra-images-videos-news" id="id3">DuckDuckGo Extra (images, videos, news)</a></p></li>
+<li><p><a class="reference internal" href="#duckduckgo-instant-answer-api" id="id4">DuckDuckGo Instant Answer API</a></p></li>
+<li><p><a class="reference internal" href="#duckduckgo-weather" id="id5">DuckDuckGo Weather</a></p></li>
+</ul>
+</nav>
+<section id="duckduckgo-lite">
+<span id="module-searx.engines.duckduckgo"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">DuckDuckGo Lite</a><a class="headerlink" href="#duckduckgo-lite" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo.cache_vqd">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo.</span></span><span class="sig-name descname"><span class="pre">cache_vqd</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/duckduckgo.html#cache_vqd"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.duckduckgo.cache_vqd" title="Link to this definition">¶</a></dt>
+<dd><p>Caches a <code class="docutils literal notranslate"><span class="pre">vqd</span></code> value from a query.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/duckduckgo.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.duckduckgo.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages &amp; regions from DuckDuckGo.</p>
+<p>SearXNG’s <code class="docutils literal notranslate"><span class="pre">all</span></code> locale maps DuckDuckGo’s “Alle regions” (<code class="docutils literal notranslate"><span class="pre">wt-wt</span></code>).
+DuckDuckGo’s language “Browsers prefered language” (<code class="docutils literal notranslate"><span class="pre">wt_WT</span></code>) makes no
+sense in a SearXNG request since SearXNG’s <code class="docutils literal notranslate"><span class="pre">all</span></code> will not add a
+<code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> HTTP header. The value in <code class="docutils literal notranslate"><span class="pre">engine_traits.all_locale</span></code>
+is <code class="docutils literal notranslate"><span class="pre">wt-wt</span></code> (the region).</p>
+<p>Beside regions DuckDuckGo also defines its languages by region codes. By
+example these are the english languages in DuckDuckGo:</p>
+<ul class="simple">
+<li><p>en_US</p></li>
+<li><p>en_AU</p></li>
+<li><p>en_CA</p></li>
+<li><p>en_GB</p></li>
+</ul>
+<p>The function <a class="reference internal" href="#searx.engines.duckduckgo.get_ddg_lang" title="searx.engines.duckduckgo.get_ddg_lang"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_ddg_lang</span></code></a> evaluates DuckDuckGo’s language from
+SearXNG’s locale.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo.get_ddg_lang">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo.</span></span><span class="sig-name descname"><span class="pre">get_ddg_lang</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">eng_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">sxng_locale</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'en_US'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/duckduckgo.html#get_ddg_lang"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.duckduckgo.get_ddg_lang" title="Link to this definition">¶</a></dt>
+<dd><p>Get DuckDuckGo’s language identifier from SearXNG’s locale.</p>
+<p>DuckDuckGo defines its languages by region codes (see
+<a class="reference internal" href="#searx.engines.duckduckgo.fetch_traits" title="searx.engines.duckduckgo.fetch_traits"><code class="xref py py-obj docutils literal notranslate"><span class="pre">fetch_traits</span></code></a>).</p>
+<p>To get region and language of a DDG service use:</p>
+<p>It might confuse, but the <code class="docutils literal notranslate"><span class="pre">l</span></code> value of the cookie is what SearXNG calls
+the <em>region</em>:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># !ddi paris :es-AR --&gt; {&#39;ad&#39;: &#39;es_AR&#39;, &#39;ah&#39;: &#39;ar-es&#39;, &#39;l&#39;: &#39;ar-es&#39;}</span>
+<span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;ad&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_lang</span>
+<span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;ah&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_region</span>
+<span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;l&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_region</span>
+</pre></div>
+</div>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p><a class="reference external" href="https://lite.duckduckgo.com/lite">DDG-lite</a> does not offer a language
+selection to the user, only a region can be selected by the user
+(<code class="docutils literal notranslate"><span class="pre">eng_region</span></code> from the example above). DDG-lite stores the selected
+region in a cookie:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;cookies&#39;</span><span class="p">][</span><span class="s1">&#39;kl&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">eng_region</span> <span class="c1"># &#39;ar-es&#39;</span>
+</pre></div>
+</div>
+</div>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo.get_vqd">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo.</span></span><span class="sig-name descname"><span class="pre">get_vqd</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/duckduckgo.html#get_vqd"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.duckduckgo.get_vqd" title="Link to this definition">¶</a></dt>
+<dd><p>Returns the <code class="docutils literal notranslate"><span class="pre">vqd</span></code> that fits to the <em>query</em>. If there is no <code class="docutils literal notranslate"><span class="pre">vqd</span></code> cached
+(<a class="reference internal" href="#searx.engines.duckduckgo.cache_vqd" title="searx.engines.duckduckgo.cache_vqd"><code class="xref py py-obj docutils literal notranslate"><span class="pre">cache_vqd</span></code></a>) the query is sent to DDG to get a vqd value from the
+response.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>If an empty string is returned there are no results for the <code class="docutils literal notranslate"><span class="pre">query</span></code> and
+therefore no <code class="docutils literal notranslate"><span class="pre">vqd</span></code> value.</p>
+</div>
+<p>DDG’s bot detection is sensitive to the <code class="docutils literal notranslate"><span class="pre">vqd</span></code> value. For some search terms
+(such as extremely long search terms that are often sent by bots), no <code class="docutils literal notranslate"><span class="pre">vqd</span></code>
+value can be determined.</p>
+<p>If SearXNG cannot determine a <code class="docutils literal notranslate"><span class="pre">vqd</span></code> value, then no request should go out
+to DDG:</p>
+<blockquote>
+<div><p>A request with a wrong <code class="docutils literal notranslate"><span class="pre">vqd</span></code> value leads to DDG temporarily putting
+SearXNG’s IP on a block list.</p>
+<p>Requests from IPs in this block list run into timeouts.</p>
+</div></blockquote>
+<p>Not sure, but it seems the block list is a sliding window: to get my IP rid
+from the bot list I had to cool down my IP for 1h (send no requests from
+that IP to DDG).</p>
+<p>TL;DR; the <code class="docutils literal notranslate"><span class="pre">vqd</span></code> value is needed to pass DDG’s bot protection and is used
+by all request to DDG:</p>
+<ul class="simple">
+<li><p>DuckDuckGo Lite: <code class="docutils literal notranslate"><span class="pre">https://lite.duckduckgo.com/lite</span></code> (POST form data)</p></li>
+<li><p>DuckDuckGo Web: <code class="docutils literal notranslate"><span class="pre">https://links.duckduckgo.com/d.js?q=...&amp;vqd=...</span></code></p></li>
+<li><p>DuckDuckGo Images: <code class="docutils literal notranslate"><span class="pre">https://duckduckgo.com/i.js??q=...&amp;vqd=...</span></code></p></li>
+<li><p>DuckDuckGo Videos: <code class="docutils literal notranslate"><span class="pre">https://duckduckgo.com/v.js??q=...&amp;vqd=...</span></code></p></li>
+<li><p>DuckDuckGo News: <code class="docutils literal notranslate"><span class="pre">https://duckduckgo.com/news.js??q=...&amp;vqd=...</span></code></p></li>
+</ul>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo.send_accept_language_header">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo.</span></span><span class="sig-name descname"><span class="pre">send_accept_language_header</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">True</span></em><a class="headerlink" href="#searx.engines.duckduckgo.send_accept_language_header" title="Link to this definition">¶</a></dt>
+<dd><p>DuckDuckGo-Lite tries to guess user’s prefered language from the HTTP
+<code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code>. Optional the user can select a region filter (but not a
+language).</p>
+</dd></dl>
+
+<section id="duckduckgo-extra-images-videos-news">
+<span id="module-searx.engines.duckduckgo_extra"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">DuckDuckGo Extra (images, videos, news)</a><a class="headerlink" href="#duckduckgo-extra-images-videos-news" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo_extra.ddg_category">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo_extra.</span></span><span class="sig-name descname"><span class="pre">ddg_category</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'images'</span></em><a class="headerlink" href="#searx.engines.duckduckgo_extra.ddg_category" title="Link to this definition">¶</a></dt>
+<dd><p>The category must be any of <code class="docutils literal notranslate"><span class="pre">images</span></code>, <code class="docutils literal notranslate"><span class="pre">videos</span></code> and <code class="docutils literal notranslate"><span class="pre">news</span></code></p>
+</dd></dl>
+
+<section id="duckduckgo-instant-answer-api">
+<span id="module-searx.engines.duckduckgo_definitions"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">DuckDuckGo Instant Answer API</a><a class="headerlink" href="#duckduckgo-instant-answer-api" title="Link to this heading">¶</a></h2>
+<p>The <a class="reference external" href="https://duckduckgo.com/api">DDG-API</a> is no longer documented but from
+reverse engineering we can see that some services (e.g. instant answers) still
+in use from the DDG search engine.</p>
+<p>As far we can say the <em>instant answers</em> API does not support languages, or at
+least we could not find out how language support should work. It seems that
+most of the features are based on English terms.</p>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo_definitions.area_to_str">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo_definitions.</span></span><span class="sig-name descname"><span class="pre">area_to_str</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">area</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/duckduckgo_definitions.html#area_to_str"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.duckduckgo_definitions.area_to_str" title="Link to this definition">¶</a></dt>
+<dd><p>parse <code class="docutils literal notranslate"><span class="pre">{'unit':</span> <span class="pre">'https://www.wikidata.org/entity/Q712226',</span> <span class="pre">'amount':</span> <span class="pre">'+20.99'}</span></code></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.duckduckgo_definitions.is_broken_text">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.duckduckgo_definitions.</span></span><span class="sig-name descname"><span class="pre">is_broken_text</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">text</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/duckduckgo_definitions.html#is_broken_text"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.duckduckgo_definitions.is_broken_text" title="Link to this definition">¶</a></dt>
+<dd><p>duckduckgo may return something like <code class="docutils literal notranslate"><span class="pre">&lt;a</span> <span class="pre">href=&quot;xxxx&quot;&gt;http://somewhere</span> <span class="pre">Related</span> <span class="pre">website&lt;a/&gt;</span></code></p>
+<p>The href URL is broken, the “Related website” may contains some HTML.</p>
+<p>The best solution seems to ignore these results.</p>
+</dd></dl>
+
+<section id="duckduckgo-weather">
+<span id="module-searx.engines.duckduckgo_weather"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">DuckDuckGo Weather</a><a class="headerlink" href="#duckduckgo-weather" title="Link to this heading">¶</a></h2>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="dailymotion.html" title="previous chapter">Dailymotion</a>
+ <li>Next: <a href="google.html" title="next chapter">Google Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/duckduckgo.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/google.html b/dev/engines/online/google.html
new file mode 100644
index 000000000..f2397efb7
--- /dev/null
+++ b/dev/engines/online/google.html
@@ -0,0 +1,465 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Google Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Lemmy" href="lemmy.html" />
+ <link rel="prev" title="DuckDuckGo Engines" href="duckduckgo.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="lemmy.html" title="Lemmy"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="duckduckgo.html" title="DuckDuckGo Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Google Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="google-engines">
+<span id="id1"></span><h1>Google Engines<a class="headerlink" href="#google-engines" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#google-api" id="id4">Google API</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.google" id="id5">Google WEB</a></p></li>
+<li><p><a class="reference internal" href="#google-autocomplete" id="id6">Google Autocomplete</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.google_images" id="id7">Google Images</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.google_videos" id="id8">Google Videos</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.google_news" id="id9">Google News</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.google_scholar" id="id10">Google Scholar</a></p></li>
+</ul>
+</nav>
+<section id="google-api">
+<span id="id2"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Google API</a><a class="headerlink" href="#google-api" title="Link to this heading">¶</a></h2>
+<p>SearXNG’s implementation of the Google API is mainly done in
+<a class="reference internal" href="#searx.engines.google.get_google_info" title="searx.engines.google.get_google_info"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_google_info</span></code></a>.</p>
+<p>For detailed description of the <em>REST-full</em> API see: <a class="reference external" href="https://developers.google.com/custom-search/docs/xml_results#WebSearch_Query_Parameter_Definitions">Query Parameter
+Definitions</a>. The linked API documentation can sometimes be helpful during
+reverse engineering. However, we cannot use it in the freely accessible WEB
+services; not all parameters can be applied and some engines are more <em>special</em>
+than other (e.g. <a class="reference internal" href="#google-news-engine"><span class="std std-ref">Google News</span></a>).</p>
+</section>
+<section id="module-searx.engines.google">
+<span id="google-web"></span><span id="google-web-engine"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Google WEB</a><a class="headerlink" href="#module-searx.engines.google" title="Link to this heading">¶</a></h2>
+<p>This is the implementation of the Google WEB engine. Some of this
+implementations (manly the <a class="reference internal" href="#searx.engines.google.get_google_info" title="searx.engines.google.get_google_info"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_google_info</span></code></a>) are shared by other
+engines:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#google-images-engine"><span class="std std-ref">Google Images</span></a></p></li>
+<li><p><a class="reference internal" href="#google-news-engine"><span class="std std-ref">Google News</span></a></p></li>
+<li><p><a class="reference internal" href="#google-videos-engine"><span class="std std-ref">Google Videos</span></a></p></li>
+<li><p><a class="reference internal" href="#google-scholar-engine"><span class="std std-ref">Google Scholar</span></a></p></li>
+<li><p><a class="reference internal" href="#google-autocomplete"><span class="std std-ref">Google Autocomplete</span></a></p></li>
+</ul>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">add_domains</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages from Google.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google.get_google_info">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google.</span></span><span class="sig-name descname"><span class="pre">get_google_info</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">eng_traits</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google.html#get_google_info"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google.get_google_info" title="Link to this definition">¶</a></dt>
+<dd><p>Composing various (language) properties for the google engines (<a class="reference internal" href="#google-api"><span class="std std-ref">Google API</span></a>).</p>
+<p>This function is called by the various google engines (<a class="reference internal" href="#google-web-engine"><span class="std std-ref">Google WEB</span></a>, <a class="reference internal" href="#google-images-engine"><span class="std std-ref">Google Images</span></a>, <a class="reference internal" href="#google-news-engine"><span class="std std-ref">Google News</span></a> and
+<a class="reference internal" href="#google-videos-engine"><span class="std std-ref">Google Videos</span></a>).</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>param</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><em>dict</em></a>) – Request parameters of the engine. At least
+a <code class="docutils literal notranslate"><span class="pre">searxng_locale</span></code> key should be in the dictionary.</p></li>
+<li><p><strong>eng_traits</strong> – Engine’s traits fetched from google preferences
+(<a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.enginelib.traits.EngineTraits</span></code></a>)</p></li>
+</ul>
+</dd>
+<dt class="field-even">Return type<span class="colon">:</span></dt>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)">dict</a></p>
+</dd>
+<dt class="field-odd">Returns<span class="colon">:</span></dt>
+<dd class="field-odd"><p><p>Py-Dictionary with the key/value pairs:</p>
+<dl class="simple">
+<dt>language:</dt><dd><p>The language code that is used by google (e.g. <code class="docutils literal notranslate"><span class="pre">lang_en</span></code> or
+<code class="docutils literal notranslate"><span class="pre">lang_zh-TW</span></code>)</p>
+</dd>
+<dt>country:</dt><dd><p>The country code that is used by google (e.g. <code class="docutils literal notranslate"><span class="pre">US</span></code> or <code class="docutils literal notranslate"><span class="pre">TW</span></code>)</p>
+</dd>
+<dt>locale:</dt><dd><p>A instance of <a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale" title="(in Babel v2.2)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.core.Locale</span></code></a> build from the
+<code class="docutils literal notranslate"><span class="pre">searxng_locale</span></code> value.</p>
+</dd>
+<dt>subdomain:</dt><dd><p>Google subdomain <code class="xref py py-obj docutils literal notranslate"><span class="pre">google_domains</span></code> that fits to the country
+code.</p>
+</dd>
+<dt>params:</dt><dd><p>Py-Dictionary with additional request arguments (can be passed to
+<a class="reference external" href="https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">urllib.parse.urlencode()</span></code></a>).</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">hl</span></code> parameter: specifies the interface language of user interface.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">lr</span></code> parameter: restricts search results to documents written in
+a particular language.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">cr</span></code> parameter: restricts search results to documents
+originating in a particular country.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">ie</span></code> parameter: sets the character encoding scheme that should
+be used to interpret the query string (‘utf8’).</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">oe</span></code> parameter: sets the character encoding scheme that should
+be used to decode the XML result (‘utf8’).</p></li>
+</ul>
+</dd>
+<dt>headers:</dt><dd><p>Py-Dictionary with additional HTTP headers (can be passed to
+request’s headers)</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">Accept:</span> <span class="pre">'*/*</span></code></p></li>
+</ul>
+</dd>
+</dl>
+</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google.request" title="Link to this definition">¶</a></dt>
+<dd><p>Google search request</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google.response" title="Link to this definition">¶</a></dt>
+<dd><p>Get response from google’s search request</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.google.UI_ASYNC">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google.</span></span><span class="sig-name descname"><span class="pre">UI_ASYNC</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'use_ac:true,_fmt:prog'</span></em><a class="headerlink" href="#searx.engines.google.UI_ASYNC" title="Link to this definition">¶</a></dt>
+<dd><p>Format of the response from UI’s async request.</p>
+</dd></dl>
+
+</section>
+<section id="google-autocomplete">
+<span id="id3"></span><h2><a class="toc-backref" href="#id6" role="doc-backlink">Google Autocomplete</a><a class="headerlink" href="#google-autocomplete" title="Link to this heading">¶</a></h2>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.autocomplete.google_complete">
+<span class="sig-prename descclassname"><span class="pre">searx.autocomplete.</span></span><span class="sig-name descname"><span class="pre">google_complete</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sxng_locale</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/autocomplete.html#google_complete"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.autocomplete.google_complete" title="Link to this definition">¶</a></dt>
+<dd><p>Autocomplete from Google. Supports Google’s languages and subdomains
+(<a class="reference internal" href="#searx.engines.google.get_google_info" title="searx.engines.google.get_google_info"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.engines.google.get_google_info</span></code></a>) by using the async REST
+API:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>https://{subdomain}/complete/search?{args}
+</pre></div>
+</div>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.google_images">
+<span id="google-images"></span><span id="google-images-engine"></span><h2><a class="toc-backref" href="#id7" role="doc-backlink">Google Images</a><a class="headerlink" href="#module-searx.engines.google_images" title="Link to this heading">¶</a></h2>
+<p>This is the implementation of the Google Images engine using the internal
+Google API used by the Google Go Android app.</p>
+<p>This internal API offer results in</p>
+<ul class="simple">
+<li><p>JSON (<code class="docutils literal notranslate"><span class="pre">_fmt:json</span></code>)</p></li>
+<li><p><a class="reference external" href="https://en.wikipedia.org/wiki/Protocol_Buffers">Protobuf</a> (<code class="docutils literal notranslate"><span class="pre">_fmt:pb</span></code>)</p></li>
+<li><p><a class="reference external" href="https://en.wikipedia.org/wiki/Protocol_Buffers">Protobuf</a> compressed? (<code class="docutils literal notranslate"><span class="pre">_fmt:pc</span></code>)</p></li>
+<li><p>HTML (<code class="docutils literal notranslate"><span class="pre">_fmt:html</span></code>)</p></li>
+<li><p><a class="reference external" href="https://en.wikipedia.org/wiki/Protocol_Buffers">Protobuf</a> encoded in JSON (<code class="docutils literal notranslate"><span class="pre">_fmt:jspb</span></code>).</p></li>
+</ul>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_images.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_images.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_images.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_images.request" title="Link to this definition">¶</a></dt>
+<dd><p>Google-Image search request</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_images.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_images.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_images.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_images.response" title="Link to this definition">¶</a></dt>
+<dd><p>Get response from google’s search request</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.google_videos">
+<span id="google-videos"></span><span id="google-videos-engine"></span><h2><a class="toc-backref" href="#id8" role="doc-backlink">Google Videos</a><a class="headerlink" href="#module-searx.engines.google_videos" title="Link to this heading">¶</a></h2>
+<p>This is the implementation of the Google Videos engine.</p>
+<div class="admonition-content-security-policy-csp admonition">
+<p class="admonition-title">Content-Security-Policy (CSP)</p>
+<p>This engine needs to allow images from the <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs">data URLs</a> (prefixed with the
+<code class="docutils literal notranslate"><span class="pre">data:</span></code> scheme):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Header</span> <span class="nb">set</span> <span class="n">Content</span><span class="o">-</span><span class="n">Security</span><span class="o">-</span><span class="n">Policy</span> <span class="s2">&quot;img-src &#39;self&#39; data: ;&quot;</span>
+</pre></div>
+</div>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_videos.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_videos.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_videos.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_videos.request" title="Link to this definition">¶</a></dt>
+<dd><p>Google-Video search request</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_videos.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_videos.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_videos.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_videos.response" title="Link to this definition">¶</a></dt>
+<dd><p>Get response from google’s search request</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.google_news">
+<span id="google-news"></span><span id="google-news-engine"></span><h2><a class="toc-backref" href="#id9" role="doc-backlink">Google News</a><a class="headerlink" href="#module-searx.engines.google_news" title="Link to this heading">¶</a></h2>
+<p>This is the implementation of the Google News engine.</p>
+<p>Google News has a different region handling compared to Google WEB.</p>
+<ul class="simple">
+<li><p>the <code class="docutils literal notranslate"><span class="pre">ceid</span></code> argument has to be set (<a class="reference internal" href="#searx.engines.google_news.ceid_list" title="searx.engines.google_news.ceid_list"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ceid_list</span></code></a>)</p></li>
+<li><p>the <a class="reference external" href="https://developers.google.com/custom-search/docs/xml_results#hlsp">hl</a> argument has to be set correctly (and different to Google WEB)</p></li>
+<li><p>the <a class="reference external" href="https://developers.google.com/custom-search/docs/xml_results#glsp">gl</a> argument is mandatory</p></li>
+</ul>
+<p>If one of this argument is not set correctly, the request is redirected to
+CONSENT dialog:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>https://consent.google.com/m?continue=
+</pre></div>
+</div>
+<p>The google news API ignores some parameters from the common <a class="reference internal" href="#google-api"><span class="std std-ref">Google API</span></a>:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://developers.google.com/custom-search/docs/xml_results#numsp">num</a> : the number of search results is ignored / there is no paging all
+results for a query term are in the first response.</p></li>
+<li><p><a class="reference external" href="https://developers.google.com/custom-search/docs/xml_results#safesp">save</a> : is ignored / Google-News results are always <em>SafeSearch</em></p></li>
+</ul>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_news.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_news.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_news.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_news.request" title="Link to this definition">¶</a></dt>
+<dd><p>Google-News search request</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_news.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_news.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_news.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_news.response" title="Link to this definition">¶</a></dt>
+<dd><p>Get response from google’s search request</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.google_news.ceid_list">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_news.</span></span><span class="sig-name descname"><span class="pre">ceid_list</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">['AE:ar',</span> <span class="pre">'AR:es-419',</span> <span class="pre">'AT:de',</span> <span class="pre">'AU:en',</span> <span class="pre">'BD:bn',</span> <span class="pre">'BE:fr',</span> <span class="pre">'BE:nl',</span> <span class="pre">'BG:bg',</span> <span class="pre">'BR:pt-419',</span> <span class="pre">'BW:en',</span> <span class="pre">'CA:en',</span> <span class="pre">'CA:fr',</span> <span class="pre">'CH:de',</span> <span class="pre">'CH:fr',</span> <span class="pre">'CL:es-419',</span> <span class="pre">'CN:zh-Hans',</span> <span class="pre">'CO:es-419',</span> <span class="pre">'CU:es-419',</span> <span class="pre">'CZ:cs',</span> <span class="pre">'DE:de',</span> <span class="pre">'EG:ar',</span> <span class="pre">'ES:es',</span> <span class="pre">'ET:en',</span> <span class="pre">'FR:fr',</span> <span class="pre">'GB:en',</span> <span class="pre">'GH:en',</span> <span class="pre">'GR:el',</span> <span class="pre">'HK:zh-Hant',</span> <span class="pre">'HU:hu',</span> <span class="pre">'ID:en',</span> <span class="pre">'ID:id',</span> <span class="pre">'IE:en',</span> <span class="pre">'IL:en',</span> <span class="pre">'IL:he',</span> <span class="pre">'IN:bn',</span> <span class="pre">'IN:en',</span> <span class="pre">'IN:hi',</span> <span class="pre">'IN:ml',</span> <span class="pre">'IN:mr',</span> <span class="pre">'IN:ta',</span> <span class="pre">'IN:te',</span> <span class="pre">'IT:it',</span> <span class="pre">'JP:ja',</span> <span class="pre">'KE:en',</span> <span class="pre">'KR:ko',</span> <span class="pre">'LB:ar',</span> <span class="pre">'LT:lt',</span> <span class="pre">'LV:en',</span> <span class="pre">'LV:lv',</span> <span class="pre">'MA:fr',</span> <span class="pre">'MX:es-419',</span> <span class="pre">'MY:en',</span> <span class="pre">'NA:en',</span> <span class="pre">'NG:en',</span> <span class="pre">'NL:nl',</span> <span class="pre">'NO:no',</span> <span class="pre">'NZ:en',</span> <span class="pre">'PE:es-419',</span> <span class="pre">'PH:en',</span> <span class="pre">'PK:en',</span> <span class="pre">'PL:pl',</span> <span class="pre">'PT:pt-150',</span> <span class="pre">'RO:ro',</span> <span class="pre">'RS:sr',</span> <span class="pre">'RU:ru',</span> <span class="pre">'SA:ar',</span> <span class="pre">'SE:sv',</span> <span class="pre">'SG:en',</span> <span class="pre">'SI:sl',</span> <span class="pre">'SK:sk',</span> <span class="pre">'SN:fr',</span> <span class="pre">'TH:th',</span> <span class="pre">'TR:tr',</span> <span class="pre">'TW:zh-Hant',</span> <span class="pre">'TZ:en',</span> <span class="pre">'UA:ru',</span> <span class="pre">'UA:uk',</span> <span class="pre">'UG:en',</span> <span class="pre">'US:en',</span> <span class="pre">'US:es-419',</span> <span class="pre">'VE:es-419',</span> <span class="pre">'VN:vi',</span> <span class="pre">'ZA:en',</span> <span class="pre">'ZW:en']</span></em><a class="headerlink" href="#searx.engines.google_news.ceid_list" title="Link to this definition">¶</a></dt>
+<dd><p>List of region/language combinations supported by Google News. Values of the
+<code class="docutils literal notranslate"><span class="pre">ceid</span></code> argument of the Google News REST API.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.google_scholar">
+<span id="google-scholar"></span><span id="google-scholar-engine"></span><h2><a class="toc-backref" href="#id10" role="doc-backlink">Google Scholar</a><a class="headerlink" href="#module-searx.engines.google_scholar" title="Link to this heading">¶</a></h2>
+<p>This is the implementation of the Google Scholar engine.</p>
+<p>Compared to other Google services the Scholar engine has a simple GET REST-API
+and there does not exists <cite>async</cite> API. Even though the API slightly vintage we
+can make use of the <a class="reference internal" href="#google-api"><span class="std std-ref">Google API</span></a> to assemble the arguments of the GET
+request.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_scholar.detect_google_captcha">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_scholar.</span></span><span class="sig-name descname"><span class="pre">detect_google_captcha</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dom</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_scholar.html#detect_google_captcha"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_scholar.detect_google_captcha" title="Link to this definition">¶</a></dt>
+<dd><p>In case of CAPTCHA Google Scholar open its own <em>not a Robot</em> dialog and is
+not redirected to <code class="docutils literal notranslate"><span class="pre">sorry.google.com</span></code>.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_scholar.parse_gs_a">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_scholar.</span></span><span class="sig-name descname"><span class="pre">parse_gs_a</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">text</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_scholar.html#parse_gs_a"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_scholar.parse_gs_a" title="Link to this definition">¶</a></dt>
+<dd><p>Parse the text written in green.</p>
+<p>Possible formats:
+* “{authors} - {journal}, {year} - {publisher}”
+* “{authors} - {year} - {publisher}”
+* “{authors} - {publisher}”</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_scholar.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_scholar.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_scholar.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_scholar.request" title="Link to this definition">¶</a></dt>
+<dd><p>Google-Scholar search request</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_scholar.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_scholar.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_scholar.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_scholar.response" title="Link to this definition">¶</a></dt>
+<dd><p>Parse response from Google Scholar</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.google_scholar.time_range_args">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.google_scholar.</span></span><span class="sig-name descname"><span class="pre">time_range_args</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/google_scholar.html#time_range_args"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.google_scholar.time_range_args" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a dictionary with a time range arguments based on
+<code class="docutils literal notranslate"><span class="pre">params['time_range']</span></code>.</p>
+<p>Google Scholar supports a detailed search by year. Searching by <em>last
+month</em> or <em>last week</em> (as offered by SearXNG) is uncommon for scientific
+publications and is not supported by Google Scholar.</p>
+<p>To limit the result list when the users selects a range, all the SearXNG
+ranges (<em>day</em>, <em>week</em>, <em>month</em>, <em>year</em>) are mapped to <em>year</em>. If no range
+is set an empty dictionary of arguments is returned. Example; when
+user selects a time range (current year minus one in 2022):</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="s1">&#39;as_ylo&#39;</span> <span class="p">:</span> <span class="mi">2021</span> <span class="p">}</span>
+</pre></div>
+</div>
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="duckduckgo.html" title="previous chapter">DuckDuckGo Engines</a>
+ <li>Next: <a href="lemmy.html" title="next chapter">Lemmy</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/google.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/lemmy.html b/dev/engines/online/lemmy.html
new file mode 100644
index 000000000..aa9ebba2c
--- /dev/null
+++ b/dev/engines/online/lemmy.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Lemmy &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Library of Congress" href="loc.html" />
+ <link rel="prev" title="Google Engines" href="google.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="loc.html" title="Library of Congress"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="google.html" title="Google Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Lemmy</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="lemmy">
+<span id="lemmy-engine"></span><h1>Lemmy<a class="headerlink" href="#lemmy" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id2">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.lemmy">This engine uses the Lemmy API (<a class="reference external" href="https://lemmy.ml/api/v3/search">https://lemmy.ml/api/v3/search</a>), which is
+documented at <a class="reference external" href="https://join-lemmy.org/api/modules.html">lemmy-js-client</a> / <a class="reference external" href="https://join-lemmy.org/api/interfaces/Search.html">Interface Search</a>. Since Lemmy is
+federated, results are from many different, independent lemmy instances, and not
+only the official one.</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following additional settings:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.lemmy.base_url" title="searx.engines.lemmy.base_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">base_url</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.lemmy.lemmy_type" title="searx.engines.lemmy.lemmy_type"><code class="xref py py-obj docutils literal notranslate"><span class="pre">lemmy_type</span></code></a></p></li>
+</ul>
+<p>This implementation is used by different lemmy engines in the <a class="reference internal" href="../../../admin/settings/settings_engine.html#settings-engine"><span class="std std-ref">settings.yml</span></a>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">lemmy communities</span>
+<span class="w"> </span><span class="nt">lemmy_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Communities</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">lemmy users</span>
+<span class="w"> </span><span class="nt">lemmy_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Users</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">lemmy posts</span>
+<span class="w"> </span><span class="nt">lemmy_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Posts</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">lemmy comments</span>
+<span class="w"> </span><span class="nt">lemmy_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Comments</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.lemmy.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.lemmy.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://lemmy.ml/'</span></em><a class="headerlink" href="#searx.engines.lemmy.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>By default, <a class="reference external" href="https://lemmy.ml">https://lemmy.ml</a> is used for providing the results. If you want
+to use a different lemmy instance, you can specify <code class="docutils literal notranslate"><span class="pre">base_url</span></code>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.lemmy.lemmy_type">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.lemmy.</span></span><span class="sig-name descname"><span class="pre">lemmy_type</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'Communities'</span></em><a class="headerlink" href="#searx.engines.lemmy.lemmy_type" title="Link to this definition">¶</a></dt>
+<dd><p>Any of <code class="docutils literal notranslate"><span class="pre">Communities</span></code>, <code class="docutils literal notranslate"><span class="pre">Users</span></code>, <code class="docutils literal notranslate"><span class="pre">Posts</span></code>, <code class="docutils literal notranslate"><span class="pre">Comments</span></code></p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="google.html" title="previous chapter">Google Engines</a>
+ <li>Next: <a href="loc.html" title="next chapter">Library of Congress</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/lemmy.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/loc.html b/dev/engines/online/loc.html
new file mode 100644
index 000000000..e3139b1ac
--- /dev/null
+++ b/dev/engines/online/loc.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Library of Congress &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Mastodon" href="mastodon.html" />
+ <link rel="prev" title="Lemmy" href="lemmy.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="mastodon.html" title="Mastodon"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="lemmy.html" title="Lemmy"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Library of Congress</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="library-of-congress">
+<span id="loc-engine"></span><h1>Library of Congress<a class="headerlink" href="#library-of-congress" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.loc">Library of Congress: query Photo, Print and Drawing from API <a class="reference external" href="https://www.loc.gov/apis/json-and-yaml/requests/endpoints/">endpoint</a>
+<code class="docutils literal notranslate"><span class="pre">photos</span></code>.</p>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>Beside the <code class="docutils literal notranslate"><span class="pre">photos</span></code> <a class="reference external" href="https://www.loc.gov/apis/json-and-yaml/requests/endpoints/">endpoint</a> there are more endpoints available / we are
+looking forward for contributions implementing more endpoints.</p>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="lemmy.html" title="previous chapter">Lemmy</a>
+ <li>Next: <a href="mastodon.html" title="next chapter">Mastodon</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/loc.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/mastodon.html b/dev/engines/online/mastodon.html
new file mode 100644
index 000000000..30e4a033b
--- /dev/null
+++ b/dev/engines/online/mastodon.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Mastodon &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Moviepilot" href="moviepilot.html" />
+ <link rel="prev" title="Library of Congress" href="loc.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="moviepilot.html" title="Moviepilot"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="loc.html" title="Library of Congress"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Mastodon</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="mastodon">
+<span id="mastodon-engine"></span><h1>Mastodon<a class="headerlink" href="#mastodon" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.mastodon"><a class="reference external" href="https://mastodon.social">Mastodon</a> is an open source alternative to large social media platforms like
+Twitter/X, Facebook, …</p>
+<p>Since it’s federated and self-hostable, there’s a large amount of available
+instances, which can be chosen instead by modifying <code class="docutils literal notranslate"><span class="pre">base_url</span></code>.</p>
+<p>We use their official <a class="reference external" href="https://docs.joinmastodon.org/api/">API</a> for searching, but unfortunately, their Search <a class="reference external" href="https://docs.joinmastodon.org/api/">API</a>
+forbids pagination without OAuth.</p>
+<p>That’s why we use tootfinder.ch for finding posts, which doesn’t support searching
+for users, accounts or other types of content on Mastodon however.</p>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="loc.html" title="previous chapter">Library of Congress</a>
+ <li>Next: <a href="moviepilot.html" title="next chapter">Moviepilot</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/mastodon.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/moviepilot.html b/dev/engines/online/moviepilot.html
new file mode 100644
index 000000000..ff3d3c5d8
--- /dev/null
+++ b/dev/engines/online/moviepilot.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Moviepilot &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Matrix Rooms Search (MRS)" href="mrs.html" />
+ <link rel="prev" title="Mastodon" href="mastodon.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="mrs.html" title="Matrix Rooms Search (MRS)"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="mastodon.html" title="Mastodon"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Moviepilot</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="moviepilot">
+<span id="moviepilot-engine"></span><h1>Moviepilot<a class="headerlink" href="#moviepilot" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.moviepilot">Moviepilot is a German movie database, similar to IMDB or TMDB. It doesn’t
+have any official API, but it uses JSON requests internally to fetch search
+results and suggestions, that’s being used in this implementation.</p>
+<p>Moviepilot additionally allows to discover movies by certain categories
+or filters, hence we provide the following syntax:</p>
+<ul class="simple">
+<li><p>Any normal search query -&gt; Fetch search results by the query</p></li>
+<li><p>A query containing one of the category identifiers <code class="docutils literal notranslate"><span class="pre">fsk</span></code>, <code class="docutils literal notranslate"><span class="pre">genre</span></code>,
+<code class="docutils literal notranslate"><span class="pre">jahr</span></code>, <code class="docutils literal notranslate"><span class="pre">jahrzent</span></code>, <code class="docutils literal notranslate"><span class="pre">land</span></code>, <code class="docutils literal notranslate"><span class="pre">online</span></code>, <code class="docutils literal notranslate"><span class="pre">stimmung</span></code> will be used to
+search trending items by the provided filters, which are appended to the
+filter category after a <code class="docutils literal notranslate"><span class="pre">-</span></code>.</p></li>
+</ul>
+<p>Search examples:</p>
+<ul class="simple">
+<li><p>Normal: <code class="docutils literal notranslate"><span class="pre">!mp</span> <span class="pre">Tom</span> <span class="pre">Cruise</span></code></p></li>
+<li><p>By filter: <code class="docutils literal notranslate"><span class="pre">!mp</span> <span class="pre">person-Ryan-Gosling</span></code></p></li>
+<li><p>By filter: <code class="docutils literal notranslate"><span class="pre">!mp</span> <span class="pre">fsk-0</span> <span class="pre">land-deutschland</span> <span class="pre">genre-actionfilm</span></code></p></li>
+<li><p>By filter: <code class="docutils literal notranslate"><span class="pre">!mp</span> <span class="pre">jahrzehnt-2020er</span> <span class="pre">online-netflix</span></code></p></li>
+</ul>
+<p>For a list of all public filters, observe the url path when browsing</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.moviepilot.de/filme/beste">https://www.moviepilot.de/filme/beste</a>.</p></li>
+</ul>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="mastodon.html" title="previous chapter">Mastodon</a>
+ <li>Next: <a href="mrs.html" title="next chapter">Matrix Rooms Search (MRS)</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/moviepilot.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/mrs.html b/dev/engines/online/mrs.html
new file mode 100644
index 000000000..0191a9f32
--- /dev/null
+++ b/dev/engines/online/mrs.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Matrix Rooms Search (MRS) &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Mullvad-Leta" href="mullvad_leta.html" />
+ <link rel="prev" title="Moviepilot" href="moviepilot.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="mullvad_leta.html" title="Mullvad-Leta"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="moviepilot.html" title="Moviepilot"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Matrix Rooms Search (MRS)</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="matrix-rooms-search-mrs">
+<span id="mrs-engine"></span><h1>Matrix Rooms Search (MRS)<a class="headerlink" href="#matrix-rooms-search-mrs" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementation" id="id2">Implementation</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.mrs">Matrix Rooms Search - a fully-featured, standalone, matrix rooms search service.</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following mandatory settings:</p>
+<ul class="simple">
+<li><p><code class="xref py py-obj docutils literal notranslate"><span class="pre">base_url</span></code></p></li>
+</ul>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">MRS</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mrs</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://mrs-host</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+</section>
+<section id="implementation">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Implementation</a><a class="headerlink" href="#implementation" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.mrs.init">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mrs.</span></span><span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_settings</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/mrs.html#init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.mrs.init" title="Link to this definition">¶</a></dt>
+<dd><p>The <code class="docutils literal notranslate"><span class="pre">base_url</span></code> must be set in the configuration, if <code class="docutils literal notranslate"><span class="pre">base_url</span></code> is not
+set, a <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ValueError" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ValueError</span></code></a> is raised during initialization.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="moviepilot.html" title="previous chapter">Moviepilot</a>
+ <li>Next: <a href="mullvad_leta.html" title="next chapter">Mullvad-Leta</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/mrs.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/mullvad_leta.html b/dev/engines/online/mullvad_leta.html
new file mode 100644
index 000000000..04f6b36ab
--- /dev/null
+++ b/dev/engines/online/mullvad_leta.html
@@ -0,0 +1,240 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Mullvad-Leta &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Mwmbl Engine" href="mwmbl.html" />
+ <link rel="prev" title="Matrix Rooms Search (MRS)" href="mrs.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="mwmbl.html" title="Mwmbl Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="mrs.html" title="Matrix Rooms Search (MRS)"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Mullvad-Leta</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="mullvad-leta">
+<span id="voidlinux-mullvad-leta"></span><h1>Mullvad-Leta<a class="headerlink" href="#mullvad-leta" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.mullvad_leta">This is the implementation of the Mullvad-Leta meta-search engine.</p>
+<p>This engine <strong>REQUIRES</strong> that searxng operate within a Mullvad VPN</p>
+<p>If using docker, consider using gluetun for easily connecting to the Mullvad</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/qdm12/gluetun">https://github.com/qdm12/gluetun</a></p></li>
+</ul>
+<p>Otherwise, follow instructions provided by Mullvad for enabling the VPN on Linux</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://mullvad.net/en/help/install-mullvad-app-linux">https://mullvad.net/en/help/install-mullvad-app-linux</a></p></li>
+</ul>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>The <code class="xref py py-obj docutils literal notranslate"><span class="pre">EngineTraits</span></code> is empty by default. Maintainers have to run
+<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">data.traits</span></code> (in the Mullvad VPN / <a class="reference internal" href="#searx.engines.mullvad_leta.fetch_traits" title="searx.engines.mullvad_leta.fetch_traits"><code class="xref py py-obj docutils literal notranslate"><span class="pre">fetch_traits</span></code></a>) and rebase
+the modified JSON file <code class="docutils literal notranslate"><span class="pre">searx/data/engine_traits.json</span></code> on every single
+update of SearXNG!</p>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.mullvad_leta.assign_headers">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mullvad_leta.</span></span><span class="sig-name descname"><span class="pre">assign_headers</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">headers</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><span class="pre">dict</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><span class="pre">dict</span></a></span></span><a class="reference internal" href="../../../_modules/searx/engines/mullvad_leta.html#assign_headers"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.mullvad_leta.assign_headers" title="Link to this definition">¶</a></dt>
+<dd><p>Assigns the headers to make a request to Mullvad Leta</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.mullvad_leta.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mullvad_leta.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/mullvad_leta.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.mullvad_leta.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages and regions from Mullvad-Leta</p>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Fetching the engine traits also requires a Mullvad VPN connection. If
+not connected, then an error message will print and no traits will be
+updated.</p>
+</div>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.mullvad_leta.is_vpn_connected">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mullvad_leta.</span></span><span class="sig-name descname"><span class="pre">is_vpn_connected</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dom</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HtmlElement</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span></span><a class="reference internal" href="../../../_modules/searx/engines/mullvad_leta.html#is_vpn_connected"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.mullvad_leta.is_vpn_connected" title="Link to this definition">¶</a></dt>
+<dd><p>Returns true if the VPN is connected, False otherwise</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.mullvad_leta.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.mullvad_leta.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Response</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/mullvad_leta.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.mullvad_leta.response" title="Link to this definition">¶</a></dt>
+<dd><p>Checks if connected to Mullvad VPN, then extracts the search results from
+the DOM resp: requests response object</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="mrs.html" title="previous chapter">Matrix Rooms Search (MRS)</a>
+ <li>Next: <a href="mwmbl.html" title="next chapter">Mwmbl Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/mullvad_leta.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/mwmbl.html b/dev/engines/online/mwmbl.html
new file mode 100644
index 000000000..eb37661c2
--- /dev/null
+++ b/dev/engines/online/mwmbl.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Mwmbl Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Odysee" href="odysee.html" />
+ <link rel="prev" title="Mullvad-Leta" href="mullvad_leta.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="odysee.html" title="Odysee"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="mullvad_leta.html" title="Mullvad-Leta"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Mwmbl Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="mwmbl-engine">
+<span id="id1"></span><h1>Mwmbl Engine<a class="headerlink" href="#mwmbl-engine" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.engines.mwmbl" id="id3">Mwmbl WEB</a></p></li>
+<li><p><a class="reference internal" href="#mwmbl-autocomplete" id="id4">Mwmbl Autocomplete</a></p></li>
+</ul>
+</nav>
+<section id="module-searx.engines.mwmbl">
+<span id="mwmbl-web"></span><span id="mwmbl-web-engine"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Mwmbl WEB</a><a class="headerlink" href="#module-searx.engines.mwmbl" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/mwmbl/mwmbl">Mwmbl</a> is a non-profit, ad-free, free-libre and free-lunch search engine with
+a focus on useability and speed.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>At the moment it is little more than an idea together with a proof of concept
+implementation of the web front-end and search technology on a small index.
+<a class="reference external" href="https://github.com/mwmbl/mwmbl">Mwmbl</a> does not support regions, languages, safe-search or time range.
+search.</p>
+</div>
+</section>
+<section id="mwmbl-autocomplete">
+<span id="id2"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Mwmbl Autocomplete</a><a class="headerlink" href="#mwmbl-autocomplete" title="Link to this heading">¶</a></h2>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.autocomplete.mwmbl">
+<span class="sig-prename descclassname"><span class="pre">searx.autocomplete.</span></span><span class="sig-name descname"><span class="pre">mwmbl</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">_lang</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/autocomplete.html#mwmbl"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.autocomplete.mwmbl" title="Link to this definition">¶</a></dt>
+<dd><p>Autocomplete from <a class="reference external" href="https://github.com/mwmbl/mwmbl">Mwmbl</a>.</p>
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="mullvad_leta.html" title="previous chapter">Mullvad-Leta</a>
+ <li>Next: <a href="odysee.html" title="next chapter">Odysee</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/mwmbl.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/odysee.html b/dev/engines/online/odysee.html
new file mode 100644
index 000000000..748bb5b2d
--- /dev/null
+++ b/dev/engines/online/odysee.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Odysee &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Peertube Engines" href="peertube.html" />
+ <link rel="prev" title="Mwmbl Engine" href="mwmbl.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="peertube.html" title="Peertube Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="mwmbl.html" title="Mwmbl Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Odysee</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="odysee">
+<span id="odysee-engine"></span><h1>Odysee<a class="headerlink" href="#odysee" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.odysee"><a class="reference external" href="https://github.com/OdyseeTeam/odysee-frontend">Odysee</a> is a decentralized video hosting platform.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.odysee.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.odysee.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/odysee.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.odysee.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages from Odysee’s source code.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="mwmbl.html" title="previous chapter">Mwmbl Engine</a>
+ <li>Next: <a href="peertube.html" title="next chapter">Peertube Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/odysee.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/peertube.html b/dev/engines/online/peertube.html
new file mode 100644
index 000000000..ba2985cc0
--- /dev/null
+++ b/dev/engines/online/peertube.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Peertube Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Piped" href="piped.html" />
+ <link rel="prev" title="Odysee" href="odysee.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="piped.html" title="Piped"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="odysee.html" title="Odysee"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Peertube Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="peertube-engines">
+<span id="id1"></span><h1>Peertube Engines<a class="headerlink" href="#peertube-engines" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.engines.peertube" id="id2">Peertube Video</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.sepiasearch" id="id3">SepiaSearch</a></p></li>
+</ul>
+</nav>
+<section id="module-searx.engines.peertube">
+<span id="peertube-video"></span><span id="peertube-video-engine"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Peertube Video</a><a class="headerlink" href="#module-searx.engines.peertube" title="Link to this heading">¶</a></h2>
+<p>Peertube and <a class="reference internal" href="#module-searx.engines.sepiasearch" title="searx.engines.sepiasearch"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SepiaSearch</span></code></a> do share
+(more or less) the same REST API and the schema of the JSON result is identical.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.peertube.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.peertube.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/peertube.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.peertube.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages from peertube’s search-index source code.</p>
+<p>See <a class="reference external" href="https://framagit.org/framasoft/peertube/search-index/-/commit/8ed5c729#3d8747f9a60695c367c70bb64efba8f403721fad_0_291">videoLanguages</a> in commit <a class="reference external" href="https://framagit.org/framasoft/peertube/search-index/-/commit/8ed5c729">8ed5c729 - Refactor and redesign client</a></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.peertube.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.peertube.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/peertube.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.peertube.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble request for the Peertube API</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.peertube.video_response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.peertube.</span></span><span class="sig-name descname"><span class="pre">video_response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/peertube.html#video_response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.peertube.video_response" title="Link to this definition">¶</a></dt>
+<dd><p>Parse video response from SepiaSearch and Peertube instances.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.peertube.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.peertube.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://peer.tube'</span></em><a class="headerlink" href="#searx.engines.peertube.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>Base URL of the Peertube instance. A list of instances is available at:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://instances.joinpeertube.org/instances">https://instances.joinpeertube.org/instances</a></p></li>
+</ul>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.sepiasearch">
+<span id="sepiasearch"></span><span id="sepiasearch-engine"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">SepiaSearch</a><a class="headerlink" href="#module-searx.engines.sepiasearch" title="Link to this heading">¶</a></h2>
+<p>SepiaSearch uses the same languages as <a class="reference internal" href="#module-searx.engines.peertube" title="searx.engines.peertube"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Peertube</span></code></a> and the response is identical to the response from the
+peertube engines.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.sepiasearch.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.sepiasearch.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/sepiasearch.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.sepiasearch.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble request for the SepiaSearch API</p>
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="odysee.html" title="previous chapter">Odysee</a>
+ <li>Next: <a href="piped.html" title="next chapter">Piped</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/peertube.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/piped.html b/dev/engines/online/piped.html
new file mode 100644
index 000000000..d40aeb3cf
--- /dev/null
+++ b/dev/engines/online/piped.html
@@ -0,0 +1,260 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Piped &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Presearch Engine" href="presearch.html" />
+ <link rel="prev" title="Peertube Engines" href="peertube.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="presearch.html" title="Presearch Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="peertube.html" title="Peertube Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Piped</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="piped">
+<span id="piped-engine"></span><h1>Piped<a class="headerlink" href="#piped" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#known-quirks" id="id2">Known Quirks</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.piped">An alternative privacy-friendly YouTube frontend which is efficient by
+design. <a class="reference external" href="https://docs.piped.video/docs/architecture/">Piped’s architecture</a> consists of 3 components:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.piped.backend_url" title="searx.engines.piped.backend_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">backend</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.piped.frontend_url" title="searx.engines.piped.frontend_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">frontend</span></code></a></p></li>
+<li><p>proxy</p></li>
+</ul>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The <a class="reference internal" href="#searx.engines.piped.backend_url" title="searx.engines.piped.backend_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">backend_url</span></code></a> and <a class="reference internal" href="#searx.engines.piped.frontend_url" title="searx.engines.piped.frontend_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">frontend_url</span></code></a> has to be set in the engine
+named <cite>piped</cite> and are used by all piped engines</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">piped</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">piped</span>
+<span class="w"> </span><span class="nt">piped_filter</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">videos</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">frontend_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://..</span>
+<span class="w"> </span><span class="nt">backend_url</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://..</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://..</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">piped.music</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">piped</span>
+<span class="w"> </span><span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">piped</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ppdm</span>
+<span class="w"> </span><span class="nt">piped_filter</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">music_songs</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+</section>
+<section id="known-quirks">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Known Quirks</a><a class="headerlink" href="#known-quirks" title="Link to this heading">¶</a></h2>
+<p>The implementation to support <a class="reference internal" href="../enginelib.html#searx.enginelib.Engine.paging" title="searx.enginelib.Engine.paging"><code class="xref py py-obj docutils literal notranslate"><span class="pre">paging</span></code></a>
+is based on the <em>nextpage</em> method of Piped’s REST API / the <a class="reference internal" href="#searx.engines.piped.frontend_url" title="searx.engines.piped.frontend_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">frontend</span>
+<span class="pre">API</span></code></a>. This feature is <em>next page driven</em> and plays well with the
+<a class="reference internal" href="../../../admin/settings/settings_ui.html#settings-ui"><span class="std std-ref">infinite_scroll</span></a> setting in SearXNG but it does not really
+fit into SearXNG’s UI to select a page by number.</p>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.piped.backend_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.piped.</span></span><span class="sig-name descname"><span class="pre">backend_url</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><span class="pre">list</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://pipedapi.kavin.rocks'</span></em><a class="headerlink" href="#searx.engines.piped.backend_url" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://github.com/TeamPiped/Piped-Backend">Piped-Backend</a>: The core component behind Piped. The value is an URL or a
+list of URLs. In the latter case instance will be selected randomly. For a
+complete list of official instances see Piped-Instances (<a class="reference external" href="https://piped-instances.kavin.rocks/">JSON</a>)</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.piped.frontend_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.piped.</span></span><span class="sig-name descname"><span class="pre">frontend_url</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://piped.video'</span></em><a class="headerlink" href="#searx.engines.piped.frontend_url" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://github.com/TeamPiped/Piped">Piped-Frontend</a>: URL to use as link and for embeds.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.piped.piped_filter">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.piped.</span></span><span class="sig-name descname"><span class="pre">piped_filter</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'all'</span></em><a class="headerlink" href="#searx.engines.piped.piped_filter" title="Link to this definition">¶</a></dt>
+<dd><p>Content filter <code class="docutils literal notranslate"><span class="pre">music_songs</span></code> or <code class="docutils literal notranslate"><span class="pre">videos</span></code></p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="peertube.html" title="previous chapter">Peertube Engines</a>
+ <li>Next: <a href="presearch.html" title="next chapter">Presearch Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/piped.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/presearch.html b/dev/engines/online/presearch.html
new file mode 100644
index 000000000..cc8d7d0ba
--- /dev/null
+++ b/dev/engines/online/presearch.html
@@ -0,0 +1,260 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Presearch Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Qwant" href="qwant.html" />
+ <link rel="prev" title="Piped" href="piped.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="qwant.html" title="Qwant"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="piped.html" title="Piped"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Presearch Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="presearch-engine">
+<span id="engine-presearch"></span><h1>Presearch Engine<a class="headerlink" href="#presearch-engine" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#search-type-video" id="id1">Search type <code class="docutils literal notranslate"><span class="pre">video</span></code></a></p></li>
+<li><p><a class="reference internal" href="#languages-regions" id="id2">Languages &amp; Regions</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.presearch">Presearch supports the search types listed in <a class="reference internal" href="#searx.engines.presearch.search_type" title="searx.engines.presearch.search_type"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_type</span></code></a> (general,
+images, videos, news).</p>
+<p>Configured <code class="docutils literal notranslate"><span class="pre">presarch</span></code> engines:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">presearch</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">presearch</span>
+<span class="w"> </span><span class="nt">search_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">search</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">general</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">web</span><span class="p p-Indicator">]</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">presearch images</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">search_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">images</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">images</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">web</span><span class="p p-Indicator">]</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">presearch videos</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">search_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">videos</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">general</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">web</span><span class="p p-Indicator">]</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">presearch news</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="nt">search_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">news</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">news</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">web</span><span class="p p-Indicator">]</span>
+</pre></div>
+</div>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>By default Presearch’s video category is intentionally placed into:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">categories</span><span class="p">:</span> <span class="p">[</span><span class="n">general</span><span class="p">,</span> <span class="n">web</span><span class="p">]</span>
+</pre></div>
+</div>
+</div>
+<section id="search-type-video">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Search type <code class="docutils literal notranslate"><span class="pre">video</span></code></a><a class="headerlink" href="#search-type-video" title="Link to this heading">¶</a></h2>
+<p>The results in the video category are most often links to pages that contain a
+video, for instance many links from Preasearch’s video category link content
+from facebook (aka Meta) or Twitter (aka X). Since these are not real links to
+video streams SearXNG can’t use the video template for this and if SearXNG can’t
+use this template, then the user doesn’t want to see these hits in the videos
+category.</p>
+</section>
+<section id="languages-regions">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Languages &amp; Regions</a><a class="headerlink" href="#languages-regions" title="Link to this heading">¶</a></h2>
+<p>In Presearch there are languages for the UI and regions for narrowing down the
+search. If we set “auto” for the region in the WEB-UI of Presearch and cookie
+<code class="docutils literal notranslate"><span class="pre">use_local_search_results=false</span></code>, then the defaults are set for both (the
+language and the region) from the <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> header.</p>
+<p>Since the region is already “auto” by default, we only need to set the
+<code class="docutils literal notranslate"><span class="pre">use_local_search_results</span></code> cookie and send the <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> header. We
+have to set these values in both requests we send to Presearch; in the first
+request to get the request-ID from Presearch and in the final request to get the
+result list (see <code class="docutils literal notranslate"><span class="pre">send_accept_language_header</span></code>).</p>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.presearch.search_type">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.presearch.</span></span><span class="sig-name descname"><span class="pre">search_type</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'search'</span></em><a class="headerlink" href="#searx.engines.presearch.search_type" title="Link to this definition">¶</a></dt>
+<dd><p>must be any of <code class="docutils literal notranslate"><span class="pre">search</span></code>, <code class="docutils literal notranslate"><span class="pre">images</span></code>, <code class="docutils literal notranslate"><span class="pre">videos</span></code>, <code class="docutils literal notranslate"><span class="pre">news</span></code></p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="piped.html" title="previous chapter">Piped</a>
+ <li>Next: <a href="qwant.html" title="next chapter">Qwant</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/presearch.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/qwant.html b/dev/engines/online/qwant.html
new file mode 100644
index 000000000..33d9d4614
--- /dev/null
+++ b/dev/engines/online/qwant.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Qwant &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="RadioBrowser" href="radio_browser.html" />
+ <link rel="prev" title="Presearch Engine" href="presearch.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="radio_browser.html" title="RadioBrowser"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="presearch.html" title="Presearch Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Qwant</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="qwant">
+<span id="qwant-engine"></span><h1>Qwant<a class="headerlink" href="#qwant" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id2">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.qwant">This engine uses the Qwant API (<a class="reference external" href="https://api.qwant.com/v3">https://api.qwant.com/v3</a>) to implement Qwant
+-Web, -News, -Images and -Videos. The API is undocumented but can be reverse
+engineered by reading the network log of <a class="reference external" href="https://www.qwant.com/">https://www.qwant.com/</a> queries.</p>
+<p>For Qwant’s <em>web-search</em> two alternatives are implemented:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">web</span></code>: uses the <a class="reference internal" href="#searx.engines.qwant.api_url" title="searx.engines.qwant.api_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">api_url</span></code></a> which returns a JSON structure</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">web-lite</span></code>: uses the <a class="reference internal" href="#searx.engines.qwant.web_lite_url" title="searx.engines.qwant.web_lite_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">web_lite_url</span></code></a> which returns a HTML page</p></li>
+</ul>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following additional settings:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.qwant.qwant_categ" title="searx.engines.qwant.qwant_categ"><code class="xref py py-obj docutils literal notranslate"><span class="pre">qwant_categ</span></code></a></p></li>
+</ul>
+<p>This implementation is used by different qwant engines in the <a class="reference internal" href="../../../admin/settings/settings_engine.html#settings-engine"><span class="std std-ref">settings.yml</span></a>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">qwant</span>
+<span class="w"> </span><span class="nt">qwant_categ</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">web-lite</span><span class="w"> </span><span class="c1"># alternatively use &#39;web&#39;</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">qwant news</span>
+<span class="w"> </span><span class="nt">qwant_categ</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">news</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">qwant images</span>
+<span class="w"> </span><span class="nt">qwant_categ</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">images</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">qwant videos</span>
+<span class="w"> </span><span class="nt">qwant_categ</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">videos</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.qwant.parse_web_api">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.qwant.</span></span><span class="sig-name descname"><span class="pre">parse_web_api</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/qwant.html#parse_web_api"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.qwant.parse_web_api" title="Link to this definition">¶</a></dt>
+<dd><p>Parse results from Qwant’s API</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.qwant.parse_web_lite">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.qwant.</span></span><span class="sig-name descname"><span class="pre">parse_web_lite</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/qwant.html#parse_web_lite"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.qwant.parse_web_lite" title="Link to this definition">¶</a></dt>
+<dd><p>Parse results from Qwant-Lite</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.qwant.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.qwant.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/qwant.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.qwant.request" title="Link to this definition">¶</a></dt>
+<dd><p>Qwant search request</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.qwant.api_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.qwant.</span></span><span class="sig-name descname"><span class="pre">api_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://api.qwant.com/v3/search/'</span></em><a class="headerlink" href="#searx.engines.qwant.api_url" title="Link to this definition">¶</a></dt>
+<dd><p>URL of Qwant’s API (JSON)</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.qwant.max_page">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.qwant.</span></span><span class="sig-name descname"><span class="pre">max_page</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">5</span></em><a class="headerlink" href="#searx.engines.qwant.max_page" title="Link to this definition">¶</a></dt>
+<dd><p>5 pages maximum (<code class="docutils literal notranslate"><span class="pre">&amp;p=5</span></code>): Trying to do more just results in an improper
+redirect</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.qwant.qwant_categ">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.qwant.</span></span><span class="sig-name descname"><span class="pre">qwant_categ</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></em><a class="headerlink" href="#searx.engines.qwant.qwant_categ" title="Link to this definition">¶</a></dt>
+<dd><p>One of <code class="docutils literal notranslate"><span class="pre">web-lite</span></code> (or <code class="docutils literal notranslate"><span class="pre">web</span></code>), <code class="docutils literal notranslate"><span class="pre">news</span></code>, <code class="docutils literal notranslate"><span class="pre">images</span></code> or <code class="docutils literal notranslate"><span class="pre">videos</span></code></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.qwant.web_lite_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.qwant.</span></span><span class="sig-name descname"><span class="pre">web_lite_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://lite.qwant.com/'</span></em><a class="headerlink" href="#searx.engines.qwant.web_lite_url" title="Link to this definition">¶</a></dt>
+<dd><p>URL of Qwant-Lite (HTML)</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="presearch.html" title="previous chapter">Presearch Engine</a>
+ <li>Next: <a href="radio_browser.html" title="next chapter">RadioBrowser</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/qwant.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/radio_browser.html b/dev/engines/online/radio_browser.html
new file mode 100644
index 000000000..2e1e2eee1
--- /dev/null
+++ b/dev/engines/online/radio_browser.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>RadioBrowser &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Recoll Engine" href="recoll.html" />
+ <link rel="prev" title="Qwant" href="qwant.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="recoll.html" title="Recoll Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="qwant.html" title="Qwant"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">RadioBrowser</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="radiobrowser">
+<span id="radiobrowser-engine"></span><h1>RadioBrowser<a class="headerlink" href="#radiobrowser" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.radio_browser">Search radio stations from RadioBrowser by <a class="reference external" href="https://de1.api.radio-browser.info/#Advanced_station_search">Advanced station search API</a>.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.radio_browser.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.radio_browser.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/radio_browser.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.radio_browser.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages and countrycodes from RadioBrowser</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">traits.languages</span></code>: <a class="reference external" href="https://de1.api.radio-browser.info/#List_of_languages">list of languages API</a></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">traits.custom['countrycodes']</span></code>: <a class="reference external" href="https://de1.api.radio-browser.info/#List_of_countries">list of countries API</a></p></li>
+</ul>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.radio_browser.station_filters">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.radio_browser.</span></span><span class="sig-name descname"><span class="pre">station_filters</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">[]</span></em><a class="headerlink" href="#searx.engines.radio_browser.station_filters" title="Link to this definition">¶</a></dt>
+<dd><p>A list of filters to be applied to the search of radio stations. By default
+none filters are applied. Valid filters are:</p>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">language</span></code></dt><dd><p>Filter stations by selected language. For instance the <code class="docutils literal notranslate"><span class="pre">de</span></code> from <code class="docutils literal notranslate"><span class="pre">:de-AU</span></code>
+will be translated to <cite>german</cite> and used in the argument <code class="docutils literal notranslate"><span class="pre">language=</span></code>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">countrycode</span></code></dt><dd><p>Filter stations by selected country. The 2-digit countrycode of the station
+comes from the region the user selected. For instance <code class="docutils literal notranslate"><span class="pre">:de-AU</span></code> will filter
+out all stations not in <code class="docutils literal notranslate"><span class="pre">AU</span></code>.</p>
+</dd>
+</dl>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>RadioBrowser has registered a lot of languages and countrycodes unknown to
+<code class="xref py py-obj docutils literal notranslate"><span class="pre">babel</span></code> and note that when searching for radio stations, users are
+more likely to search by name than by region or language.</p>
+</div>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="qwant.html" title="previous chapter">Qwant</a>
+ <li>Next: <a href="recoll.html" title="next chapter">Recoll Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/radio_browser.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/recoll.html b/dev/engines/online/recoll.html
new file mode 100644
index 000000000..33506f67a
--- /dev/null
+++ b/dev/engines/online/recoll.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Recoll Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Seekr Engines" href="seekr.html" />
+ <link rel="prev" title="RadioBrowser" href="radio_browser.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="seekr.html" title="Seekr Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="radio_browser.html" title="RadioBrowser"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Recoll Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="recoll-engine">
+<span id="engine-recoll"></span><h1>Recoll Engine<a class="headerlink" href="#recoll-engine" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#example" id="id2">Example</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<aside class="sidebar" id="module-searx.engines.recoll">
+<p class="sidebar-title">info</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.lesbonscomptes.com/recoll/">Recoll</a></p></li>
+<li><p><a class="reference external" href="https://framagit.org/medoc92/recollwebui.git">recoll-webui</a></p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/recoll.py">git://searx/engines/recoll.py</a></p></li>
+</ul>
+</aside>
+<p><a class="reference external" href="https://www.lesbonscomptes.com/recoll/">Recoll</a> is a desktop full-text search tool based on Xapian. By itself <a class="reference external" href="https://www.lesbonscomptes.com/recoll/">Recoll</a>
+does not offer WEB or API access, this can be achieved using <a class="reference external" href="https://framagit.org/medoc92/recollwebui.git">recoll-webui</a></p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>You must configure the following settings:</p>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">base_url</span></code>:</dt><dd><p>Location where recoll-webui can be reached.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">mount_prefix</span></code>:</dt><dd><p>Location where the file hierarchy is mounted on your <em>local</em> filesystem.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">dl_prefix</span></code>:</dt><dd><p>Location where the file hierarchy as indexed by recoll can be reached.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">search_dir</span></code>:</dt><dd><p>Part of the indexed file hierarchy to be search, if empty the full domain is
+searched.</p>
+</dd>
+</dl>
+</section>
+<section id="example">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Example</a><a class="headerlink" href="#example" title="Link to this heading">¶</a></h2>
+<p>Scenario:</p>
+<ol class="arabic simple">
+<li><p>Recoll indexes a local filesystem mounted in <code class="docutils literal notranslate"><span class="pre">/export/documents/reference</span></code>,</p></li>
+<li><p>the Recoll search interface can be reached at <a class="reference external" href="https://recoll.example.org/">https://recoll.example.org/</a> and</p></li>
+<li><p>the contents of this filesystem can be reached though <a class="reference external" href="https://download.example.org/reference">https://download.example.org/reference</a></p></li>
+</ol>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">base_url</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://recoll.example.org/</span>
+<span class="nt">mount_prefix</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/export/documents</span>
+<span class="nt">dl_prefix</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://download.example.org</span>
+<span class="nt">search_dir</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&#39;</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="radio_browser.html" title="previous chapter">RadioBrowser</a>
+ <li>Next: <a href="seekr.html" title="next chapter">Seekr Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/recoll.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/seekr.html b/dev/engines/online/seekr.html
new file mode 100644
index 000000000..d5763306d
--- /dev/null
+++ b/dev/engines/online/seekr.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Seekr Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Startpage Engines" href="startpage.html" />
+ <link rel="prev" title="Recoll Engine" href="recoll.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="startpage.html" title="Startpage Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="recoll.html" title="Recoll Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Seekr Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="seekr-engines">
+<span id="seekr-engine"></span><h1>Seekr Engines<a class="headerlink" href="#seekr-engines" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#known-quirks" id="id2">Known Quirks</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.seekr">seekr.com Seeker Score</p>
+<p>Seekr is a privately held search and content evaluation engine that prioritizes
+credibility over popularity.</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following additional settings:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.seekr.seekr_category" title="searx.engines.seekr.seekr_category"><code class="xref py py-obj docutils literal notranslate"><span class="pre">seekr_category</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.seekr.api_key" title="searx.engines.seekr.api_key"><code class="xref py py-obj docutils literal notranslate"><span class="pre">api_key</span></code></a></p></li>
+</ul>
+<p>This implementation is used by seekr engines in the <a class="reference internal" href="../../../admin/settings/settings_engine.html#settings-engine"><span class="std std-ref">settings.yml</span></a>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">seekr news</span>
+<span class="w"> </span><span class="nt">seekr_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">news</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">seekr images</span>
+<span class="w"> </span><span class="nt">seekr_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">images</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">seekr videos</span>
+<span class="w"> </span><span class="nt">seekr_category</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">videos</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+</section>
+<section id="known-quirks">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Known Quirks</a><a class="headerlink" href="#known-quirks" title="Link to this heading">¶</a></h2>
+<p>The implementation to support <a class="reference internal" href="../enginelib.html#searx.enginelib.Engine.paging" title="searx.enginelib.Engine.paging"><code class="xref py py-obj docutils literal notranslate"><span class="pre">paging</span></code></a>
+is based on the <em>nextpage</em> method of Seekr’s REST API. This feature is <em>next
+page driven</em> and plays well with the <a class="reference internal" href="../../../admin/settings/settings_ui.html#settings-ui"><span class="std std-ref">infinite_scroll</span></a>
+setting in SearXNG but it does not really fit into SearXNG’s UI to select a page
+by number.</p>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.seekr.api_key">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.seekr.</span></span><span class="sig-name descname"><span class="pre">api_key</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'srh1-22fb-sekr'</span></em><a class="headerlink" href="#searx.engines.seekr.api_key" title="Link to this definition">¶</a></dt>
+<dd><p>API key / reversed engineered / is still the same one since 2022.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.seekr.seekr_category">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.seekr.</span></span><span class="sig-name descname"><span class="pre">seekr_category</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'unset'</span></em><a class="headerlink" href="#searx.engines.seekr.seekr_category" title="Link to this definition">¶</a></dt>
+<dd><p>Search category, any of <code class="docutils literal notranslate"><span class="pre">news</span></code>, <code class="docutils literal notranslate"><span class="pre">videos</span></code> or <code class="docutils literal notranslate"><span class="pre">images</span></code>.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="recoll.html" title="previous chapter">Recoll Engine</a>
+ <li>Next: <a href="startpage.html" title="next chapter">Startpage Engines</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/seekr.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/startpage.html b/dev/engines/online/startpage.html
new file mode 100644
index 000000000..8e4a9cde5
--- /dev/null
+++ b/dev/engines/online/startpage.html
@@ -0,0 +1,339 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Startpage Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Tagesschau API" href="tagesschau.html" />
+ <link rel="prev" title="Seekr Engines" href="seekr.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="tagesschau.html" title="Tagesschau API"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="seekr.html" title="Seekr Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Startpage Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="startpage-engines">
+<span id="id1"></span><h1>Startpage Engines<a class="headerlink" href="#startpage-engines" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#startpage-regions" id="id9">Startpage regions</a></p></li>
+<li><p><a class="reference internal" href="#startpage-languages" id="id10">Startpage languages</a></p></li>
+<li><p><a class="reference internal" href="#startpage-categories" id="id11">Startpage categories</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.startpage">Startpage’s language &amp; region selectors are a mess ..</p>
+<section id="startpage-regions">
+<span id="id2"></span><h2><a class="toc-backref" href="#id9" role="doc-backlink">Startpage regions</a><a class="headerlink" href="#startpage-regions" title="Link to this heading">¶</a></h2>
+<p>In the list of regions there are tags we need to map to common region tags:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pt</span><span class="o">-</span><span class="n">BR_BR</span> <span class="o">--&gt;</span> <span class="n">pt_BR</span>
+<span class="n">zh</span><span class="o">-</span><span class="n">CN_CN</span> <span class="o">--&gt;</span> <span class="n">zh_Hans_CN</span>
+<span class="n">zh</span><span class="o">-</span><span class="n">TW_TW</span> <span class="o">--&gt;</span> <span class="n">zh_Hant_TW</span>
+<span class="n">zh</span><span class="o">-</span><span class="n">TW_HK</span> <span class="o">--&gt;</span> <span class="n">zh_Hant_HK</span>
+<span class="n">en</span><span class="o">-</span><span class="n">GB_GB</span> <span class="o">--&gt;</span> <span class="n">en_GB</span>
+</pre></div>
+</div>
+<p>and there is at least one tag with a three letter language tag (ISO 639-2):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">fil_PH</span> <span class="o">--&gt;</span> <span class="n">fil_PH</span>
+</pre></div>
+</div>
+<p>The locale code <code class="docutils literal notranslate"><span class="pre">no_NO</span></code> from Startpage does not exists and is mapped to
+<code class="docutils literal notranslate"><span class="pre">nb-NO</span></code>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">babel</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span> <span class="n">unknown</span> <span class="n">locale</span> <span class="s1">&#39;no_NO&#39;</span>
+</pre></div>
+</div>
+<p>For reference see languages-subtag at iana; <code class="docutils literal notranslate"><span class="pre">no</span></code> is the macrolanguage <a class="footnote-reference brackets" href="#id5" id="id3" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a> and
+W3C recommends subtag over macrolanguage <a class="footnote-reference brackets" href="#id6" id="id4" role="doc-noteref"><span class="fn-bracket">[</span>2<span class="fn-bracket">]</span></a>.</p>
+<aside class="footnote-list brackets">
+<aside class="footnote brackets" id="id5" role="doc-footnote">
+<span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="#id3">1</a><span class="fn-bracket">]</span></span>
+<p><a class="reference external" href="https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry">iana: language-subtag-registry</a></p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">type</span><span class="p">:</span> <span class="n">language</span>
+<span class="n">Subtag</span><span class="p">:</span> <span class="n">nb</span>
+<span class="n">Description</span><span class="p">:</span> <span class="n">Norwegian</span> <span class="n">Bokmål</span>
+<span class="n">Added</span><span class="p">:</span> <span class="mi">2005</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">16</span>
+<span class="n">Suppress</span><span class="o">-</span><span class="n">Script</span><span class="p">:</span> <span class="n">Latn</span>
+<span class="n">Macrolanguage</span><span class="p">:</span> <span class="n">no</span>
+</pre></div>
+</div>
+</aside>
+<aside class="footnote brackets" id="id6" role="doc-footnote">
+<span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="#id4">2</a><span class="fn-bracket">]</span></span>
+<p>Use macrolanguages with care. Some language subtags have a Scope field set to
+macrolanguage, i.e. this primary language subtag encompasses a number of more
+specific primary language subtags in the registry. … As we recommended for
+the collection subtags mentioned above, in most cases you should try to use
+the more specific subtags … <a class="reference external" href="https://www.w3.org/International/questions/qa-choosing-language-tags#langsubtag">W3: The primary language subtag</a></p>
+</aside>
+</aside>
+</section>
+<section id="startpage-languages">
+<span id="id7"></span><h2><a class="toc-backref" href="#id10" role="doc-backlink">Startpage languages</a><a class="headerlink" href="#startpage-languages" title="Link to this heading">¶</a></h2>
+<dl>
+<dt><a class="reference internal" href="#searx.engines.startpage.send_accept_language_header" title="searx.engines.startpage.send_accept_language_header"><code class="xref py py-obj docutils literal notranslate"><span class="pre">send_accept_language_header</span></code></a>:</dt><dd><p>The displayed name in Startpage’s settings page depend on the location of the
+IP when <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> HTTP header is unset. In <a class="reference internal" href="#searx.engines.startpage.fetch_traits" title="searx.engines.startpage.fetch_traits"><code class="xref py py-obj docutils literal notranslate"><span class="pre">fetch_traits</span></code></a>
+we use:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;Accept-Language&#39;</span><span class="p">:</span> <span class="s2">&quot;en-US,en;q=0.5&quot;</span><span class="p">,</span>
+<span class="o">..</span>
+</pre></div>
+</div>
+<p>to get uniform names independent from the IP).</p>
+</dd>
+</dl>
+</section>
+<section id="startpage-categories">
+<span id="id8"></span><h2><a class="toc-backref" href="#id11" role="doc-backlink">Startpage categories</a><a class="headerlink" href="#startpage-categories" title="Link to this heading">¶</a></h2>
+<p>Startpage’s category (for Web-search, News, Videos, ..) is set by
+<a class="reference internal" href="#searx.engines.startpage.startpage_categ" title="searx.engines.startpage.startpage_categ"><code class="xref py py-obj docutils literal notranslate"><span class="pre">startpage_categ</span></code></a> in settings.yml:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span> <span class="n">name</span><span class="p">:</span> <span class="n">startpage</span>
+ <span class="n">engine</span><span class="p">:</span> <span class="n">startpage</span>
+ <span class="n">startpage_categ</span><span class="p">:</span> <span class="n">web</span>
+ <span class="o">...</span>
+</pre></div>
+</div>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>The default category is <code class="docutils literal notranslate"><span class="pre">web</span></code> .. and other categories than <code class="docutils literal notranslate"><span class="pre">web</span></code> are not
+yet implemented.</p>
+</div>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.startpage.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/startpage.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.startpage.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch <a class="reference internal" href="#startpage-languages"><span class="std std-ref">languages</span></a> and <a class="reference internal" href="#startpage-regions"><span class="std std-ref">regions</span></a> from Startpage.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.startpage.get_sc_code">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">get_sc_code</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">searxng_locale</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/startpage.html#get_sc_code"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.startpage.get_sc_code" title="Link to this definition">¶</a></dt>
+<dd><p>Get an actual <code class="docutils literal notranslate"><span class="pre">sc</span></code> argument from Startpage’s search form (HTML page).</p>
+<p>Startpage puts a <code class="docutils literal notranslate"><span class="pre">sc</span></code> argument on every HTML <a class="reference internal" href="#searx.engines.startpage.search_form_xpath" title="searx.engines.startpage.search_form_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search</span> <span class="pre">form</span></code></a>. Without this argument Startpage considers the request
+is from a bot. We do not know what is encoded in the value of the <code class="docutils literal notranslate"><span class="pre">sc</span></code>
+argument, but it seems to be a kind of a <em>time-stamp</em>.</p>
+<p>Startpage’s search form generates a new sc-code on each request. This
+function scrap a new sc-code from Startpage’s home page every
+<a class="reference internal" href="#searx.engines.startpage.sc_code_cache_sec" title="searx.engines.startpage.sc_code_cache_sec"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sc_code_cache_sec</span></code></a> seconds.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.startpage.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/startpage.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.startpage.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble a Startpage request.</p>
+<p>To avoid CAPTCHA we need to send a well formed HTTP POST request with a
+cookie. We need to form a request that is identical to the request build by
+Startpage’s search form:</p>
+<ul class="simple">
+<li><p>in the cookie the <strong>region</strong> is selected</p></li>
+<li><p>in the HTTP POST data the <strong>language</strong> is selected</p></li>
+</ul>
+<p>Additionally the arguments form Startpage’s search form needs to be set in
+HTML POST data / compare <code class="docutils literal notranslate"><span class="pre">&lt;input&gt;</span></code> elements: <a class="reference internal" href="#searx.engines.startpage.search_form_xpath" title="searx.engines.startpage.search_form_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_form_xpath</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.startpage.max_page">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">max_page</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">18</span></em><a class="headerlink" href="#searx.engines.startpage.max_page" title="Link to this definition">¶</a></dt>
+<dd><p>Tested 18 pages maximum (argument <code class="docutils literal notranslate"><span class="pre">page</span></code>), to be save max is set to 20.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.startpage.sc_code_cache_sec">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">sc_code_cache_sec</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">30</span></em><a class="headerlink" href="#searx.engines.startpage.sc_code_cache_sec" title="Link to this definition">¶</a></dt>
+<dd><p>Time in seconds the sc-code is cached in memory <a class="reference internal" href="#searx.engines.startpage.get_sc_code" title="searx.engines.startpage.get_sc_code"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_sc_code</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.startpage.search_form_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">search_form_xpath</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'//form[&#64;id=&quot;search&quot;]'</span></em><a class="headerlink" href="#searx.engines.startpage.search_form_xpath" title="Link to this definition">¶</a></dt>
+<dd><p>XPath of Startpage’s origin search form</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.startpage.send_accept_language_header">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">send_accept_language_header</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">True</span></em><a class="headerlink" href="#searx.engines.startpage.send_accept_language_header" title="Link to this definition">¶</a></dt>
+<dd><p>Startpage tries to guess user’s language and territory from the HTTP
+<code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code>. Optional the user can select a search-language (can be
+different to the UI language) and a region filter.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.startpage.startpage_categ">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.startpage.</span></span><span class="sig-name descname"><span class="pre">startpage_categ</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'web'</span></em><a class="headerlink" href="#searx.engines.startpage.startpage_categ" title="Link to this definition">¶</a></dt>
+<dd><p>Startpage’s category, visit <a class="reference internal" href="#startpage-categories"><span class="std std-ref">Startpage categories</span></a>.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="seekr.html" title="previous chapter">Seekr Engines</a>
+ <li>Next: <a href="tagesschau.html" title="next chapter">Tagesschau API</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/startpage.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/tagesschau.html b/dev/engines/online/tagesschau.html
new file mode 100644
index 000000000..53b349259
--- /dev/null
+++ b/dev/engines/online/tagesschau.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Tagesschau API &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Torznab WebAPI" href="torznab.html" />
+ <link rel="prev" title="Startpage Engines" href="startpage.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="torznab.html" title="Torznab WebAPI"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="startpage.html" title="Startpage Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Tagesschau API</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="tagesschau-api">
+<span id="tagesschau-engine"></span><h1>Tagesschau API<a class="headerlink" href="#tagesschau-api" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.tagesschau">ARD: <a class="reference external" href="https://github.com/AndreasFischer1985/tagesschau-api/blob/main/README_en.md">Tagesschau API</a></p>
+<p>The Tagesschau is a news program of the ARD. Via the <a class="reference external" href="https://github.com/AndreasFischer1985/tagesschau-api/blob/main/README_en.md">Tagesschau API</a>, current
+news and media reports are available in JSON format. The <a class="reference external" href="https://github.com/bundesAPI">Bundesstelle für Open
+Data</a> offers a <a class="reference external" href="https://swagger.io/specification/">OpenAPI</a> portal at <a class="reference external" href="https://bund.dev/apis">bundDEV</a> where APIs are documented an can
+be tested.</p>
+<p>This SearXNG engine uses the <a class="reference external" href="http://tagesschau.api.bund.dev/">/api2u/search</a> API.</p>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.tagesschau.use_source_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tagesschau.</span></span><span class="sig-name descname"><span class="pre">use_source_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">True</span></em><a class="headerlink" href="#searx.engines.tagesschau.use_source_url" title="Link to this definition">¶</a></dt>
+<dd><p>When set to false, display URLs from Tagesschau, and not the actual source
+(e.g. NDR, WDR, SWR, HR, …)</p>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>The actual source may contain additional content, such as commentary, that is
+not displayed in the Tagesschau.</p>
+</div>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="startpage.html" title="previous chapter">Startpage Engines</a>
+ <li>Next: <a href="torznab.html" title="next chapter">Torznab WebAPI</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/tagesschau.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/torznab.html b/dev/engines/online/torznab.html
new file mode 100644
index 000000000..cf2992871
--- /dev/null
+++ b/dev/engines/online/torznab.html
@@ -0,0 +1,264 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Torznab WebAPI &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Void Linux binary packages" href="void.html" />
+ <link rel="prev" title="Tagesschau API" href="tagesschau.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="void.html" title="Void Linux binary packages"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="tagesschau.html" title="Tagesschau API"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Torznab WebAPI</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="torznab-webapi">
+<span id="torznab-engine"></span><h1>Torznab WebAPI<a class="headerlink" href="#torznab-webapi" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id1">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id2">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.torznab"><a class="reference external" href="https://torznab.github.io/spec-1.3-draft/index.html">Torznab</a> is an API specification that provides a standardized way to query
+torrent site for content. It is used by a number of torrent applications,
+including <a class="reference external" href="https://github.com/Prowlarr/Prowlarr">Prowlarr</a> and <a class="reference external" href="https://github.com/Jackett/Jackett">Jackett</a>.</p>
+<p>Using this engine together with <a class="reference external" href="https://github.com/Prowlarr/Prowlarr">Prowlarr</a> or <a class="reference external" href="https://github.com/Jackett/Jackett">Jackett</a> allows you to search
+a huge number of torrent sites which are not directly supported.</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following settings:</p>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">base_url</span></code>:</dt><dd><p>Torznab endpoint URL.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">api_key</span></code>:</dt><dd><p>The API key to use for authentication.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">torznab_categories</span></code>:</dt><dd><p>The categories to use for searching. This is a list of category IDs. See
+<a class="reference external" href="https://wiki.servarr.com/en/prowlarr/cardigann-yml-definition#categories">Prowlarr-categories</a> or <a class="reference external" href="https://github.com/Jackett/Jackett/wiki/Jackett-Categories">Jackett-categories</a> for more information.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">show_torrent_files</span></code>:</dt><dd><p>Whether to show the torrent file in the search results. Be careful as using
+this with <a class="reference external" href="https://github.com/Prowlarr/Prowlarr">Prowlarr</a> or <a class="reference external" href="https://github.com/Jackett/Jackett">Jackett</a> leaks the API key. This should be used only
+if you are querying a Torznab endpoint without authentication or if the
+instance is private. Be aware that private trackers may ban you if you share
+the torrent file. Defaults to <code class="docutils literal notranslate"><span class="pre">false</span></code>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">show_magnet_links</span></code>:</dt><dd><p>Whether to show the magnet link in the search results. Be aware that private
+trackers may ban you if you share the magnet link. Defaults to <code class="docutils literal notranslate"><span class="pre">true</span></code>.</p>
+</dd>
+</dl>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.torznab.build_result">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.torznab.</span></span><span class="sig-name descname"><span class="pre">build_result</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">item</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Element</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../../../_modules/searx/engines/torznab.html#build_result"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.torznab.build_result" title="Link to this definition">¶</a></dt>
+<dd><p>Build a result from a XML item.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.torznab.get_attribute">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.torznab.</span></span><span class="sig-name descname"><span class="pre">get_attribute</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">item</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">etree.Element</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">property_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../../_modules/searx/engines/torznab.html#get_attribute"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.torznab.get_attribute" title="Link to this definition">¶</a></dt>
+<dd><p>Get attribute from item.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.torznab.get_torznab_attribute">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.torznab.</span></span><span class="sig-name descname"><span class="pre">get_torznab_attribute</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">item</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">etree.Element</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">attribute_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../../_modules/searx/engines/torznab.html#get_torznab_attribute"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.torznab.get_torznab_attribute" title="Link to this definition">¶</a></dt>
+<dd><p>Get torznab special attribute from item.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.torznab.init">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.torznab.</span></span><span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_settings</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/torznab.html#init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.torznab.init" title="Link to this definition">¶</a></dt>
+<dd><p>Initialize the engine.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.torznab.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.torznab.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../../../_modules/searx/engines/torznab.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.torznab.request" title="Link to this definition">¶</a></dt>
+<dd><p>Build the request params.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.torznab.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.torznab.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">httpx.Response</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../../../_modules/searx/engines/torznab.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.torznab.response" title="Link to this definition">¶</a></dt>
+<dd><p>Parse the XML response and return a list of results.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="tagesschau.html" title="previous chapter">Tagesschau API</a>
+ <li>Next: <a href="void.html" title="next chapter">Void Linux binary packages</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/torznab.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/void.html b/dev/engines/online/void.html
new file mode 100644
index 000000000..4b8b5983d
--- /dev/null
+++ b/dev/engines/online/void.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Void Linux binary packages &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Wallhaven" href="wallhaven.html" />
+ <link rel="prev" title="Torznab WebAPI" href="torznab.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="wallhaven.html" title="Wallhaven"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="torznab.html" title="Torznab WebAPI"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Void Linux binary packages</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="void-linux-binary-packages">
+<span id="voidlinux-engine"></span><h1>Void Linux binary packages<a class="headerlink" href="#void-linux-binary-packages" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.voidlinux">SearXNG engine for <a class="reference external" href="https://voidlinux.org/packages/">Void Linux binary packages</a>. Void is a general purpose
+operating system, based on the monolithic Linux kernel. Its package system
+allows you to quickly install, update and remove software; software is provided
+in binary packages or can be built directly from sources with the help of the
+XBPS source packages collection.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.voidlinux.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.voidlinux.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/voidlinux.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.voidlinux.response" title="Link to this definition">¶</a></dt>
+<dd><p>At Void Linux, several packages sometimes share the same source code
+(template) and therefore also have the same URL. Results with identical
+URLs are merged as one result for SearXNG.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.voidlinux.ARCH_RE">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.voidlinux.</span></span><span class="sig-name descname"><span class="pre">ARCH_RE</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">re.compile('aarch64-musl|armv6l-musl|armv7l-musl|x86_64-musl|aarch64|armv6l|armv7l|i686|x86_64')</span></em><a class="headerlink" href="#searx.engines.voidlinux.ARCH_RE" title="Link to this definition">¶</a></dt>
+<dd><p>Regular expresion that match a architecture in the query string.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.voidlinux.void_arch">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.voidlinux.</span></span><span class="sig-name descname"><span class="pre">void_arch</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'x86_64'</span></em><a class="headerlink" href="#searx.engines.voidlinux.void_arch" title="Link to this definition">¶</a></dt>
+<dd><p>Default architecture to search for. For valid values see <a class="reference internal" href="#searx.engines.voidlinux.ARCH_RE" title="searx.engines.voidlinux.ARCH_RE"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ARCH_RE</span></code></a></p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="torznab.html" title="previous chapter">Torznab WebAPI</a>
+ <li>Next: <a href="wallhaven.html" title="next chapter">Wallhaven</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/void.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/wallhaven.html b/dev/engines/online/wallhaven.html
new file mode 100644
index 000000000..7aa99a64d
--- /dev/null
+++ b/dev/engines/online/wallhaven.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Wallhaven &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Wikimedia" href="wikipedia.html" />
+ <link rel="prev" title="Void Linux binary packages" href="void.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="wikipedia.html" title="Wikimedia"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="void.html" title="Void Linux binary packages"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Wallhaven</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="wallhaven">
+<span id="wallhaven-engine"></span><h1>Wallhaven<a class="headerlink" href="#wallhaven" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.wallhaven"><a class="reference external" href="https://wallhaven.cc/about#Copyright">Wallhaven</a> is a site created by and for people who like wallpapers.</p>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wallhaven.api_key">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wallhaven.</span></span><span class="sig-name descname"><span class="pre">api_key</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.wallhaven.api_key" title="Link to this definition">¶</a></dt>
+<dd><p>If you own an API key you can add it here, further read <a class="reference external" href="https://wallhaven.cc/help/api#limits">Rate Limiting and
+Errors</a>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wallhaven.safesearch_map">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wallhaven.</span></span><span class="sig-name descname"><span class="pre">safesearch_map</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{0:</span> <span class="pre">'111',</span> <span class="pre">1:</span> <span class="pre">'110',</span> <span class="pre">2:</span> <span class="pre">'100'}</span></em><a class="headerlink" href="#searx.engines.wallhaven.safesearch_map" title="Link to this definition">¶</a></dt>
+<dd><p>Turn purities on(1) or off(0) NSFW requires a valid API key.</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>100/110/111 &lt;-- Bits stands for: SFW, Sketchy and NSFW
+</pre></div>
+</div>
+<p><a class="reference external" href="https://wallhaven.cc/faq#What-are-SFW-Sketchy-and-NSFW-all-about">What are SFW, Sketchy and NSFW all about?</a>:</p>
+<ul class="simple">
+<li><p>SFW = “Safe for work” wallpapers. <em>Grandma approves.</em></p></li>
+<li><p>Sketchy = Not quite SFW not quite NSFW. <em>Grandma might be uncomfortable.</em></p></li>
+<li><p>NSFW = “Not safe for work”. <em>Grandma isn’t sure who you are anymore.</em></p></li>
+</ul>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="void.html" title="previous chapter">Void Linux binary packages</a>
+ <li>Next: <a href="wikipedia.html" title="next chapter">Wikimedia</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/wallhaven.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/wikipedia.html b/dev/engines/online/wikipedia.html
new file mode 100644
index 000000000..d62049368
--- /dev/null
+++ b/dev/engines/online/wikipedia.html
@@ -0,0 +1,367 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Wikimedia &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Yacy" href="yacy.html" />
+ <link rel="prev" title="Wallhaven" href="wallhaven.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="yacy.html" title="Yacy"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="wallhaven.html" title="Wallhaven"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Wikimedia</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="wikimedia">
+<span id="wikimedia-engines"></span><h1>Wikimedia<a class="headerlink" href="#wikimedia" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.engines.wikipedia" id="id1">Wikipedia</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.engines.wikidata" id="id2">Wikidata</a></p></li>
+</ul>
+</nav>
+<section id="module-searx.engines.wikipedia">
+<span id="wikipedia"></span><span id="wikipedia-engine"></span><h2><a class="toc-backref" href="#id1" role="doc-backlink">Wikipedia</a><a class="headerlink" href="#module-searx.engines.wikipedia" title="Link to this heading">¶</a></h2>
+<p>This module implements the Wikipedia engine. Some of this implementations
+are shared by other engines:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#wikidata-engine"><span class="std std-ref">Wikidata</span></a></p></li>
+</ul>
+<p>The list of supported languages is <a class="reference internal" href="#searx.engines.wikipedia.fetch_wikimedia_traits" title="searx.engines.wikipedia.fetch_wikimedia_traits"><code class="xref py py-obj docutils literal notranslate"><span class="pre">fetched</span></code></a> from
+the article linked by <a class="reference internal" href="#searx.engines.wikipedia.list_of_wikipedias" title="searx.engines.wikipedia.list_of_wikipedias"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list_of_wikipedias</span></code></a>.</p>
+<p>Unlike traditional search engines, wikipedia does not support one Wikipedia for
+all languages, but there is one Wikipedia for each supported language. Some of
+these Wikipedias have a <a class="reference external" href="https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter">LanguageConverter</a> enabled
+(<a class="reference internal" href="#searx.engines.wikipedia.rest_v1_summary_url" title="searx.engines.wikipedia.rest_v1_summary_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">rest_v1_summary_url</span></code></a>).</p>
+<p>A <a class="reference external" href="https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter">LanguageConverter</a> (LC) is a system based on language variants that
+automatically converts the content of a page into a different variant. A variant
+is mostly the same language in a different script.</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://meta.wikimedia.org/wiki/Wikipedias_in_multiple_writing_systems">Wikipedias in multiple writing systems</a></p></li>
+<li><p><a class="reference external" href="https://en.wikipedia.org/wiki/Chinese_Wikipedia#Automatic_conversion_between_traditional_and_simplified_Chinese_characters">Automatic conversion between traditional and simplified Chinese characters</a></p></li>
+</ul>
+<dl class="simple">
+<dt><a class="reference external" href="https://github.com/searx/searx/pull/2554">PR-2554</a>:</dt><dd><p>The Wikipedia link returned by the API is still the same in all cases
+(<a class="reference external" href="https://zh.wikipedia.org/wiki/%E5%87%BA%E7%A7%9F%E8%BB%8A">https://zh.wikipedia.org/wiki/出租車</a>) but if your browser’s
+<code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> is set to any of <code class="docutils literal notranslate"><span class="pre">zh</span></code>, <code class="docutils literal notranslate"><span class="pre">zh-CN</span></code>, <code class="docutils literal notranslate"><span class="pre">zh-TW</span></code>, <code class="docutils literal notranslate"><span class="pre">zh-HK</span></code>
+or .. Wikipedia’s LC automatically returns the desired script in their
+web-page.</p>
+<ul class="simple">
+<li><p>You can test the API here: <a class="reference external" href="https://reqbin.com/gesg2kvx">https://reqbin.com/gesg2kvx</a></p></li>
+</ul>
+</dd>
+</dl>
+<p>To support Wikipedia’s <a class="reference external" href="https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter">LanguageConverter</a>, a SearXNG request to Wikipedia uses
+<a class="reference internal" href="#searx.engines.wikipedia.get_wiki_params" title="searx.engines.wikipedia.get_wiki_params"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_wiki_params</span></code></a> and <code class="xref py py-obj docutils literal notranslate"><span class="pre">wiki_lc_locale_variants'</span> <span class="pre">in</span> <span class="pre">the</span>
+<span class="pre">:py:obj:`fetch_wikimedia_traits</span></code> function.</p>
+<p>To test in SearXNG, query for <code class="docutils literal notranslate"><span class="pre">!wp</span> <span class="pre">出租車</span></code> with each of the available Chinese
+options:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">!wp</span> <span class="pre">出租車</span> <span class="pre">:zh</span></code> should show 出租車</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">!wp</span> <span class="pre">出租車</span> <span class="pre">:zh-CN</span></code> should show 出租车</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">!wp</span> <span class="pre">出租車</span> <span class="pre">:zh-TW</span></code> should show 計程車</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">!wp</span> <span class="pre">出租車</span> <span class="pre">:zh-HK</span></code> should show 的士</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">!wp</span> <span class="pre">出租車</span> <span class="pre">:zh-SG</span></code> should show 德士</p></li>
+</ul>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.fetch_wikimedia_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">fetch_wikimedia_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/wikipedia.html#fetch_wikimedia_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.wikipedia.fetch_wikimedia_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages from Wikipedia. Not all languages from the
+<a class="reference internal" href="#searx.engines.wikipedia.list_of_wikipedias" title="searx.engines.wikipedia.list_of_wikipedias"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list_of_wikipedias</span></code></a> are supported by SearXNG locales, only those
+known from <a class="reference internal" href="../../../src/searx.locales.html#searx.locales.LOCALE_NAMES" title="searx.locales.LOCALE_NAMES"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.locales.LOCALE_NAMES</span></code></a> or those with a minimal
+<a class="reference internal" href="#searx.engines.wikipedia.wikipedia_article_depth" title="searx.engines.wikipedia.wikipedia_article_depth"><code class="xref py py-obj docutils literal notranslate"><span class="pre">editing</span> <span class="pre">depth</span></code></a>.</p>
+<p>The location of the Wikipedia address of a language is mapped in a
+<a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits.custom" title="searx.enginelib.traits.EngineTraits.custom"><code class="xref py py-obj docutils literal notranslate"><span class="pre">custom</span> <span class="pre">field</span></code></a>
+(<code class="docutils literal notranslate"><span class="pre">wiki_netloc</span></code>). Here is a reduced example:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">traits</span><span class="o">.</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;wiki_netloc&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;en&quot;</span><span class="p">:</span> <span class="s2">&quot;en.wikipedia.org&quot;</span><span class="p">,</span>
+ <span class="o">..</span>
+ <span class="s2">&quot;gsw&quot;</span><span class="p">:</span> <span class="s2">&quot;als.wikipedia.org&quot;</span><span class="p">,</span>
+ <span class="o">..</span>
+ <span class="s2">&quot;zh&quot;</span><span class="p">:</span> <span class="s2">&quot;zh.wikipedia.org&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;zh-classical&quot;</span><span class="p">:</span> <span class="s2">&quot;zh-classical.wikipedia.org&quot;</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.get_wiki_params">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">get_wiki_params</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sxng_locale</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">eng_traits</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/wikipedia.html#get_wiki_params"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.wikipedia.get_wiki_params" title="Link to this definition">¶</a></dt>
+<dd><p>Returns the Wikipedia language tag and the netloc that fits to the
+<code class="docutils literal notranslate"><span class="pre">sxng_locale</span></code>. To support <a class="reference external" href="https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter">LanguageConverter</a> this function rates a locale
+(region) higher than a language (compare <a class="reference internal" href="#searx.engines.wikipedia.wiki_lc_locale_variants" title="searx.engines.wikipedia.wiki_lc_locale_variants"><code class="xref py py-obj docutils literal notranslate"><span class="pre">wiki_lc_locale_variants</span></code></a>).</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/wikipedia.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.wikipedia.request" title="Link to this definition">¶</a></dt>
+<dd><p>Assemble a request (<a class="reference external" href="https://en.wikipedia.org/api/rest_v1/#/Page%20content/get_page_summary__title_">wikipedia rest_v1 summary API</a>).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.display_type">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">display_type</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">['infobox']</span></em><a class="headerlink" href="#searx.engines.wikipedia.display_type" title="Link to this definition">¶</a></dt>
+<dd><p>A list of display types composed from <code class="docutils literal notranslate"><span class="pre">infobox</span></code> and <code class="docutils literal notranslate"><span class="pre">list</span></code>. The latter
+one will add a hit to the result list. The first one will show a hit in the
+info box. Both values can be set, or one of the two can be set.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.list_of_wikipedias">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">list_of_wikipedias</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://meta.wikimedia.org/wiki/List_of_Wikipedias'</span></em><a class="headerlink" href="#searx.engines.wikipedia.list_of_wikipedias" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://meta.wikimedia.org/wiki/List_of_Wikipedias">List of all wikipedias</a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.rest_v1_summary_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">rest_v1_summary_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://{wiki_netloc}/api/rest_v1/page/summary/{title}'</span></em><a class="headerlink" href="#searx.engines.wikipedia.rest_v1_summary_url" title="Link to this definition">¶</a></dt>
+<dd><dl class="simple">
+<dt><a class="reference external" href="https://en.wikipedia.org/api/rest_v1/#/Page%20content/get_page_summary__title_">wikipedia rest_v1 summary API</a>:</dt><dd><p>The summary response includes an extract of the first paragraph of the page in
+plain text and HTML as well as the type of page. This is useful for page
+previews (fka. Hovercards, aka. Popups) on the web and link previews in the
+apps.</p>
+</dd>
+<dt>HTTP <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> header (<a class="reference internal" href="#searx.engines.wikipedia.send_accept_language_header" title="searx.engines.wikipedia.send_accept_language_header"><code class="xref py py-obj docutils literal notranslate"><span class="pre">send_accept_language_header</span></code></a>):</dt><dd><p>The desired language variant code for wikis where <a class="reference external" href="https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter">LanguageConverter</a> is
+enabled.</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.send_accept_language_header">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">send_accept_language_header</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">True</span></em><a class="headerlink" href="#searx.engines.wikipedia.send_accept_language_header" title="Link to this definition">¶</a></dt>
+<dd><p>The HTTP <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> header is needed for wikis where
+<a class="reference external" href="https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter">LanguageConverter</a> is enabled.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.wiki_lc_locale_variants">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">wiki_lc_locale_variants</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'zh':</span> <span class="pre">('zh-CN',</span> <span class="pre">'zh-HK',</span> <span class="pre">'zh-MO',</span> <span class="pre">'zh-MY',</span> <span class="pre">'zh-SG',</span> <span class="pre">'zh-TW'),</span> <span class="pre">'zh-classical':</span> <span class="pre">('zh-classical',)}</span></em><a class="headerlink" href="#searx.engines.wikipedia.wiki_lc_locale_variants" title="Link to this definition">¶</a></dt>
+<dd><p>Mapping rule of the <a class="reference external" href="https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter">LanguageConverter</a> to map a language and its variants to
+a Locale (used in the HTTP <code class="docutils literal notranslate"><span class="pre">Accept-Language</span></code> header). For example see <a class="reference external" href="https://meta.wikimedia.org/wiki/Wikipedias_in_multiple_writing_systems#Chinese">LC
+Chinese</a>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wikipedia.wikipedia_article_depth">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikipedia.</span></span><span class="sig-name descname"><span class="pre">wikipedia_article_depth</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://meta.wikimedia.org/wiki/Wikipedia_article_depth'</span></em><a class="headerlink" href="#searx.engines.wikipedia.wikipedia_article_depth" title="Link to this definition">¶</a></dt>
+<dd><p>The <em>editing depth</em> of Wikipedia is one of several possible rough indicators
+of the encyclopedia’s collaborative quality, showing how frequently its articles
+are updated. The measurement of depth was introduced after some limitations of
+the classic measurement of article count were realized.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.engines.wikidata">
+<span id="wikidata"></span><span id="wikidata-engine"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Wikidata</a><a class="headerlink" href="#module-searx.engines.wikidata" title="Link to this heading">¶</a></h2>
+<p>This module implements the Wikidata engine. Some implementations are shared
+from <a class="reference internal" href="#wikipedia-engine"><span class="std std-ref">Wikipedia</span></a>.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.wikidata.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikidata.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/wikidata.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.wikidata.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Uses languages evaluated from <a class="reference internal" href="#searx.engines.wikipedia.fetch_wikimedia_traits" title="searx.engines.wikipedia.fetch_wikimedia_traits"><code class="xref py py-obj docutils literal notranslate"><span class="pre">wikipedia.fetch_wikimedia_traits</span></code></a> and removes</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">traits.custom['wiki_netloc']</span></code>: wikidata does not have net-locations for
+the languages and the list of all</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">traits.custom['WIKIPEDIA_LANGUAGES']</span></code>: not used in the wikipedia engine</p></li>
+</ul>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.wikidata.get_thumbnail">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikidata.</span></span><span class="sig-name descname"><span class="pre">get_thumbnail</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">img_src</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/wikidata.html#get_thumbnail"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.wikidata.get_thumbnail" title="Link to this definition">¶</a></dt>
+<dd><p>Get Thumbnail image from wikimedia commons</p>
+<p>Images from commons.wikimedia.org are (HTTP) redirected to
+upload.wikimedia.org. The redirected URL can be calculated by this
+function.</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://stackoverflow.com/a/33691240">https://stackoverflow.com/a/33691240</a></p></li>
+</ul>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.wikidata.display_type">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.wikidata.</span></span><span class="sig-name descname"><span class="pre">display_type</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">['infobox']</span></em><a class="headerlink" href="#searx.engines.wikidata.display_type" title="Link to this definition">¶</a></dt>
+<dd><p>A list of display types composed from <code class="docutils literal notranslate"><span class="pre">infobox</span></code> and <code class="docutils literal notranslate"><span class="pre">list</span></code>. The latter
+one will add a hit to the result list. The first one will show a hit in the
+info box. Both values can be set, or one of the two can be set.</p>
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="wallhaven.html" title="previous chapter">Wallhaven</a>
+ <li>Next: <a href="yacy.html" title="next chapter">Yacy</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/wikipedia.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/yacy.html b/dev/engines/online/yacy.html
new file mode 100644
index 000000000..e614e6436
--- /dev/null
+++ b/dev/engines/online/yacy.html
@@ -0,0 +1,280 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Yacy &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Yahoo Engine" href="yahoo.html" />
+ <link rel="prev" title="Wikimedia" href="wikipedia.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="yahoo.html" title="Yahoo Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="wikipedia.html" title="Wikimedia"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Yacy</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="yacy">
+<span id="yacy-engine"></span><h1>Yacy<a class="headerlink" href="#yacy" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id2">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.yacy"><a class="reference external" href="https://yacy.net/">YaCy</a> is a free distributed search engine, built on the principles of
+peer-to-peer (P2P) networks.</p>
+<p>API: <a class="reference external" href="https://wiki.yacy.net/index.php/Dev:APIyacysearch">Dev:APIyacysearch</a></p>
+<p>Releases:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/yacy/yacy_search_server/tags">https://github.com/yacy/yacy_search_server/tags</a></p></li>
+<li><p><a class="reference external" href="https://download.yacy.net/">https://download.yacy.net/</a></p></li>
+</ul>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following (additional) settings:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.yacy.http_digest_auth_user" title="searx.engines.yacy.http_digest_auth_user"><code class="xref py py-obj docutils literal notranslate"><span class="pre">http_digest_auth_user</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.yacy.http_digest_auth_pass" title="searx.engines.yacy.http_digest_auth_pass"><code class="xref py py-obj docutils literal notranslate"><span class="pre">http_digest_auth_pass</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.yacy.search_mode" title="searx.engines.yacy.search_mode"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_mode</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.yacy.search_type" title="searx.engines.yacy.search_type"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_type</span></code></a></p></li>
+</ul>
+<p>The <a class="reference internal" href="#searx.engines.yacy.base_url" title="searx.engines.yacy.base_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">base_url</span></code></a> has to be set in the engine named <cite>yacy</cite> and is used by
+all yacy engines.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yacy</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yacy</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">general</span>
+<span class="w"> </span><span class="nt">search_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">text</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ya</span>
+<span class="w"> </span><span class="nt">base_url</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://yacy.searchlab.eu</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://search.lomig.me</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://yacy.ecosys.eu</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://search.webproject.link</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yacy images</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yacy</span>
+<span class="w"> </span><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">images</span>
+<span class="w"> </span><span class="nt">search_type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">image</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yai</span>
+<span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.yacy.base_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yacy.</span></span><span class="sig-name descname"><span class="pre">base_url</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><span class="pre">list</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://yacy.searchlab.eu'</span></em><a class="headerlink" href="#searx.engines.yacy.base_url" title="Link to this definition">¶</a></dt>
+<dd><p>The value is an URL or a list of URLs. In the latter case instance will be
+selected randomly.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.yacy.http_digest_auth_pass">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yacy.</span></span><span class="sig-name descname"><span class="pre">http_digest_auth_pass</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.yacy.http_digest_auth_pass" title="Link to this definition">¶</a></dt>
+<dd><p>HTTP digest password for the local YACY instance</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.yacy.http_digest_auth_user">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yacy.</span></span><span class="sig-name descname"><span class="pre">http_digest_auth_user</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.yacy.http_digest_auth_user" title="Link to this definition">¶</a></dt>
+<dd><p>HTTP digest user for the local YACY instance</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.yacy.search_mode">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yacy.</span></span><span class="sig-name descname"><span class="pre">search_mode</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'global'</span></em><a class="headerlink" href="#searx.engines.yacy.search_mode" title="Link to this definition">¶</a></dt>
+<dd><p>Yacy search mode <code class="docutils literal notranslate"><span class="pre">global</span></code> or <code class="docutils literal notranslate"><span class="pre">local</span></code>. By default, Yacy operates in <code class="docutils literal notranslate"><span class="pre">global</span></code>
+mode.</p>
+<dl class="simple">
+<dt><code class="docutils literal notranslate"><span class="pre">global</span></code></dt><dd><p>Peer-to-Peer search</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">local</span></code></dt><dd><p>Privacy or Stealth mode, restricts the search to local yacy instance.</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.yacy.search_type">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yacy.</span></span><span class="sig-name descname"><span class="pre">search_type</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'text'</span></em><a class="headerlink" href="#searx.engines.yacy.search_type" title="Link to this definition">¶</a></dt>
+<dd><p>One of <code class="docutils literal notranslate"><span class="pre">text</span></code>, <code class="docutils literal notranslate"><span class="pre">image</span></code> / The search-types <code class="docutils literal notranslate"><span class="pre">app</span></code>, <code class="docutils literal notranslate"><span class="pre">audio</span></code> and
+<code class="docutils literal notranslate"><span class="pre">video</span></code> are not yet implemented (Pull-Requests are welcome).</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="wikipedia.html" title="previous chapter">Wikimedia</a>
+ <li>Next: <a href="yahoo.html" title="next chapter">Yahoo Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/yacy.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/yahoo.html b/dev/engines/online/yahoo.html
new file mode 100644
index 000000000..039056bf0
--- /dev/null
+++ b/dev/engines/online/yahoo.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Yahoo Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Z-Library" href="zlibrary.html" />
+ <link rel="prev" title="Yacy" href="yacy.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="zlibrary.html" title="Z-Library"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="yacy.html" title="Yacy"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Yahoo Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="yahoo-engine">
+<span id="id1"></span><h1>Yahoo Engine<a class="headerlink" href="#yahoo-engine" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.yahoo">Yahoo Search (Web)</p>
+<p>Languages are supported by mapping the language to a domain. If domain is not
+found in <a class="reference internal" href="#searx.engines.yahoo.lang2domain" title="searx.engines.yahoo.lang2domain"><code class="xref py py-obj docutils literal notranslate"><span class="pre">lang2domain</span></code></a> URL <code class="docutils literal notranslate"><span class="pre">&lt;lang&gt;.search.yahoo.com</span></code> is used.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.yahoo.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yahoo.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/yahoo.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.yahoo.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages from yahoo</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.yahoo.parse_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yahoo.</span></span><span class="sig-name descname"><span class="pre">parse_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">url_string</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/yahoo.html#parse_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.yahoo.parse_url" title="Link to this definition">¶</a></dt>
+<dd><p>remove yahoo-specific tracking-url</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.yahoo.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yahoo.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/yahoo.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.yahoo.request" title="Link to this definition">¶</a></dt>
+<dd><p>build request</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.yahoo.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yahoo.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/yahoo.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.yahoo.response" title="Link to this definition">¶</a></dt>
+<dd><p>parse response</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.yahoo.lang2domain">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.yahoo.</span></span><span class="sig-name descname"><span class="pre">lang2domain</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'any':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'bg':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'cs':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'da':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'el':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'en':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'et':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'he':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'hr':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'ja':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'ko':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'sk':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'sl':</span> <span class="pre">'search.yahoo.com',</span> <span class="pre">'zh_chs':</span> <span class="pre">'hk.search.yahoo.com',</span> <span class="pre">'zh_cht':</span> <span class="pre">'tw.search.yahoo.com'}</span></em><a class="headerlink" href="#searx.engines.yahoo.lang2domain" title="Link to this definition">¶</a></dt>
+<dd><p>Map language to domain</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="yacy.html" title="previous chapter">Yacy</a>
+ <li>Next: <a href="zlibrary.html" title="next chapter">Z-Library</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/yahoo.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online/zlibrary.html b/dev/engines/online/zlibrary.html
new file mode 100644
index 000000000..d4c23fd3f
--- /dev/null
+++ b/dev/engines/online/zlibrary.html
@@ -0,0 +1,257 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Z-Library &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Offline Concept" href="../offline_concept.html" />
+ <link rel="prev" title="Yahoo Engine" href="yahoo.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../offline_concept.html" title="Offline Concept"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="yahoo.html" title="Yahoo Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Z-Library</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="z-library">
+<span id="zlibrary-engine"></span><h1>Z-Library<a class="headerlink" href="#z-library" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<p class="topic-title">Contents</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id2">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id3">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.zlibrary"><a class="reference external" href="https://zlibrary-global.se/">Z-Library</a> (abbreviated as z-lib, formerly BookFinder) is a shadow library
+project for file-sharing access to scholarly journal articles, academic texts
+and general-interest books. It began as a mirror of Library Genesis, from which
+most of its books originate.</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>The engine has the following additional settings:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.zlibrary.zlib_year_from" title="searx.engines.zlibrary.zlib_year_from"><code class="xref py py-obj docutils literal notranslate"><span class="pre">zlib_year_from</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.zlibrary.zlib_year_to" title="searx.engines.zlibrary.zlib_year_to"><code class="xref py py-obj docutils literal notranslate"><span class="pre">zlib_year_to</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.zlibrary.zlib_ext" title="searx.engines.zlibrary.zlib_ext"><code class="xref py py-obj docutils literal notranslate"><span class="pre">zlib_ext</span></code></a></p></li>
+</ul>
+<p>With this options a SearXNG maintainer is able to configure <strong>additional</strong>
+engines for specific searches in Z-Library. For example a engine to search
+only for EPUB from 2010 to 2020.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">z-library 2010s epub</span>
+<span class="w"> </span><span class="nt">engine</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">zlibrary</span>
+<span class="w"> </span><span class="nt">shortcut</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">zlib2010s</span>
+<span class="w"> </span><span class="nt">zlib_year_from</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;2010&#39;</span>
+<span class="w"> </span><span class="nt">zlib_year_to</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;2020&#39;</span>
+<span class="w"> </span><span class="nt">zlib_ext</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;EPUB&#39;</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.zlibrary.fetch_traits">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.zlibrary.</span></span><span class="sig-name descname"><span class="pre">fetch_traits</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_traits</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../enginelib.html#searx.enginelib.traits.EngineTraits" title="searx.enginelib.traits.EngineTraits"><span class="pre">EngineTraits</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../../_modules/searx/engines/zlibrary.html#fetch_traits"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.zlibrary.fetch_traits" title="Link to this definition">¶</a></dt>
+<dd><p>Fetch languages and other search arguments from zlibrary’s search form.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.zlibrary.init">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.zlibrary.</span></span><span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine_settings</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../../_modules/searx/engines/zlibrary.html#init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.zlibrary.init" title="Link to this definition">¶</a></dt>
+<dd><p>Check of engine’s settings.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.zlibrary.zlib_ext">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.zlibrary.</span></span><span class="sig-name descname"><span class="pre">zlib_ext</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.zlibrary.zlib_ext" title="Link to this definition">¶</a></dt>
+<dd><p>Filter z-library’s results by a file ending. Common filters for example are
+<code class="docutils literal notranslate"><span class="pre">PDF</span></code> and <code class="docutils literal notranslate"><span class="pre">EPUB</span></code>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.zlibrary.zlib_year_from">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.zlibrary.</span></span><span class="sig-name descname"><span class="pre">zlib_year_from</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.zlibrary.zlib_year_from" title="Link to this definition">¶</a></dt>
+<dd><p>Filter z-library’s results by year from. E.g ‘2010’.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.zlibrary.zlib_year_to">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.zlibrary.</span></span><span class="sig-name descname"><span class="pre">zlib_year_to</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.zlibrary.zlib_year_to" title="Link to this definition">¶</a></dt>
+<dd><p>Filter z-library’s results by year to. E.g. ‘2010’.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="../demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../xpath.html">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="../mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="yahoo.html" title="previous chapter">Yahoo Engine</a>
+ <li>Next: <a href="../offline_concept.html" title="next chapter">Offline Concept</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online/zlibrary.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/online_url_search/tineye.html b/dev/engines/online_url_search/tineye.html
new file mode 100644
index 000000000..eac35322d
--- /dev/null
+++ b/dev/engines/online_url_search/tineye.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Tineye &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <link rel="next" title="Search API" href="../../search_api.html" />
+ <link rel="prev" title="SQL Engines" href="../offline/sql-engines.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../../search_api.html" title="Search API"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../offline/sql-engines.html" title="SQL Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="../index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Tineye</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="tineye">
+<span id="tineye-engine"></span><h1>Tineye<a class="headerlink" href="#tineye" title="Link to this heading">¶</a></h1>
+<p id="module-searx.engines.tineye">This engine implements <em>Tineye - reverse image search</em></p>
+<p>Using TinEye, you can search by image or perform what we call a reverse image
+search. You can do that by uploading an image or searching by URL. You can also
+simply drag and drop your images to start your search. TinEye constantly crawls
+the web and adds images to its index. Today, the TinEye index is over 50.2
+billion images <a class="reference external" href="https://tineye.com/how">[tineye.com]</a>.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>This SearXNG engine only supports <em>‘searching by URL’</em> and it does not use
+the official API <a class="reference external" href="https://api.tineye.com/python/docs/">[api.tineye.com]</a>.</p>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.tineye.parse_tineye_match">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tineye.</span></span><span class="sig-name descname"><span class="pre">parse_tineye_match</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">match_json</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/tineye.html#parse_tineye_match"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.tineye.parse_tineye_match" title="Link to this definition">¶</a></dt>
+<dd><p>Takes parsed JSON from the API server and turns it into a <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">dict</span></code></a>
+object.</p>
+<p>Attributes <a class="reference external" href="https://github.com/TinEye/pytineye/blob/main/pytineye/api.py">(class Match)</a></p>
+<ul class="simple">
+<li><p><cite>image_url</cite>, link to the result image.</p></li>
+<li><p><cite>domain</cite>, domain this result was found on.</p></li>
+<li><p><cite>score</cite>, a number (0 to 100) that indicates how closely the images match.</p></li>
+<li><p><cite>width</cite>, image width in pixels.</p></li>
+<li><p><cite>height</cite>, image height in pixels.</p></li>
+<li><p><cite>size</cite>, image area in pixels.</p></li>
+<li><p><cite>format</cite>, image format.</p></li>
+<li><p><cite>filesize</cite>, image size in bytes.</p></li>
+<li><p><cite>overlay</cite>, overlay URL.</p></li>
+<li><p><cite>tags</cite>, whether this match belongs to a collection or stock domain.</p></li>
+<li><p><cite>backlinks</cite>, a list of Backlink objects pointing to the original websites
+and image URLs. List items are instances of <a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">dict</span></code></a>, (<a class="reference external" href="https://github.com/TinEye/pytineye/blob/main/pytineye/api.py">Backlink</a>):</p>
+<ul>
+<li><p><cite>url</cite>, the image URL to the image.</p></li>
+<li><p><cite>backlink</cite>, the original website URL.</p></li>
+<li><p><cite>crawl_date</cite>, the date the image was crawled.</p></li>
+</ul>
+</li>
+</ul>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.tineye.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tineye.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/tineye.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.tineye.request" title="Link to this definition">¶</a></dt>
+<dd><p>Build TinEye HTTP request using <code class="docutils literal notranslate"><span class="pre">search_urls</span></code> of a <a class="reference internal" href="#searx.engines.tineye.engine_type" title="searx.engines.tineye.engine_type"><code class="xref py py-obj docutils literal notranslate"><span class="pre">engine_type</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.tineye.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tineye.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../../_modules/searx/engines/tineye.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.tineye.response" title="Link to this definition">¶</a></dt>
+<dd><p>Parse HTTP response from TinEye.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.tineye.DOWNLOAD_ERROR">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tineye.</span></span><span class="sig-name descname"><span class="pre">DOWNLOAD_ERROR</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'The</span> <span class="pre">image</span> <span class="pre">could</span> <span class="pre">not</span> <span class="pre">be</span> <span class="pre">downloaded.'</span></em><a class="headerlink" href="#searx.engines.tineye.DOWNLOAD_ERROR" title="Link to this definition">¶</a></dt>
+<dd><p>TinEye error message</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.tineye.FORMAT_NOT_SUPPORTED">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tineye.</span></span><span class="sig-name descname"><span class="pre">FORMAT_NOT_SUPPORTED</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'Could</span> <span class="pre">not</span> <span class="pre">read</span> <span class="pre">that</span> <span class="pre">image</span> <span class="pre">url.</span> <span class="pre">This</span> <span class="pre">may</span> <span class="pre">be</span> <span class="pre">due</span> <span class="pre">to</span> <span class="pre">an</span> <span class="pre">unsupported</span> <span class="pre">file</span> <span class="pre">format.</span> <span class="pre">TinEye</span> <span class="pre">only</span> <span class="pre">supports</span> <span class="pre">images</span> <span class="pre">that</span> <span class="pre">are</span> <span class="pre">JPEG,</span> <span class="pre">PNG,</span> <span class="pre">GIF,</span> <span class="pre">BMP,</span> <span class="pre">TIFF</span> <span class="pre">or</span> <span class="pre">WebP.'</span></em><a class="headerlink" href="#searx.engines.tineye.FORMAT_NOT_SUPPORTED" title="Link to this definition">¶</a></dt>
+<dd><p>TinEye error message</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.tineye.NO_SIGNATURE_ERROR">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tineye.</span></span><span class="sig-name descname"><span class="pre">NO_SIGNATURE_ERROR</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'The</span> <span class="pre">image</span> <span class="pre">is</span> <span class="pre">too</span> <span class="pre">simple</span> <span class="pre">to</span> <span class="pre">find</span> <span class="pre">matches.</span> <span class="pre">TinEye</span> <span class="pre">requires</span> <span class="pre">a</span> <span class="pre">basic</span> <span class="pre">level</span> <span class="pre">of</span> <span class="pre">visual</span> <span class="pre">detail</span> <span class="pre">to</span> <span class="pre">successfully</span> <span class="pre">identify</span> <span class="pre">matches.'</span></em><a class="headerlink" href="#searx.engines.tineye.NO_SIGNATURE_ERROR" title="Link to this definition">¶</a></dt>
+<dd><p>TinEye error message</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.tineye.engine_type">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.tineye.</span></span><span class="sig-name descname"><span class="pre">engine_type</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'online_url_search'</span></em><a class="headerlink" href="#searx.engines.tineye.engine_type" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference internal" href="../../../src/searx.search.processors.html#module-searx.search.processors.online_url_search" title="searx.search.processors.online_url_search"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.search.processors.online_url_search</span></code></a></p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../../index.html">
+ <img class="logo" src="../../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="../enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="../index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-engines">Online Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4 current"><a class="reference internal" href="../index.html#online-url-search">Online URL Search</a><ul class="current">
+<li class="toctree-l5 current"><a class="current reference internal" href="#">Tineye</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="../index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../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="../../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../../index.html">Overview</a>
+ <ul>
+ <li><a href="../../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="../index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="../offline/sql-engines.html" title="previous chapter">SQL Engines</a>
+ <li>Next: <a href="../../search_api.html" title="next chapter">Search API</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../../_sources/dev/engines/online_url_search/tineye.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/engines/xpath.html b/dev/engines/xpath.html
new file mode 100644
index 000000000..7d8aa51cd
--- /dev/null
+++ b/dev/engines/xpath.html
@@ -0,0 +1,441 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>XPath Engine &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="MediaWiki Engine" href="mediawiki.html" />
+ <link rel="prev" title="Demo Online Engine" href="demo/demo_online.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="mediawiki.html" title="MediaWiki Engine"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="demo/demo_online.html" title="Demo Online Engine"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Engine Implementations</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">XPath Engine</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="xpath-engine">
+<span id="id1"></span><h1>XPath Engine<a class="headerlink" href="#xpath-engine" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#configuration" id="id2">Configuration</a></p></li>
+<li><p><a class="reference internal" href="#example" id="id3">Example</a></p></li>
+<li><p><a class="reference internal" href="#implementations" id="id4">Implementations</a></p></li>
+</ul>
+</nav>
+<p id="module-searx.engines.xpath">The XPath engine is a <em>generic</em> engine with which it is possible to configure
+engines in the settings.</p>
+<section id="configuration">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Configuration</a><a class="headerlink" href="#configuration" title="Link to this heading">¶</a></h2>
+<p>Request:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.xpath.search_url" title="searx.engines.xpath.search_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_url</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.lang_all" title="searx.engines.xpath.lang_all"><code class="xref py py-obj docutils literal notranslate"><span class="pre">lang_all</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.soft_max_redirects" title="searx.engines.xpath.soft_max_redirects"><code class="xref py py-obj docutils literal notranslate"><span class="pre">soft_max_redirects</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.cookies" title="searx.engines.xpath.cookies"><code class="xref py py-obj docutils literal notranslate"><span class="pre">cookies</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.headers" title="searx.engines.xpath.headers"><code class="xref py py-obj docutils literal notranslate"><span class="pre">headers</span></code></a></p></li>
+</ul>
+<p>Paging:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.xpath.paging" title="searx.engines.xpath.paging"><code class="xref py py-obj docutils literal notranslate"><span class="pre">paging</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.page_size" title="searx.engines.xpath.page_size"><code class="xref py py-obj docutils literal notranslate"><span class="pre">page_size</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.first_page_num" title="searx.engines.xpath.first_page_num"><code class="xref py py-obj docutils literal notranslate"><span class="pre">first_page_num</span></code></a></p></li>
+</ul>
+<p>Time Range:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.xpath.time_range_support" title="searx.engines.xpath.time_range_support"><code class="xref py py-obj docutils literal notranslate"><span class="pre">time_range_support</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.time_range_url" title="searx.engines.xpath.time_range_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">time_range_url</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.time_range_map" title="searx.engines.xpath.time_range_map"><code class="xref py py-obj docutils literal notranslate"><span class="pre">time_range_map</span></code></a></p></li>
+</ul>
+<p>Safe-Search:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.xpath.safe_search_support" title="searx.engines.xpath.safe_search_support"><code class="xref py py-obj docutils literal notranslate"><span class="pre">safe_search_support</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.safe_search_map" title="searx.engines.xpath.safe_search_map"><code class="xref py py-obj docutils literal notranslate"><span class="pre">safe_search_map</span></code></a></p></li>
+</ul>
+<p>Response:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.xpath.no_result_for_http_status" title="searx.engines.xpath.no_result_for_http_status"><code class="xref py py-obj docutils literal notranslate"><span class="pre">no_result_for_http_status</span></code></a></p></li>
+</ul>
+<p><a class="reference external" href="https://quickref.me/xpath.html#xpath-selectors">XPath selector</a>:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.engines.xpath.results_xpath" title="searx.engines.xpath.results_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">results_xpath</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.url_xpath" title="searx.engines.xpath.url_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">url_xpath</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.title_xpath" title="searx.engines.xpath.title_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">title_xpath</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.content_xpath" title="searx.engines.xpath.content_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">content_xpath</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.thumbnail_xpath" title="searx.engines.xpath.thumbnail_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">thumbnail_xpath</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.engines.xpath.suggestion_xpath" title="searx.engines.xpath.suggestion_xpath"><code class="xref py py-obj docutils literal notranslate"><span class="pre">suggestion_xpath</span></code></a></p></li>
+</ul>
+</section>
+<section id="example">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Example</a><a class="headerlink" href="#example" title="Link to this heading">¶</a></h2>
+<p>Here is a simple example of a XPath engine configured in the <a class="reference internal" href="../../admin/settings/settings_engine.html#settings-engine"><span class="std std-ref">engine:</span></a> section, further read <a class="reference internal" href="engine_overview.html#engines-dev"><span class="std std-ref">Engine Overview</span></a>.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bitbucket</span>
+<span class="w"> </span><span class="nt">engine </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">xpath</span>
+<span class="w"> </span><span class="nt">paging </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">True</span>
+<span class="w"> </span><span class="nt">search_url </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://bitbucket.org/repo/all/{pageno}?name={query}</span>
+<span class="w"> </span><span class="nt">url_xpath </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">//article[@class=&quot;repo-summary&quot;]//a[@class=&quot;repo-link&quot;]/@href</span>
+<span class="w"> </span><span class="nt">title_xpath </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">//article[@class=&quot;repo-summary&quot;]//a[@class=&quot;repo-link&quot;]</span>
+<span class="w"> </span><span class="nt">content_xpath </span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">//article[@class=&quot;repo-summary&quot;]/p</span>
+</pre></div>
+</div>
+</section>
+<section id="implementations">
+<h2><a class="toc-backref" href="#id4" role="doc-backlink">Implementations</a><a class="headerlink" href="#implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.xpath.request">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/engines/xpath.html#request"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.xpath.request" title="Link to this definition">¶</a></dt>
+<dd><p>Build request parameters (see <a class="reference internal" href="engine_overview.html#engine-request"><span class="std std-ref">Making a Request</span></a>).</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.engines.xpath.response">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">response</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resp</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/engines/xpath.html#response"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.engines.xpath.response" title="Link to this definition">¶</a></dt>
+<dd><p>Scrap <em>results</em> from the response (see <a class="reference internal" href="engine_overview.html#engine-results"><span class="std std-ref">Result Types (template)</span></a>).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.content_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">content_xpath</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></em><a class="headerlink" href="#searx.engines.xpath.content_xpath" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://quickref.me/xpath.html#xpath-selectors">XPath selector</a> of result’s <code class="docutils literal notranslate"><span class="pre">content</span></code>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.cookies">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">cookies</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{}</span></em><a class="headerlink" href="#searx.engines.xpath.cookies" title="Link to this definition">¶</a></dt>
+<dd><p>Some engines might offer different result based on cookies.
+Possible use-case: To set safesearch cookie.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.first_page_num">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">first_page_num</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">1</span></em><a class="headerlink" href="#searx.engines.xpath.first_page_num" title="Link to this definition">¶</a></dt>
+<dd><p>Number of the first page (usually 0 or 1).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.headers">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">headers</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{}</span></em><a class="headerlink" href="#searx.engines.xpath.headers" title="Link to this definition">¶</a></dt>
+<dd><p>Some engines might offer different result based headers. Possible use-case:
+To set header to moderate.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.lang_all">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">lang_all</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'en'</span></em><a class="headerlink" href="#searx.engines.xpath.lang_all" title="Link to this definition">¶</a></dt>
+<dd><p>Replacement <code class="docutils literal notranslate"><span class="pre">{lang}</span></code> in <a class="reference internal" href="#searx.engines.xpath.search_url" title="searx.engines.xpath.search_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_url</span></code></a> if language <code class="docutils literal notranslate"><span class="pre">all</span></code> is
+selected.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.no_result_for_http_status">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">no_result_for_http_status</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">[]</span></em><a class="headerlink" href="#searx.engines.xpath.no_result_for_http_status" title="Link to this definition">¶</a></dt>
+<dd><p>Return empty result for these HTTP status codes instead of throwing an error.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">no_result_for_http_status</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[]</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.page_size">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">page_size</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">1</span></em><a class="headerlink" href="#searx.engines.xpath.page_size" title="Link to this definition">¶</a></dt>
+<dd><p>Number of results on each page. Only needed if the site requires not a page
+number, but an offset.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.paging">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">paging</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.engines.xpath.paging" title="Link to this definition">¶</a></dt>
+<dd><p>Engine supports paging [True or False].</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.results_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">results_xpath</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.xpath.results_xpath" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://quickref.me/xpath.html#xpath-selectors">XPath selector</a> for the list of result items</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.safe_search_map">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">safe_search_map</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{0:</span> <span class="pre">'&amp;filter=none',</span> <span class="pre">1:</span> <span class="pre">'&amp;filter=moderate',</span> <span class="pre">2:</span> <span class="pre">'&amp;filter=strict'}</span></em><a class="headerlink" href="#searx.engines.xpath.safe_search_map" title="Link to this definition">¶</a></dt>
+<dd><p>Maps safe-search value to <code class="docutils literal notranslate"><span class="pre">{safe_search}</span></code> in <a class="reference internal" href="#searx.engines.xpath.search_url" title="searx.engines.xpath.search_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_url</span></code></a>.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">safesearch</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="nt">safes_search_map</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">0</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&amp;filter=none&#39;</span>
+<span class="w"> </span><span class="nt">1</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&amp;filter=moderate&#39;</span>
+<span class="w"> </span><span class="nt">2</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&amp;filter=strict&#39;</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.safe_search_support">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">safe_search_support</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.engines.xpath.safe_search_support" title="Link to this definition">¶</a></dt>
+<dd><p>Engine supports safe-search.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.search_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">search_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></em><a class="headerlink" href="#searx.engines.xpath.search_url" title="Link to this definition">¶</a></dt>
+<dd><p>Search URL of the engine. Example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>https://example.org/?search={query}&amp;page={pageno}{time_range}{safe_search}
+</pre></div>
+</div>
+<p>Replacements are:</p>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">{query}</span></code>:</dt><dd><p>Search terms from user.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">{pageno}</span></code>:</dt><dd><p>Page number if engine supports paging <a class="reference internal" href="#searx.engines.xpath.paging" title="searx.engines.xpath.paging"><code class="xref py py-obj docutils literal notranslate"><span class="pre">paging</span></code></a></p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">{lang}</span></code>:</dt><dd><p>ISO 639-1 language code (en, de, fr ..)</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">{time_range}</span></code>:</dt><dd><p><a class="reference internal" href="#searx.engines.xpath.time_range_url" title="searx.engines.xpath.time_range_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">URL</span> <span class="pre">parameter</span></code></a> if engine <a class="reference internal" href="#searx.engines.xpath.time_range_support" title="searx.engines.xpath.time_range_support"><code class="xref py py-obj docutils literal notranslate"><span class="pre">supports</span> <span class="pre">time</span>
+<span class="pre">range</span></code></a>. The value for the parameter is taken from
+<a class="reference internal" href="#searx.engines.xpath.time_range_map" title="searx.engines.xpath.time_range_map"><code class="xref py py-obj docutils literal notranslate"><span class="pre">time_range_map</span></code></a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">{safe_search}</span></code>:</dt><dd><p>Safe-search <a class="reference internal" href="#searx.engines.xpath.safe_search_map" title="searx.engines.xpath.safe_search_map"><code class="xref py py-obj docutils literal notranslate"><span class="pre">URL</span> <span class="pre">parameter</span></code></a> if engine
+<a class="reference internal" href="#searx.engines.xpath.safe_search_support" title="searx.engines.xpath.safe_search_support"><code class="xref py py-obj docutils literal notranslate"><span class="pre">supports</span> <span class="pre">safe-search</span></code></a>. The <code class="docutils literal notranslate"><span class="pre">{safe_search}</span></code>
+replacement is taken from the <code class="xref py py-obj docutils literal notranslate"><span class="pre">safes_search_map</span></code>. Filter results:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span><span class="p">:</span> <span class="n">none</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="n">moderate</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span><span class="n">strict</span>
+</pre></div>
+</div>
+<p>If not supported, the URL parameter is an empty string.</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.soft_max_redirects">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">soft_max_redirects</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">0</span></em><a class="headerlink" href="#searx.engines.xpath.soft_max_redirects" title="Link to this definition">¶</a></dt>
+<dd><p>Maximum redirects, soft limit. Record an error but don’t stop the engine</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.suggestion_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">suggestion_xpath</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.engines.xpath.suggestion_xpath" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://quickref.me/xpath.html#xpath-selectors">XPath selector</a> of result’s <code class="docutils literal notranslate"><span class="pre">suggestion</span></code>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.thumbnail_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">thumbnail_xpath</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.engines.xpath.thumbnail_xpath" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://quickref.me/xpath.html#xpath-selectors">XPath selector</a> of result’s <code class="docutils literal notranslate"><span class="pre">img_src</span></code>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.time_range_map">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">time_range_map</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'day':</span> <span class="pre">24,</span> <span class="pre">'month':</span> <span class="pre">720,</span> <span class="pre">'week':</span> <span class="pre">168,</span> <span class="pre">'year':</span> <span class="pre">8760}</span></em><a class="headerlink" href="#searx.engines.xpath.time_range_map" title="Link to this definition">¶</a></dt>
+<dd><p>Maps time range value from user to <code class="docutils literal notranslate"><span class="pre">{time_range_val}</span></code> in
+<a class="reference internal" href="#searx.engines.xpath.time_range_url" title="searx.engines.xpath.time_range_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">time_range_url</span></code></a>.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">time_range_map</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">day</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
+<span class="w"> </span><span class="nt">week</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7</span>
+<span class="w"> </span><span class="nt">month</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30</span>
+<span class="w"> </span><span class="nt">year</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">365</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.time_range_support">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">time_range_support</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.engines.xpath.time_range_support" title="Link to this definition">¶</a></dt>
+<dd><p>Engine supports search time range.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.time_range_url">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">time_range_url</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'&amp;hours={time_range_val}'</span></em><a class="headerlink" href="#searx.engines.xpath.time_range_url" title="Link to this definition">¶</a></dt>
+<dd><p>Time range URL parameter in the in <a class="reference internal" href="#searx.engines.xpath.search_url" title="searx.engines.xpath.search_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_url</span></code></a>. If no time range is
+requested by the user, the URL parameter is an empty string. The
+<code class="docutils literal notranslate"><span class="pre">{time_range_val}</span></code> replacement is taken from the <a class="reference internal" href="#searx.engines.xpath.time_range_map" title="searx.engines.xpath.time_range_map"><code class="xref py py-obj docutils literal notranslate"><span class="pre">time_range_map</span></code></a>.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">time_range_url </span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&amp;days={time_range_val}&#39;</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.title_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">title_xpath</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></em><a class="headerlink" href="#searx.engines.xpath.title_xpath" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://quickref.me/xpath.html#xpath-selectors">XPath selector</a> of result’s <code class="docutils literal notranslate"><span class="pre">title</span></code>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.engines.xpath.url_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.engines.xpath.</span></span><span class="sig-name descname"><span class="pre">url_xpath</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">None</span></em><a class="headerlink" href="#searx.engines.xpath.url_xpath" title="Link to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://quickref.me/xpath.html#xpath-selectors">XPath selector</a> of result’s <code class="docutils literal notranslate"><span class="pre">url</span></code>.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Engine Implementations</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="enginelib.html">Engine Library</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l3"><a class="reference internal" href="engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="index.html#engine-types">Engine Types</a><ul class="current">
+<li class="toctree-l4 current"><a class="reference internal" href="index.html#online-engines">Online Engines</a><ul class="current">
+<li class="toctree-l5"><a class="reference internal" href="demo/demo_online.html">Demo Online Engine</a></li>
+<li class="toctree-l5 current"><a class="current reference internal" href="#">XPath Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="mediawiki.html">MediaWiki Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/annas_archive.html">Anna’s Archive</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/archlinux.html">Arch Linux</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bing.html">Bing Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bpb.html">Bpb</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/brave.html">Brave Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/bt4g.html">BT4G</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/dailymotion.html">Dailymotion</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/duckduckgo.html">DuckDuckGo Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/google.html">Google Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/lemmy.html">Lemmy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/loc.html">Library of Congress</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mastodon.html">Mastodon</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/moviepilot.html">Moviepilot</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mrs.html">Matrix Rooms Search (MRS)</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mullvad_leta.html">Mullvad-Leta</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/mwmbl.html">Mwmbl Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/odysee.html">Odysee</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/peertube.html">Peertube Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/piped.html">Piped</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/presearch.html">Presearch Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/qwant.html">Qwant</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/radio_browser.html">RadioBrowser</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/recoll.html">Recoll Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/seekr.html">Seekr Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/startpage.html">Startpage Engines</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/tagesschau.html">Tagesschau API</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/torznab.html">Torznab WebAPI</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/void.html">Void Linux binary packages</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/wallhaven.html">Wallhaven</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/wikipedia.html">Wikimedia</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/yacy.html">Yacy</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/yahoo.html">Yahoo Engine</a></li>
+<li class="toctree-l5"><a class="reference internal" href="online/zlibrary.html">Z-Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#offline-engines">Offline Engines</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-url-search">Online URL Search</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-currency">Online Currency</a></li>
+<li class="toctree-l4"><a class="reference internal" href="index.html#online-dictionary">Online Dictionary</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Engine Implementations</a>
+ <ul>
+ <li>Previous: <a href="demo/demo_online.html" title="previous chapter">Demo Online Engine</a>
+ <li>Next: <a href="mediawiki.html" title="next chapter">MediaWiki Engine</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/engines/xpath.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/index.html b/dev/index.html
new file mode 100644
index 000000000..88811cf26
--- /dev/null
+++ b/dev/index.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Developer documentation &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Development Quickstart" href="quickstart.html" />
+ <link rel="prev" title="Buildhosts" href="../admin/buildhosts.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="quickstart.html" title="Development Quickstart"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../admin/buildhosts.html" title="Buildhosts"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Developer documentation</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="developer-documentation">
+<h1>Developer documentation<a class="headerlink" href="#developer-documentation" title="Link to this heading">¶</a></h1>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l1"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html#get-started">Get started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html#manage-versions">Manage Versions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html#introduce-asdf">Introduce asdf</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="contribution_guide.html">How to contribute</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#prime-directives-privacy-hackability">Prime directives: Privacy, Hackability</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#code">Code</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#translation">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html#documentation">Documentation</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="engines/index.html">Engine Implementations</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="engines/enginelib.html">Engine Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/engines.html">SearXNG’s engines loader</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/engine_overview.html">Engine Overview</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html#engine-types">Engine Types</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="search_api.html">Search API</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html#parameters">Parameters</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="plugins.html">Plugins</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html#example-plugin">Example plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html#external-plugins">External plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html#plugin-entry-points">Plugin entry points</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="translation.html">Translation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="translation.html#id2">wlc</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html#motivation">Motivation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html#gentlemen-start-your-engines">Gentlemen, start your engines!</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html#in-containers-work-as-usual">In containers, work as usual</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html#wrap-production-into-developer-suite">Wrap production into developer suite</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html#summary">Summary</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="makefile.html">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#python-environment-make-install">Python environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">install</span></code>)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#node-js-environment-make-node-env">Node.js environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">node.env</span></code>)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-run"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-format-python"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">format.python</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-clean"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-docs"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-test"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-search-checker-engine-name"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">search.checker.{engine</span> <span class="pre">name}</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-themes"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">themes.*</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#make-static-build"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">static.build.*</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#manage-redis-help"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">redis.help</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html#manage-go-help"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">go.help</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="reST.html">reST primer</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#soft-skills">Soft skills</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#basic-inline-markup">Basic inline markup</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#basic-article-structure">Basic article structure</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#anchors-links">Anchors &amp; Links</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#literal-blocks">Literal blocks</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#unicode-substitution">Unicode substitution</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#roles">Roles</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#figures-images">Figures &amp; Images</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#list-markups">List markups</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#admonitions">Admonitions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#tables">Tables</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#templating">Templating</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#tabbed-views">Tabbed views</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html#math-equations">Math equations</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/update.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/standalone_searx.py.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a></li>
+</ul>
+</li>
+</ul>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Developer documentation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li>Previous: <a href="../admin/buildhosts.html" title="previous chapter">Buildhosts</a>
+ <li>Next: <a href="quickstart.html" title="next chapter">Development Quickstart</a>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/lxcdev.html b/dev/lxcdev.html
new file mode 100644
index 000000000..3099edb52
--- /dev/null
+++ b/dev/lxcdev.html
@@ -0,0 +1,463 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Developing in Linux Containers &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Makefile &amp; ./manage" href="makefile.html" />
+ <link rel="prev" title="Translation" href="translation.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="makefile.html" title="Makefile &amp; ./manage"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="translation.html" title="Translation"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Developing in Linux Containers</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="developing-in-linux-containers">
+<span id="lxcdev"></span><h1>Developing in Linux Containers<a class="headerlink" href="#developing-in-linux-containers" title="Link to this heading">¶</a></h1>
+<p>In this article we will show, how you can make use of Linux Containers (<a class="reference external" href="https://linuxcontainers.org/lxc/introduction/">LXC</a>) in
+<em>distributed and heterogeneous development cycles</em> (TL;DR; jump to the
+<a class="reference internal" href="#lxcdev-summary"><span class="std std-ref">Summary</span></a>).</p>
+<aside class="sidebar">
+<p class="sidebar-title">Audience</p>
+<p>This blog post is written for experienced admins and developers. Readers
+should have a serious meaning about the terms: <em>distributed</em>, <em>merge</em> and
+<em>linux container</em>.</p>
+<p><strong>hint</strong></p>
+<p>If you have issues with the internet connectivity of your containers read
+section <a class="reference internal" href="../utils/lxc.sh.html#internet-connectivity-docker"><span class="std std-ref">Internet Connectivity &amp; Docker</span></a>.</p>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#motivation" id="id1">Motivation</a></p></li>
+<li><p><a class="reference internal" href="#gentlemen-start-your-engines" id="id2">Gentlemen, start your engines!</a></p></li>
+<li><p><a class="reference internal" href="#in-containers-work-as-usual" id="id3">In containers, work as usual</a></p></li>
+<li><p><a class="reference internal" href="#wrap-production-into-developer-suite" id="id4">Wrap production into developer suite</a></p></li>
+<li><p><a class="reference internal" href="#summary" id="id5">Summary</a></p></li>
+</ul>
+</nav>
+<section id="motivation">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Motivation</a><a class="headerlink" href="#motivation" title="Link to this heading">¶</a></h2>
+<p>Most often in our development cycle, we edit the sources and run some test
+and/or builds by using <code class="docutils literal notranslate"><span class="pre">make</span></code> <a class="reference internal" href="makefile.html#makefile"><span class="std std-ref">[ref]</span></a> before we commit. This
+cycle is simple and perfect but might fail in some aspects we should not
+overlook.</p>
+<blockquote>
+<div><p><strong>The environment in which we run all our development processes matters!</strong></p>
+</div></blockquote>
+<p>The <a class="reference internal" href="makefile.html#makefile"><span class="std std-ref">Makefile &amp; ./manage</span></a> and the <a class="reference internal" href="makefile.html#make-install"><span class="std std-ref">Python environment (make install)</span></a> encapsulate a lot for us, but
+these tools do not have access to all prerequisites. For example, there may
+have dependencies on packages that are installed on developer’s desktop, but
+usually are not preinstalled on a server or client system. Another example is;
+settings have been made to the software on developer’s desktop that would never
+be set on a <em>production</em> system.</p>
+<blockquote>
+<div><p><strong>Linux Containers are isolate environments</strong>, we use them to not mix up all
+the prerequisites from various projects on developer’s desktop.</p>
+</div></blockquote>
+<p>The scripts from <a class="reference internal" href="../utils/index.html#searx-utils"><span class="std std-ref">DevOps tooling box</span></a> can divide in those to install and maintain
+software</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a></p></li>
+</ul>
+<p>and the script</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../utils/lxc.sh.html#lxc-sh"><span class="std std-ref">utils/lxc.sh</span></a></p></li>
+</ul>
+<p>with we can scale our installation, maintenance or even development tasks over a
+stack of isolated containers / what we call the:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../utils/lxc.sh.html#searxng-lxc-suite"><span class="std std-ref">SearXNG LXC suite</span></a></p></li>
+</ul>
+</section>
+<section id="gentlemen-start-your-engines">
+<span id="lxcdev-install-searxng"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Gentlemen, start your engines!</a><a class="headerlink" href="#gentlemen-start-your-engines" title="Link to this heading">¶</a></h2>
+<p>Before you can start with containers, you need to install and initiate <a class="reference external" href="https://linuxcontainers.org/lxd/introduction/">LXD</a>
+once:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-ZGVza3RvcCAoSE9TVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="0">desktop (HOST)</button></div><div aria-labelledby="tab-0-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" id="panel-0-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>snap<span class="w"> </span>install<span class="w"> </span>lxd
+$<span class="w"> </span>lxd<span class="w"> </span>init<span class="w"> </span>--auto
+</pre></div>
+</div>
+</div></div>
+<p>And you need to clone from origin or if you have your own fork, clone from your
+fork:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-ZGVza3RvcCAoSE9TVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="0">desktop (HOST)</button></div><div aria-labelledby="tab-1-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" id="panel-1-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>~/Downloads
+$<span class="w"> </span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/searxng/searxng.git<span class="w"> </span>searxng
+$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>searxng
+</pre></div>
+</div>
+</div></div>
+<aside class="sidebar">
+<p class="sidebar-title">The <code class="docutils literal notranslate"><span class="pre">searxng-archlinux</span></code> container</p>
+<p>is the base of all our exercises here.</p>
+</aside>
+<p>The <a class="reference internal" href="../utils/lxc.sh.html#lxc-searxng-env"><span class="std std-ref">SearXNG suite config</span></a> consists of several images, see <code class="docutils literal notranslate"><span class="pre">export</span>
+<span class="pre">LXC_SUITE=(...</span></code> near by <a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/lxc-searxng.env#L19">git://utils/lxc-searxng.env#L19</a>.
+For this blog post we exercise on a <a class="reference external" href="https://www.archlinux.org/">archlinux</a> image. The container of this
+image is named <code class="docutils literal notranslate"><span class="pre">searxng-archlinux</span></code>.</p>
+<p>Lets build the container, but be sure that this container does not already
+exists, so first lets remove possible old one:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-2-ZGVza3RvcCAoSE9TVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-2-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="0">desktop (HOST)</button></div><div aria-labelledby="tab-2-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" id="panel-2-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>remove<span class="w"> </span>searxng-archlinux
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>build<span class="w"> </span>searxng-archlinux
+</pre></div>
+</div>
+</div></div>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../utils/lxc.sh.html#lxc-sh-install-suite"><span class="std std-ref">Install suite</span></a></p></li>
+<li><p><a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">NGINX</span></a></p></li>
+</ul>
+</aside>
+<p>To install the complete <a class="reference internal" href="../utils/lxc.sh.html#searxng-lxc-suite"><span class="std std-ref">SearXNG suite</span></a> and the HTTP
+proxy <a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">NGINX</span></a> into the archlinux container run:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-3-ZGVza3RvcCAoSE9TVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-3-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="0">desktop (HOST)</button></div><div aria-labelledby="tab-3-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" id="panel-3-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>install<span class="w"> </span>suite<span class="w"> </span>searxng-archlinux
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>--<span class="w"> </span><span class="nv">FORCE_TIMEOUT</span><span class="o">=</span><span class="m">0</span><span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>nginx
+$<span class="w"> </span>sudo<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>show<span class="w"> </span>suite<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>SEARXNG_URL
+...
+<span class="o">[</span>searxng-archlinux<span class="o">]</span><span class="w"> </span>SEARXNG_URL<span class="w"> </span>:<span class="w"> </span>http://n.n.n.140/searxng
+</pre></div>
+</div>
+</div></div>
+<aside class="sidebar">
+<p class="sidebar-title">Fully functional SearXNG suite</p>
+<p>From here on you have a fully functional SearXNG suite (including a
+<a class="reference internal" href="../src/searx.redisdb.html#redis-db"><span class="std std-ref">Redis DB</span></a>).</p>
+</aside>
+<p>In such a SearXNG suite admins can maintain and access the debug log of the
+services quite easy.</p>
+<p>In the example above the SearXNG instance in the container is wrapped to
+<code class="docutils literal notranslate"><span class="pre">http://n.n.n.140/searxng</span></code> to the HOST system. Note, on your HOST system, the
+IP of your <code class="docutils literal notranslate"><span class="pre">searxng-archlinux</span></code> container is different to this example. To
+test the instance in the container from outside of the container, in your WEB
+browser on your desktop just open the URL reported in your installation</p>
+</section>
+<section id="in-containers-work-as-usual">
+<span id="working-in-containers"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">In containers, work as usual</a><a class="headerlink" href="#in-containers-work-as-usual" title="Link to this heading">¶</a></h2>
+<p>Usually you open a root-bash using <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">-H</span> <span class="pre">bash</span></code>. In case of LXC containers
+open the root-bash in the container is done by the <code class="docutils literal notranslate"><span class="pre">./utils/lxc.sh</span> <span class="pre">cmd</span>
+<span class="pre">searxng-archlinux</span></code> command:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-4-ZGVza3RvcCAoSE9TVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-4-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="0">desktop (HOST)</button></div><div aria-labelledby="tab-4-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" id="panel-4-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>bash
+INFO:<span class="w"> </span><span class="o">[</span>searxng-archlinux<span class="o">]</span><span class="w"> </span>bash
+<span class="o">[</span>root@searxng-archlinux<span class="w"> </span>SearXNG<span class="o">]</span>$
+</pre></div>
+</div>
+</div></div>
+<p>The prompt <code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">...]</span></code> signals, that you are the root user
+in the container (GUEST). To debug the running SearXNG instance use:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-5-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-5-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">SearXNG]</span></code> (GUEST)</button><button aria-controls="panel-5-ZGVza3RvcCAoSE9TVCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-5-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="-1">desktop (HOST)</button></div><div aria-labelledby="tab-5-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" class="sphinx-tabs-panel group-tab" id="panel-5-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>inspect
+...
+use<span class="w"> </span><span class="o">[</span>CTRL-C<span class="o">]</span><span class="w"> </span>to<span class="w"> </span>stop<span class="w"> </span>monitoring<span class="w"> </span>the<span class="w"> </span>log
+...
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-5-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-5-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>inspect
+...
+use<span class="w"> </span><span class="o">[</span>CTRL-C<span class="o">]</span><span class="w"> </span>to<span class="w"> </span>stop<span class="w"> </span>monitoring<span class="w"> </span>the<span class="w"> </span>log
+...
+</pre></div>
+</div>
+</div></div>
+<p>Back in the browser on your desktop open the service <a class="reference external" href="http://n.n.n.140/searxng">http://n.n.n.140/searxng</a>
+and run your application tests while the debug log is shown in the terminal from
+above. You can stop monitoring using <code class="docutils literal notranslate"><span class="pre">CTRL-C</span></code>, this also disables the <em>“debug
+option”</em> in SearXNG’s settings file and restarts the SearXNG uwsgi application.</p>
+<p>Another point we have to notice is that the service <a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">SearXNG</span></a>
+runs under dedicated system user account with the same name (compare
+<a class="reference internal" href="../admin/installation-searxng.html#create-searxng-user"><span class="std std-ref">Create user</span></a>). To get a login shell from these accounts, simply
+call:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-6-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-6-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">SearXNG]</span></code> (GUEST)</button><button aria-controls="panel-6-ZGVza3RvcCAoSE9TVCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-6-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="-1">desktop (HOST)</button></div><div aria-labelledby="tab-6-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" class="sphinx-tabs-panel group-tab" id="panel-6-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>cmd<span class="w"> </span>bash<span class="w"> </span>-l
+<span class="o">(</span>searx-pyenv<span class="o">)</span><span class="w"> </span><span class="o">[</span>searxng@searxng-archlinux<span class="w"> </span>~<span class="o">]</span>$<span class="w"> </span><span class="nb">pwd</span>
+/usr/local/searxng
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-6-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-6-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>cmd<span class="w"> </span>bash<span class="w"> </span>-l
+INFO:<span class="w"> </span><span class="o">[</span>searxng-archlinux<span class="o">]</span><span class="w"> </span>./utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>cmd<span class="w"> </span>bash<span class="w"> </span>-l
+<span class="o">(</span>searx-pyenv<span class="o">)</span><span class="w"> </span><span class="o">[</span>searxng@searxng-archlinux<span class="w"> </span>~<span class="o">]</span>$<span class="w"> </span><span class="nb">pwd</span>
+/usr/local/searxng
+</pre></div>
+</div>
+</div></div>
+<p>The prompt <code class="docutils literal notranslate"><span class="pre">[searxng&#64;searxng-archlinux]</span></code> signals that you are logged in as system
+user <code class="docutils literal notranslate"><span class="pre">searxng</span></code> in the <code class="docutils literal notranslate"><span class="pre">searxng-archlinux</span></code> container and the python <em>virtualenv</em>
+<code class="docutils literal notranslate"><span class="pre">(searxng-pyenv)</span></code> environment is activated.</p>
+</section>
+<section id="wrap-production-into-developer-suite">
+<h2><a class="toc-backref" href="#id4" role="doc-backlink">Wrap production into developer suite</a><a class="headerlink" href="#wrap-production-into-developer-suite" title="Link to this heading">¶</a></h2>
+<p>In this section we will see how to change the <em>“Fully functional SearXNG suite”</em>
+from a LXC container (which is quite ready for production) into a developer
+suite. For this, we have to keep an eye on the <a class="reference internal" href="../admin/installation-searxng.html#installation-basic"><span class="std std-ref">Step by step installation</span></a>:</p>
+<ul class="simple">
+<li><p>SearXNG setup in: <code class="docutils literal notranslate"><span class="pre">/etc/searxng/settings.yml</span></code></p></li>
+<li><p>SearXNG user’s home: <code class="docutils literal notranslate"><span class="pre">/usr/local/searxng</span></code></p></li>
+<li><p>virtualenv in: <code class="docutils literal notranslate"><span class="pre">/usr/local/searxng/searxng-pyenv</span></code></p></li>
+<li><p>SearXNG software in: <code class="docutils literal notranslate"><span class="pre">/usr/local/searxng/searxng-src</span></code></p></li>
+</ul>
+<p>With the use of the <a class="reference internal" href="../utils/searxng.sh.html#searxng-sh"><span class="std std-ref">utils/searxng.sh</span></a> the SearXNG service was installed as
+<a class="reference internal" href="../admin/installation-uwsgi.html#searxng-uwsgi"><span class="std std-ref">uWSGI application</span></a>. To maintain this service, we can use
+<code class="docutils literal notranslate"><span class="pre">systemctl</span></code> (compare <a class="reference internal" href="../admin/installation-uwsgi.html#uwsgi-maintenance"><span class="std std-ref">uWSGI maintenance</span></a>).</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-7-dXdzZ2lAc2VhcnhuZw==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-7-dXdzZ2lAc2VhcnhuZw==" name="dXdzZ2lAc2VhcnhuZw==" role="tab" tabindex="0"><a class="reference external" href="mailto:uwsgi&#37;&#52;&#48;searxng">uwsgi<span>&#64;</span>searxng</a></button></div><div aria-labelledby="tab-7-dXdzZ2lAc2VhcnhuZw==" class="sphinx-tabs-panel group-tab" id="panel-7-dXdzZ2lAc2VhcnhuZw==" name="dXdzZ2lAc2VhcnhuZw==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>systemctl<span class="w"> </span>stop<span class="w"> </span>uwsgi@searxng
+</pre></div>
+</div>
+</div></div>
+<p>With the command above, we stopped the SearXNG uWSGI-App in the archlinux
+container.</p>
+<p>The uWSGI-App for the archlinux distros is configured in
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/templates/etc/uwsgi/apps-archlinux/searxng.ini">git://utils/templates/etc/uwsgi/apps-archlinux/searxng.ini</a>, from where at
+least you should attend the settings of <code class="docutils literal notranslate"><span class="pre">uid</span></code>, <code class="docutils literal notranslate"><span class="pre">chdir</span></code>, <code class="docutils literal notranslate"><span class="pre">env</span></code> and
+<code class="docutils literal notranslate"><span class="pre">http</span></code>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">env</span> <span class="o">=</span> <span class="n">SEARXNG_SETTINGS_PATH</span><span class="o">=/</span><span class="n">etc</span><span class="o">/</span><span class="n">searxng</span><span class="o">/</span><span class="n">settings</span><span class="o">.</span><span class="n">yml</span>
+<span class="n">http</span> <span class="o">=</span> <span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">8888</span>
+
+<span class="n">chdir</span> <span class="o">=</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">searxng</span><span class="o">/</span><span class="n">searxng</span><span class="o">-</span><span class="n">src</span><span class="o">/</span><span class="n">searx</span>
+<span class="n">virtualenv</span> <span class="o">=</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">searxng</span><span class="o">/</span><span class="n">searxng</span><span class="o">-</span><span class="n">pyenv</span>
+<span class="n">pythonpath</span> <span class="o">=</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">searxng</span><span class="o">/</span><span class="n">searxng</span><span class="o">-</span><span class="n">src</span>
+</pre></div>
+</div>
+<p>If you have read the <a class="reference internal" href="../utils/lxc.sh.html#good-to-know"><span class="std std-ref">Good to know</span></a> you remember, that each container
+shares the root folder of the repository and the command <code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span> <span class="pre">cmd</span></code>
+handles relative path names <strong>transparent</strong>.</p>
+<p>To wrap the SearXNG installation in the container into a developer one, we
+simple have to create a symlink to the <strong>transparent</strong> repository from the
+desktop. Now lets replace the repository at <code class="docutils literal notranslate"><span class="pre">searxng-src</span></code> in the container
+with the working tree from outside of the container:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-8-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-8-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">SearXNG]</span></code> (GUEST)</button><button aria-controls="panel-8-ZGVza3RvcCAoSE9TVCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-8-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="-1">desktop (HOST)</button></div><div aria-labelledby="tab-8-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" class="sphinx-tabs-panel group-tab" id="panel-8-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>mv<span class="w"> </span>/usr/local/searxng/searxng-src<span class="w"> </span>/usr/local/searxng/searxng-src.old
+$<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/share/SearXNG/<span class="w"> </span>/usr/local/searxng/searxng-src
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-8-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-8-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>mv<span class="w"> </span>/usr/local/searxng/searxng-src<span class="w"> </span>/usr/local/searxng/searxng-src.old
+
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/share/SearXNG/<span class="w"> </span>/usr/local/searxng/searxng-src
+</pre></div>
+</div>
+</div></div>
+<p>Now we can develop as usual in the working tree of our desktop system. Every
+time the software was changed, you have to restart the SearXNG service (in the
+container):</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-9-dXdzZ2lAc2VhcnhuZw==" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-9-dXdzZ2lAc2VhcnhuZw==" name="dXdzZ2lAc2VhcnhuZw==" role="tab" tabindex="0"><a class="reference external" href="mailto:uwsgi&#37;&#52;&#48;searxng">uwsgi<span>&#64;</span>searxng</a></button></div><div aria-labelledby="tab-9-dXdzZ2lAc2VhcnhuZw==" class="sphinx-tabs-panel group-tab" id="panel-9-dXdzZ2lAc2VhcnhuZw==" name="dXdzZ2lAc2VhcnhuZw==" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>uwsgi@searxng
+</pre></div>
+</div>
+</div></div>
+<p>Remember: <a class="reference internal" href="#working-in-containers"><span class="std std-ref">In containers, work as usual</span></a> .. here are just some examples from my
+daily usage:</p>
+<p>To <em>inspect</em> the SearXNG instance (already described above):</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-10-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-10-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">SearXNG]</span></code> (GUEST)</button><button aria-controls="panel-10-ZGVza3RvcCAoSE9TVCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-10-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="-1">desktop (HOST)</button></div><div aria-labelledby="tab-10-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" class="sphinx-tabs-panel group-tab" id="panel-10-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>./utils/searx.sh<span class="w"> </span>inspect<span class="w"> </span>service
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-10-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-10-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>./utils/searx.sh<span class="w"> </span>inspect<span class="w"> </span>service
+</pre></div>
+</div>
+</div></div>
+<p>Run <a class="reference internal" href="makefile.html#makefile"><span class="std std-ref">Makefile &amp; ./manage</span></a>, e.g. to test inside the container:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-11-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-11-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">SearXNG]</span></code> (GUEST)</button><button aria-controls="panel-11-ZGVza3RvcCAoSE9TVCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-11-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="-1">desktop (HOST)</button></div><div aria-labelledby="tab-11-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" class="sphinx-tabs-panel group-tab" id="panel-11-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>make<span class="w"> </span><span class="nb">test</span>
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-11-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-11-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>make<span class="w"> </span><span class="nb">test</span>
+</pre></div>
+</div>
+</div></div>
+<p>To install all prerequisites needed for a <a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">Buildhosts</span></a>:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-12-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-12-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">SearXNG]</span></code> (GUEST)</button><button aria-controls="panel-12-ZGVza3RvcCAoSE9TVCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-12-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="-1">desktop (HOST)</button></div><div aria-labelledby="tab-12-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" class="sphinx-tabs-panel group-tab" id="panel-12-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>buildhost
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-12-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-12-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>buildhost
+</pre></div>
+</div>
+</div></div>
+<p>To build the docs on a buildhost <a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">Buildhosts</span></a>:</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-13-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-13-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">[root&#64;searxng-archlinux</span> <span class="pre">SearXNG]</span></code> (GUEST)</button><button aria-controls="panel-13-ZGVza3RvcCAoSE9TVCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-13-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tab" tabindex="-1">desktop (HOST)</button></div><div aria-labelledby="tab-13-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" class="sphinx-tabs-panel group-tab" id="panel-13-YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" name="YGBbcm9vdEBzZWFyeG5nLWFyY2hsaW51eCBTZWFyWE5HXWBgIChHVUVTVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>make<span class="w"> </span>docs.html
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-13-ZGVza3RvcCAoSE9TVCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-13-ZGVza3RvcCAoSE9TVCk=" name="ZGVza3RvcCAoSE9TVCk=" role="tabpanel" tabindex="0"><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>make<span class="w"> </span>docs.html
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="summary">
+<span id="lxcdev-summary"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Summary</a><a class="headerlink" href="#summary" title="Link to this heading">¶</a></h2>
+<p>We build up a fully functional SearXNG suite in a archlinux container:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>build<span class="w"> </span>searxng-archlinux
+$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>install<span class="w"> </span>suite<span class="w"> </span>searxng-archlinux
+...
+Developer<span class="w"> </span>install?<span class="w"> </span><span class="o">(</span>wraps<span class="w"> </span><span class="nb">source</span><span class="w"> </span>from<span class="w"> </span>HOST<span class="w"> </span>into<span class="w"> </span>the<span class="w"> </span>running<span class="w"> </span>instance<span class="o">)</span><span class="w"> </span><span class="o">[</span>YES/no<span class="o">]</span>
+</pre></div>
+</div>
+<p>To wrap the suite into a developer one answer <code class="docutils literal notranslate"><span class="pre">YES</span></code> (or press Enter).</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>link SearXNG&#39;s sources to: /share/SearXNG
+=========================================
+
+mv -f &quot;/usr/local/searxng/searxng-src&quot; &quot;/usr/local/searxng/searxng-src.backup&quot;
+ln -s &quot;/share/SearXNG&quot; &quot;/usr/local/searxng/searxng-src&quot;
+ls -ld /usr/local/searxng/searxng-src
+ |searxng| lrwxrwxrwx 1 searxng searxng ... /usr/local/searxng/searxng-src -&gt; /share/SearXNG
+</pre></div>
+</div>
+<p>On code modification the instance has to be restarted (see <a class="reference internal" href="../admin/installation-uwsgi.html#uwsgi-maintenance"><span class="std std-ref">uWSGI maintenance</span></a>):</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>searxng-archlinux<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>uwsgi@searxng
+</pre></div>
+</div>
+<p>To access HTTP from the desktop we installed nginx for the services inside the
+container:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/lxc.sh<span class="w"> </span>cmd<span class="w"> </span>--<span class="w"> </span><span class="nv">FORCE_TIMEOUT</span><span class="o">=</span><span class="m">0</span><span class="w"> </span>./utils/searxng.sh<span class="w"> </span>install<span class="w"> </span>nginx
+</pre></div>
+</div>
+<p>To get information about the SearxNG suite in the archlinux container we can
+use:</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh show suite searxng-archlinux
+[searxng-archlinux] INFO: (eth0) docs-live: http:///n.n.n.140:8080/
+[searxng-archlinux] INFO: (eth0) IPv6: http://[fd42:555b:2af9:e121:216:3eff:fe5b:1744]
+[searxng-archlinux] uWSGI:
+[searxng-archlinux] SEARXNG_UWSGI_SOCKET : /usr/local/searxng/run/socket
+[searxng-archlinux] environment /usr/local/searxng/searxng-src/utils/brand.env:
+[searxng-archlinux] GIT_URL : https://github.com/searxng/searxng
+[searxng-archlinux] GIT_BRANCH : master
+[searxng-archlinux] SEARXNG_URL : http:///n.n.n.140/searxng
+[searxng-archlinux] SEARXNG_PORT : 8888
+[searxng-archlinux] SEARXNG_BIND_ADDRESS : 127.0.0.1
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Developing in Linux Containers</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#motivation">Motivation</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#gentlemen-start-your-engines">Gentlemen, start your engines!</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#in-containers-work-as-usual">In containers, work as usual</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#wrap-production-into-developer-suite">Wrap production into developer suite</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#summary">Summary</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="translation.html" title="previous chapter">Translation</a>
+ <li>Next: <a href="makefile.html" title="next chapter">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/lxcdev.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/makefile.html b/dev/makefile.html
new file mode 100644
index 000000000..d247b9879
--- /dev/null
+++ b/dev/makefile.html
@@ -0,0 +1,592 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Makefile &amp; ./manage &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="reST primer" href="reST.html" />
+ <link rel="prev" title="Developing in Linux Containers" href="lxcdev.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="reST.html" title="reST primer"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="lxcdev.html" title="Developing in Linux Containers"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="makefile-manage">
+<span id="makefile"></span><h1>Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code><a class="headerlink" href="#makefile-manage" title="Link to this heading">¶</a></h1>
+<p>All relevant build and development tasks are implemented in the
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/manage">./manage</a> script and for CI or IDE integration a small
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/Makefile">git://Makefile</a> wrapper is available. If you are not familiar with
+Makefiles, we recommend to read <a class="reference external" href="https://www.gnu.org/software/make/manual/make.html#Introduction">gnu-make</a> introduction.</p>
+<aside class="sidebar">
+<p class="sidebar-title">build environment</p>
+<p>Before looking deeper at the targets, first read about <a class="reference internal" href="#make-install"><span class="std std-ref">Python environment (make install)</span></a>.</p>
+<p>To install developer requirements follow <a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">Buildhosts</span></a>.</p>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#python-environment-make-install" id="id14">Python environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">install</span></code>)</a></p></li>
+<li><p><a class="reference internal" href="#node-js-environment-make-node-env" id="id15">Node.js environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">node.env</span></code>)</a></p>
+<ul>
+<li><p><a class="reference internal" href="#nvm-make-nvm-install-nvm-status" id="id16">NVM <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">nvm.install</span> <span class="pre">nvm.status</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-nvm-nodejs" id="id17"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">nvm.nodejs</span></code></a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#make-run" id="id18"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-format-python" id="id19"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">format.python</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-clean" id="id20"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-docs" id="id21"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#make-docs-clean-docs-live" id="id22"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.clean</span> <span class="pre">docs.live</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-docs-gh-pages" id="id23"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.gh-pages</span></code></a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#make-test" id="id24"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#make-test-shell" id="id25"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test.shell</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-test-pylint" id="id26"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test.pylint</span></code></a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#make-search-checker-engine-name" id="id27"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">search.checker.{engine</span> <span class="pre">name}</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-themes" id="id28"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">themes.*</span></code></a></p></li>
+<li><p><a class="reference internal" href="#make-static-build" id="id29"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">static.build.*</span></code></a></p></li>
+<li><p><a class="reference internal" href="#manage-redis-help" id="id30"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">redis.help</span></code></a></p></li>
+<li><p><a class="reference internal" href="#manage-go-help" id="id31"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">go.help</span></code></a></p></li>
+</ul>
+</nav>
+<p>The usage is simple, just type <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">{target-name}</span></code> to <em>build</em> a target.
+Calling the <code class="docutils literal notranslate"><span class="pre">help</span></code> target gives a first overview (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">help</span></code>):</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-0-YGBtYWtlYGA=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-0-YGBtYWtlYGA=" name="YGBtYWtlYGA=" role="tab" tabindex="0"><code class="docutils literal notranslate"><span class="pre">make</span></code></button><button aria-controls="panel-0-YGAuL21hbmFnZWBg" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-0-YGAuL21hbmFnZWBg" name="YGAuL21hbmFnZWBg" role="tab" tabindex="-1"><code class="docutils literal notranslate"><span class="pre">./manage</span></code></button></div><div aria-labelledby="tab-0-YGBtYWtlYGA=" class="sphinx-tabs-panel group-tab" id="panel-0-YGBtYWtlYGA=" name="YGBtYWtlYGA=" role="tabpanel" tabindex="0"><div class="highlight-text notranslate"><div class="highlight"><pre><span></span>INFO: sourced NVM environment from /home/runner/.nvm
+nvm.: use nvm (without dot) to execute nvm commands directly
+ install : install NVM locally at /home/runner/work/searxng/searxng/.nvm
+ clean : remove NVM installation
+ status : prompt some status informations about nvm &amp; node
+ nodejs : install Node.js latest LTS
+ cmd ... : run command ... in NVM environment
+ bash : start bash interpreter with NVM environment sourced
+webapp.:
+ run : run developer instance
+docs.:
+ html : build HTML documentation
+ live : autobuild HTML documentation while editing
+ gh-pages : deploy on gh-pages branch
+ prebuild : build reST include files (./build/docs/includes)
+ clean : clean documentation build
+docker.:
+ build : build docker image
+ push : build and push docker image
+gecko.driver:
+ download &amp; install geckodriver if not already installed (required for
+ robot_tests)
+redis:
+ build : build redis binaries at /home/runner/work/searxng/searxng/dist/redis/6.2.6/amd64
+ install : create user (searxng-redis) and install systemd service (searxng-redis)
+ help : show more redis commands
+py.:
+ build : Build python packages at ./dist
+ clean : delete virtualenv and intermediate py files
+pyenv.:
+ install : developer install of SearXNG into virtualenv
+ uninstall : uninstall developer installation
+ cmd ... : run command ... in virtualenv
+ OK : test if virtualenv is OK
+format.:
+ python : format Python code source using black
+pygments.:
+ less : build LESS files for pygments
+go.:
+ ls : list golang binary archives (stable)
+ golang : (re-) install golang binary in user&#39;s $HOME/local folder
+ install : install go package in user&#39;s $HOME/go-apps folder
+ bash : start bash interpreter with golang environment sourced
+node.:
+ env : download &amp; install SearXNG&#39;s npm dependencies locally
+ env.dev : download &amp; install developer and CI tools
+ clean : drop locally npm installations
+weblate.:
+ push.translations: push translation changes from SearXNG to Weblate&#39;s counterpart
+ to.translations: Update &#39;translations&#39; branch with last additions from Weblate.
+data.:
+ all : update searx/sxng_locales.py and searx/data/*
+ traits : update searx/data/engine_traits.json &amp; searx/sxng_locales.py
+ useragents: update searx/data/useragents.json with the most recent versions of Firefox
+ locales : update searx/data/locales.json from babel
+test.:
+ yamllint : lint YAML files (YAMLLINT_FILES)
+ pylint : lint ./searx, ./searxng_extra and ./tests
+ pyright : static type check of python sources
+ black : check black code format
+ unit : run unit tests
+ coverage : run unit tests with coverage
+ robot : run robot test
+ rst : test .rst files incl. README.rst
+ clean : clean intermediate test stuff
+themes.:
+ all : build all themes
+ live : to get live builds of CSS &amp; JS use &#39;LIVE_THEME=simple make run&#39;
+ simple.:
+ build : build simple theme
+ test : test simple theme
+static.build.: [build] /static
+ commit : build &amp; commit /static folder
+ drop : drop last commit if it was previously done by static.build.commit
+ restore : git restore of the /static folder (after themes.all)
+environment ...
+ SEARXNG_REDIS_URL :
+----
+run - run developer instance
+install - developer install of SearxNG into virtualenv
+uninstall - uninstall developer installation
+clean - clean up working tree
+search.checker - check search engines
+test - run shell &amp; CI tests
+test.shell - test shell scripts
+ci.test - run CI tests
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-0-YGAuL21hbmFnZWBg" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-0-YGAuL21hbmFnZWBg" name="YGAuL21hbmFnZWBg" role="tabpanel" tabindex="0"><p>The Makefile targets are implemented for comfort, if you can do without
+tab-completion and need to have a more granular control, use
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/manage">git://manage</a> without the Makefile wrappers.</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>./manage<span class="w"> </span><span class="nb">help</span>
+</pre></div>
+</div>
+</div></div>
+<section id="python-environment-make-install">
+<span id="make-install"></span><h2><a class="toc-backref" href="#id14" role="doc-backlink">Python environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">install</span></code>)</a><a class="headerlink" href="#python-environment-make-install" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">activate environment</p>
+<p><code class="docutils literal notranslate"><span class="pre">source</span> <span class="pre">./local/py3/bin/activate</span></code></p>
+</aside>
+<p>We do no longer need to build up the virtualenv manually. Jump into your git
+working tree and release a <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">install</span></code> to get a virtualenv with a
+<em>developer install</em> of SearXNG (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/setup.py">git://setup.py</a>).</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cd ~/searxng-clone
+$ make install
+PYENV [virtualenv] installing ./requirements*.txt into local/py3
+...
+PYENV [install] pip install -e &#39;searx[test]&#39;
+...
+Successfully installed searxng-2023.7.19+a446dea1b
+</pre></div>
+</div>
+<p>If you release <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">install</span></code> multiple times the installation will only
+rebuild if the sha256 sum of the <em>requirement files</em> fails. With other words:
+the check fails if you edit the requirements listed in
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/requirements-dev.txt">git://requirements-dev.txt</a> and <a class="reference external" href="https://github.com/searxng/searxng/blob/master/requirements.txt">git://requirements.txt</a>).</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ make install
+PYENV OK
+PYENV [virtualenv] requirements.sha256 failed
+ [virtualenv] - 6cea6eb6def9e14a18bf32f8a3e... ./requirements-dev.txt
+ [virtualenv] - 471efef6c73558e391c3adb35f4... ./requirements.txt
+...
+PYENV [virtualenv] installing ./requirements*.txt into local/py3
+...
+PYENV [install] pip install -e &#39;searx[test]&#39;
+...
+Successfully installed searxng-2023.7.19+a446dea1b
+</pre></div>
+</div>
+<aside class="sidebar">
+<p class="sidebar-title">drop environment</p>
+<p>To get rid of the existing environment before re-build use <a class="reference internal" href="#make-clean"><span class="std std-ref">clean target</span></a> first.</p>
+</aside>
+<p>If you think, something goes wrong with your ./local environment or you change
+the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/setup.py">git://setup.py</a> file, you have to call <a class="reference internal" href="#make-clean"><span class="std std-ref">make clean</span></a>.</p>
+</section>
+<section id="node-js-environment-make-node-env">
+<span id="make-node-env"></span><h2><a class="toc-backref" href="#id15" role="doc-backlink">Node.js environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">node.env</span></code>)</a><a class="headerlink" href="#node-js-environment-make-node-env" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://nodejs.org/">Node.js</a> version 16.13.0 or higher is required to build the themes.
+If the requirement is not met, the build chain uses <a class="reference external" href="https://github.com/nvm-sh">nvm</a> (Node Version
+Manager) to install latest LTS of <a class="reference external" href="https://nodejs.org/">Node.js</a> locally: there is no need to
+install <a class="reference external" href="https://github.com/nvm-sh">nvm</a> or <a class="reference external" href="https://www.npmjs.com/">npm</a> on your system.</p>
+<p>To install <a class="reference external" href="https://github.com/nvm-sh">NVM</a> and <a class="reference external" href="https://nodejs.org/">Node.js</a> in once you can use <a class="reference internal" href="#make-nvm-nodejs"><span class="std std-ref">make nvm.nodejs</span></a>.</p>
+<section id="nvm-make-nvm-install-nvm-status">
+<span id="make-nvm"></span><h3><a class="toc-backref" href="#id16" role="doc-backlink">NVM <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">nvm.install</span> <span class="pre">nvm.status</span></code></a><a class="headerlink" href="#nvm-make-nvm-install-nvm-status" title="Link to this heading">¶</a></h3>
+<p>Use <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">nvm.status</span></code> to get the current status of your <a class="reference external" href="https://nodejs.org/">Node.js</a> and <a class="reference external" href="https://github.com/nvm-sh">nvm</a>
+setup.</p>
+<div class="sphinx-tabs docutils container">
+<div aria-label="Tabbed content" class="closeable" role="tablist"><button aria-controls="panel-1-bnZtLmluc3RhbGw=" aria-selected="true" class="sphinx-tabs-tab group-tab" id="tab-1-bnZtLmluc3RhbGw=" name="bnZtLmluc3RhbGw=" role="tab" tabindex="0">nvm.install</button><button aria-controls="panel-1-bnZtLnN0YXR1cyAodWJ1MjAwNCk=" aria-selected="false" class="sphinx-tabs-tab group-tab" id="tab-1-bnZtLnN0YXR1cyAodWJ1MjAwNCk=" name="bnZtLnN0YXR1cyAodWJ1MjAwNCk=" role="tab" tabindex="-1">nvm.status (ubu2004)</button></div><div aria-labelledby="tab-1-bnZtLmluc3RhbGw=" class="sphinx-tabs-panel group-tab" id="panel-1-bnZtLmluc3RhbGw=" name="bnZtLmluc3RhbGw=" role="tabpanel" tabindex="0"><div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nv">LANG</span><span class="o">=</span>C<span class="w"> </span>make<span class="w"> </span>nvm.install
+INFO:<span class="w"> </span>install<span class="w"> </span><span class="o">(</span>update<span class="o">)</span><span class="w"> </span>NVM<span class="w"> </span>at<span class="w"> </span>./searxng/.nvm
+INFO:<span class="w"> </span>clone:<span class="w"> </span>https://github.com/nvm-sh/nvm.git
+<span class="w"> </span><span class="o">||</span><span class="w"> </span>Cloning<span class="w"> </span>into<span class="w"> </span><span class="s1">&#39;./searxng/.nvm&#39;</span>...
+INFO:<span class="w"> </span>checkout<span class="w"> </span>v0.39.4
+<span class="w"> </span><span class="o">||</span><span class="w"> </span>HEAD<span class="w"> </span>is<span class="w"> </span>now<span class="w"> </span>at<span class="w"> </span>8fbf8ab<span class="w"> </span>v0.39.4
+</pre></div>
+</div>
+</div><div aria-labelledby="tab-1-bnZtLnN0YXR1cyAodWJ1MjAwNCk=" class="sphinx-tabs-panel group-tab" hidden="true" id="panel-1-bnZtLnN0YXR1cyAodWJ1MjAwNCk=" name="bnZtLnN0YXR1cyAodWJ1MjAwNCk=" role="tabpanel" tabindex="0"><p>Here is the output you will typically get on a Ubuntu 20.04 system which
+serves only a <a class="reference external" href="https://nodejs.org/en/about/releases/">no longer active</a>
+Release <a class="reference external" href="https://packages.ubuntu.com/focal/nodejs">Node.js v10.19.0</a>.</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>make<span class="w"> </span>nvm.status
+INFO:<span class="w"> </span>Node.js<span class="w"> </span>is<span class="w"> </span>installed<span class="w"> </span>at<span class="w"> </span>/usr/bin/node
+INFO:<span class="w"> </span>Node.js<span class="w"> </span>is<span class="w"> </span>version<span class="w"> </span>v10.19.0
+WARN:<span class="w"> </span>minimal<span class="w"> </span>Node.js<span class="w"> </span>version<span class="w"> </span>is<span class="w"> </span><span class="m">16</span>.13.0
+INFO:<span class="w"> </span>npm<span class="w"> </span>is<span class="w"> </span>installed<span class="w"> </span>at<span class="w"> </span>/usr/bin/npm
+INFO:<span class="w"> </span>npm<span class="w"> </span>is<span class="w"> </span>version<span class="w"> </span><span class="m">6</span>.14.4
+WARN:<span class="w"> </span>NVM<span class="w"> </span>is<span class="w"> </span>not<span class="w"> </span>installed
+</pre></div>
+</div>
+</div></div>
+</section>
+<section id="make-nvm-nodejs">
+<span id="id1"></span><h3><a class="toc-backref" href="#id17" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">nvm.nodejs</span></code></a><a class="headerlink" href="#make-nvm-nodejs" title="Link to this heading">¶</a></h3>
+<p>Install latest <a class="reference external" href="https://nodejs.org/">Node.js</a> LTS locally (uses <a class="reference external" href="https://github.com/nvm-sh">nvm</a>):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ make nvm.nodejs
+INFO: install (update) NVM at /share/searxng/.nvm
+INFO: clone: https://github.com/nvm-sh/nvm.git
+...
+Downloading and installing node v16.13.0...
+...
+INFO: Node.js is installed at searxng/.nvm/versions/node/v16.13.0/bin/node
+INFO: Node.js is version v16.13.0
+INFO: npm is installed at searxng/.nvm/versions/node/v16.13.0/bin/npm
+INFO: npm is version 8.1.0
+INFO: NVM is installed at searxng/.nvm
+</pre></div>
+</div>
+</section>
+</section>
+<section id="make-run">
+<span id="id2"></span><h2><a class="toc-backref" href="#id18" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a><a class="headerlink" href="#make-run" title="Link to this heading">¶</a></h2>
+<p>To get up a running a developer instance simply call <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code>. This enables
+<em>debug</em> option in <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/settings.yml">git://searx/settings.yml</a>, starts a <code class="docutils literal notranslate"><span class="pre">./searx/webapp.py</span></code>
+instance and opens the URL in your favorite WEB browser (<a class="reference external" href="https://manpages.debian.org/jump?q=xdg-open">xdg-open</a>):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ make run
+</pre></div>
+</div>
+<p>Changes to theme’s HTML templates (jinja2) are instant. Changes to the CSS &amp; JS
+sources of the theme need to be rebuild. You can do that by running:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ make themes.all
+</pre></div>
+</div>
+<p>Alternatively to <code class="docutils literal notranslate"><span class="pre">themes.all</span></code> you can run <em>live builds</em> of the theme you are
+modify (<a class="reference internal" href="#make-themes"><span class="std std-ref">make themes.*</span></a>):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ LIVE_THEME=simple make run
+</pre></div>
+</div>
+</section>
+<section id="make-format-python">
+<span id="id3"></span><h2><a class="toc-backref" href="#id19" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">format.python</span></code></a><a class="headerlink" href="#make-format-python" title="Link to this heading">¶</a></h2>
+<p>Format Python source code using <a class="reference external" href="https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html">Black code style</a>. See <code class="docutils literal notranslate"><span class="pre">$BLACK_OPTIONS</span></code>
+and <code class="docutils literal notranslate"><span class="pre">$BLACK_TARGETS</span></code> in <a class="reference external" href="https://github.com/searxng/searxng/blob/master/Makefile">git://Makefile</a>.</p>
+<div class="admonition attention">
+<p class="admonition-title">Attention</p>
+<p>We stuck at Black 22.12.0, please read comment in PR <a class="reference external" href="https://github.com/searxng/searxng/pull/2159#pullrequestreview-1284094735">Bump black from 22.12.0
+to 23.1.0</a></p>
+</div>
+</section>
+<section id="make-clean">
+<span id="id4"></span><h2><a class="toc-backref" href="#id20" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a><a class="headerlink" href="#make-clean" title="Link to this heading">¶</a></h2>
+<p>Drops all intermediate files, all builds, but keep sources untouched. Before
+calling <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code> stop all processes using the <a class="reference internal" href="#make-install"><span class="std std-ref">Python environment (make install)</span></a> or
+<a class="reference internal" href="#make-node-env"><span class="std std-ref">Node.js environment (make node.env)</span></a>.</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ make clean
+CLEAN pyenv
+PYENV [virtualenv] drop local/py3
+CLEAN docs -- build/docs dist/docs
+CLEAN themes -- locally installed npm dependencies
+...
+CLEAN test stuff
+CLEAN common files
+</pre></div>
+</div>
+</section>
+<section id="make-docs">
+<span id="id5"></span><h2><a class="toc-backref" href="#id21" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span></code></a><a class="headerlink" href="#make-docs" title="Link to this heading">¶</a></h2>
+<p>Target <code class="docutils literal notranslate"><span class="pre">docs</span></code> builds the documentation:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>make<span class="w"> </span>docs
+HTML<span class="w"> </span>./docs<span class="w"> </span>--&gt;<span class="w"> </span>file://
+DOCS<span class="w"> </span>build<span class="w"> </span>build/docs/includes
+...
+The<span class="w"> </span>HTML<span class="w"> </span>pages<span class="w"> </span>are<span class="w"> </span><span class="k">in</span><span class="w"> </span>dist/docs.
+</pre></div>
+</div>
+<section id="make-docs-clean-docs-live">
+<span id="make-docs-clean"></span><h3><a class="toc-backref" href="#id22" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.clean</span> <span class="pre">docs.live</span></code></a><a class="headerlink" href="#make-docs-clean-docs-live" title="Link to this heading">¶</a></h3>
+<p>We describe the usage of the <code class="docutils literal notranslate"><span class="pre">doc.*</span></code> targets in the <a class="reference internal" href="contribution_guide.html#contrib-docs"><span class="std std-ref">How to contribute /
+Documentation</span></a> section. If you want to edit the documentation
+read our <a class="reference internal" href="contribution_guide.html#make-docs-live"><span class="std std-ref">live build</span></a> section. If you are working in your own brand,
+adjust your <a class="reference internal" href="../admin/settings/settings_brand.html#settings-brand"><span class="std std-ref">brand:</span></a>.</p>
+</section>
+<section id="make-docs-gh-pages">
+<span id="id6"></span><h3><a class="toc-backref" href="#id23" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.gh-pages</span></code></a><a class="headerlink" href="#make-docs-gh-pages" title="Link to this heading">¶</a></h3>
+<p>To deploy on github.io first adjust your <a class="reference internal" href="../admin/settings/settings_brand.html#settings-brand"><span class="std std-ref">brand:</span></a>. For any
+further read <a class="reference internal" href="contribution_guide.html#deploy-on-github-io"><span class="std std-ref">deploy on github.io</span></a>.</p>
+</section>
+</section>
+<section id="make-test">
+<span id="id7"></span><h2><a class="toc-backref" href="#id24" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a><a class="headerlink" href="#make-test" title="Link to this heading">¶</a></h2>
+<p>Runs a series of tests: <a class="reference internal" href="#make-test-pylint"><span class="std std-ref">make test.pylint</span></a>, <code class="docutils literal notranslate"><span class="pre">test.pep8</span></code>, <code class="docutils literal notranslate"><span class="pre">test.unit</span></code>
+and <code class="docutils literal notranslate"><span class="pre">test.robot</span></code>. You can run tests selective, e.g.:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ make test.pep8 test.unit test.shell
+TEST test.pep8 OK
+...
+TEST test.unit OK
+...
+TEST test.shell OK
+</pre></div>
+</div>
+<section id="make-test-shell">
+<span id="id8"></span><h3><a class="toc-backref" href="#id25" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test.shell</span></code></a><a class="headerlink" href="#make-test-shell" title="Link to this heading">¶</a></h3>
+<p><a class="reference internal" href="../admin/buildhosts.html#sh-lint"><span class="std std-ref">Lint shell scripts</span></a> / if you have changed some bash scripting run this test before
+commit.</p>
+</section>
+<section id="make-test-pylint">
+<span id="id9"></span><h3><a class="toc-backref" href="#id26" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test.pylint</span></code></a><a class="headerlink" href="#make-test-pylint" title="Link to this heading">¶</a></h3>
+<p><a class="reference external" href="https://www.pylint.org/">Pylint</a> is known as one of the best source-code, bug and quality checker for the
+Python programming language. The pylint profile used in the SearXNG project is
+found in project’s root folder <a class="reference external" href="https://github.com/searxng/searxng/blob/master/.pylintrc">git://.pylintrc</a>.</p>
+</section>
+</section>
+<section id="make-search-checker-engine-name">
+<span id="make-search-checker"></span><h2><a class="toc-backref" href="#id27" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">search.checker.{engine</span> <span class="pre">name}</span></code></a><a class="headerlink" href="#make-search-checker-engine-name" title="Link to this heading">¶</a></h2>
+<p>To check all engines:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">make</span> <span class="n">search</span><span class="o">.</span><span class="n">checker</span>
+</pre></div>
+</div>
+<p>To check a engine with whitespace in the name like <em>google news</em> replace space
+by underline:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">make</span> <span class="n">search</span><span class="o">.</span><span class="n">checker</span><span class="o">.</span><span class="n">google_news</span>
+</pre></div>
+</div>
+<p>To see HTTP requests and more use SEARXNG_DEBUG:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">make</span> <span class="n">SEARXNG_DEBUG</span><span class="o">=</span><span class="mi">1</span> <span class="n">search</span><span class="o">.</span><span class="n">checker</span><span class="o">.</span><span class="n">google_news</span>
+</pre></div>
+</div>
+<p>To filter out HTTP redirects (<a class="reference external" href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection">3xx</a>):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">make</span> <span class="n">SEARXNG_DEBUG</span><span class="o">=</span><span class="mi">1</span> <span class="n">search</span><span class="o">.</span><span class="n">checker</span><span class="o">.</span><span class="n">google_news</span> <span class="o">|</span> <span class="n">grep</span> <span class="o">-</span><span class="n">A1</span> <span class="s2">&quot;HTTP/1.1</span><span class="se">\&quot;</span><span class="s2"> 3[0-9][0-9]&quot;</span>
+<span class="o">...</span>
+<span class="n">Engine</span> <span class="n">google</span> <span class="n">news</span> <span class="n">Checking</span>
+<span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">news</span><span class="o">.</span><span class="n">google</span><span class="o">.</span><span class="n">com</span><span class="p">:</span><span class="mi">443</span> <span class="s2">&quot;GET /search?q=life&amp;hl=en&amp;lr=lang_en&amp;ie=utf8&amp;oe=utf8&amp;ceid=US%3Aen&amp;gl=US HTTP/1.1&quot;</span> <span class="mi">302</span> <span class="mi">0</span>
+<span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">news</span><span class="o">.</span><span class="n">google</span><span class="o">.</span><span class="n">com</span><span class="p">:</span><span class="mi">443</span> <span class="s2">&quot;GET /search?q=life&amp;hl=en-US&amp;lr=lang_en&amp;ie=utf8&amp;oe=utf8&amp;ceid=US:en&amp;gl=US HTTP/1.1&quot;</span> <span class="mi">200</span> <span class="kc">None</span>
+<span class="o">--</span>
+<span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">news</span><span class="o">.</span><span class="n">google</span><span class="o">.</span><span class="n">com</span><span class="p">:</span><span class="mi">443</span> <span class="s2">&quot;GET /search?q=computer&amp;hl=en&amp;lr=lang_en&amp;ie=utf8&amp;oe=utf8&amp;ceid=US%3Aen&amp;gl=US HTTP/1.1&quot;</span> <span class="mi">302</span> <span class="mi">0</span>
+<span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">news</span><span class="o">.</span><span class="n">google</span><span class="o">.</span><span class="n">com</span><span class="p">:</span><span class="mi">443</span> <span class="s2">&quot;GET /search?q=computer&amp;hl=en-US&amp;lr=lang_en&amp;ie=utf8&amp;oe=utf8&amp;ceid=US:en&amp;gl=US HTTP/1.1&quot;</span> <span class="mi">200</span> <span class="kc">None</span>
+<span class="o">--</span>
+</pre></div>
+</div>
+</section>
+<section id="make-themes">
+<span id="id10"></span><h2><a class="toc-backref" href="#id28" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">themes.*</span></code></a><a class="headerlink" href="#make-themes" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="quickstart.html#devquickstart"><span class="std std-ref">Development Quickstart</span></a></p></li>
+</ul>
+</aside>
+<p>The <a class="reference external" href="https://github.com/searxng/searxng/blob/master/Makefile">git://Makefile</a> targets <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">theme.*</span></code> cover common tasks to build the
+theme(s). The <code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">themes.*</span></code> command line can be used to convenient run
+common theme build tasks.</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>INFO: sourced NVM environment from /home/runner/.nvm
+themes.:
+ all : build all themes
+ live : to get live builds of CSS &amp; JS use &#39;LIVE_THEME=simple make run&#39;
+ simple.:
+ build : build simple theme
+ test : test simple theme
+</pre></div>
+</div>
+<p>To get live builds while modifying CSS &amp; JS use (<a class="reference internal" href="#make-run"><span class="std std-ref">make run</span></a>):</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nv">LIVE_THEME</span><span class="o">=</span>simple<span class="w"> </span>make<span class="w"> </span>run
+</pre></div>
+</div>
+</section>
+<section id="make-static-build">
+<span id="id11"></span><h2><a class="toc-backref" href="#id29" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">static.build.*</span></code></a><a class="headerlink" href="#make-static-build" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="quickstart.html#devquickstart"><span class="std std-ref">Development Quickstart</span></a></p></li>
+</ul>
+</aside>
+<p>The <a class="reference external" href="https://github.com/searxng/searxng/blob/master/Makefile">git://Makefile</a> targets <code class="docutils literal notranslate"><span class="pre">static.build.*</span></code> cover common tasks to build (a
+commit of) the static files. The <code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">static.build..*</span></code> command line
+can be used to convenient run common build tasks of the static files.</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>INFO: sourced NVM environment from /home/runner/.nvm
+static.build.: [build] /static
+ commit : build &amp; commit /static folder
+ drop : drop last commit if it was previously done by static.build.commit
+ restore : git restore of the /static folder (after themes.all)
+</pre></div>
+</div>
+</section>
+<section id="manage-redis-help">
+<span id="id12"></span><h2><a class="toc-backref" href="#id30" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">redis.help</span></code></a><a class="headerlink" href="#manage-redis-help" title="Link to this heading">¶</a></h2>
+<p>The <code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">redis.*</span></code> command line can be used to convenient run common Redis
+tasks (<a class="reference internal" href="../admin/settings/settings_redis.html#redis-developer-notes"><span class="std std-ref">Redis Developer Notes</span></a>).</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>INFO: sourced NVM environment from /home/runner/.nvm
+redis.:
+ devpkg : install essential packages to compile redis
+ build : build redis binaries at /home/runner/work/searxng/searxng/dist/redis/6.2.6/amd64
+ install : create user (searxng-redis) and install systemd service (searxng-redis)
+ remove : delete user (searxng-redis) and remove service (searxng-redis)
+ shell : start bash interpreter from user searxng-redis
+ src : clone redis source code to &lt;path&gt; and checkput 6.2.6
+ useradd : create user (searxng-redis) at /usr/local/searxng-redis
+ userdel : delete user (searxng-redis)
+ addgrp : add &lt;user&gt; to group (searxng-redis)
+ rmgrp : remove &lt;user&gt; from group (searxng-redis)
+</pre></div>
+</div>
+</section>
+<section id="manage-go-help">
+<span id="id13"></span><h2><a class="toc-backref" href="#id31" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">go.help</span></code></a><a class="headerlink" href="#manage-go-help" title="Link to this heading">¶</a></h2>
+<p>The <code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">go.*</span></code> command line can be used to convenient run common <a class="reference external" href="https://en.wikipedia.org/wiki/Go_(programming_language)">go
+(wiki)</a> tasks.</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>INFO: sourced NVM environment from /home/runner/.nvm
+go.:
+ ls : list golang binary archives (stable)
+ golang : (re-) install golang binary in user&#39;s $HOME/local folder
+ install : install go package in user&#39;s $HOME/go-apps folder
+ bash : start bash interpreter with golang environment sourced
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#python-environment-make-install">Python environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">install</span></code>)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#node-js-environment-make-node-env">Node.js environment (<code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">node.env</span></code>)</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#nvm-make-nvm-install-nvm-status">NVM <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">nvm.install</span> <span class="pre">nvm.status</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#make-nvm-nodejs"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">nvm.nodejs</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#make-run"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">run</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#make-format-python"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">format.python</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#make-clean"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">clean</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#make-docs"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#make-docs-clean-docs-live"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.clean</span> <span class="pre">docs.live</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#make-docs-gh-pages"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">docs.gh-pages</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#make-test"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#make-test-shell"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test.shell</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#make-test-pylint"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">test.pylint</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#make-search-checker-engine-name"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">search.checker.{engine</span> <span class="pre">name}</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#make-themes"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">themes.*</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#make-static-build"><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">static.build.*</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#manage-redis-help"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">redis.help</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#manage-go-help"><code class="docutils literal notranslate"><span class="pre">./manage</span> <span class="pre">go.help</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="lxcdev.html" title="previous chapter">Developing in Linux Containers</a>
+ <li>Next: <a href="reST.html" title="next chapter">reST primer</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/makefile.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/plugins.html b/dev/plugins.html
new file mode 100644
index 000000000..2c0fb5cf0
--- /dev/null
+++ b/dev/plugins.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Plugins &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Translation" href="translation.html" />
+ <link rel="prev" title="Search API" href="search_api.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="translation.html" title="Translation"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="search_api.html" title="Search API"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Plugins</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="plugins">
+<span id="dev-plugin"></span><h1>Plugins<a class="headerlink" href="#plugins" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../admin/plugins.html#plugins-generic"><span class="std std-ref">Plugins builtin</span></a></p></li>
+</ul>
+</aside>
+<p>Plugins can extend or replace functionality of various components of searx.</p>
+<section id="example-plugin">
+<h2>Example plugin<a class="headerlink" href="#example-plugin" title="Link to this heading">¶</a></h2>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;Example plugin&#39;</span>
+<span class="n">description</span> <span class="o">=</span> <span class="s1">&#39;This plugin extends the suggestions with the word &quot;example&quot;&#39;</span>
+<span class="n">default_on</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># disabled by default</span>
+
+<span class="c1"># attach callback to the post search hook</span>
+<span class="c1"># request: flask request object</span>
+<span class="c1"># ctx: the whole local context of the post search hook</span>
+<span class="k">def</span> <span class="nf">post_search</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">search</span><span class="p">):</span>
+ <span class="n">search</span><span class="o">.</span><span class="n">result_container</span><span class="o">.</span><span class="n">suggestions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s1">&#39;example&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="kc">True</span>
+</pre></div>
+</div>
+</section>
+<section id="external-plugins">
+<h2>External plugins<a class="headerlink" href="#external-plugins" title="Link to this heading">¶</a></h2>
+<p>SearXNG supports <em>external plugins</em> / there is no need to install one, SearXNG
+runs out of the box. But to demonstrate; in the example below we install the
+SearXNG plugins from <em>The Green Web Foundation</em> <a class="reference external" href="https://www.thegreenwebfoundation.org/news/searching-the-green-web-with-searx/">[ref]</a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>utils/searxng.sh<span class="w"> </span>instance<span class="w"> </span>cmd<span class="w"> </span>bash<span class="w"> </span>-c
+<span class="o">(</span>searxng-pyenv<span class="o">)</span>$<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>git+https://github.com/return42/tgwf-searx-plugins
+</pre></div>
+</div>
+<p>In the <a class="reference internal" href="../admin/settings/settings.html#settings-yml"><span class="std std-ref">settings.yml</span></a> activate the <code class="docutils literal notranslate"><span class="pre">plugins:</span></code> section and add module
+<code class="docutils literal notranslate"><span class="pre">only_show_green_results</span></code> from <code class="docutils literal notranslate"><span class="pre">tgwf-searx-plugins</span></code>.</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">plugins</span><span class="p">:</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">- only_show_green_results</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
+</pre></div>
+</div>
+</section>
+<section id="plugin-entry-points">
+<h2>Plugin entry points<a class="headerlink" href="#plugin-entry-points" title="Link to this heading">¶</a></h2>
+<p>Entry points (hooks) define when a plugin runs. Right now only three hooks are
+implemented. So feel free to implement a hook if it fits the behaviour of your
+plugin. A plugin doesn’t need to implement all the hooks.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="pre_search">
+<span class="sig-name descname"><span class="pre">pre_search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">search</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span></span><a class="headerlink" href="#pre_search" title="Link to this definition">¶</a></dt>
+<dd><p>Runs BEFORE the search request.</p>
+<p><cite>search.result_container</cite> can be changed.</p>
+<p>Return a boolean:</p>
+<ul class="simple">
+<li><p>True to continue the search</p></li>
+<li><p>False to stop the search</p></li>
+</ul>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>request</strong> (<em>flask.request</em>)</p></li>
+<li><p><strong>search</strong> (<a class="reference internal" href="../src/searx.search.html#searx.search.SearchWithPlugins" title="searx.search.SearchWithPlugins"><em>searx.search.SearchWithPlugins</em></a>)</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>False to stop the search</p>
+</dd>
+<dt class="field-odd">Return type<span class="colon">:</span></dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)">bool</a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="post_search">
+<span class="sig-name descname"><span class="pre">post_search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">search</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="headerlink" href="#post_search" title="Link to this definition">¶</a></dt>
+<dd><p>Runs AFTER the search request.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>request</strong> (<em>flask.request</em>) – Flask request.</p></li>
+<li><p><strong>search</strong> (<a class="reference internal" href="../src/searx.search.html#searx.search.SearchWithPlugins" title="searx.search.SearchWithPlugins"><em>searx.search.SearchWithPlugins</em></a>) – Context.</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="on_result">
+<span class="sig-name descname"><span class="pre">on_result</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">search</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">result</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span></span><a class="headerlink" href="#on_result" title="Link to this definition">¶</a></dt>
+<dd><p>Runs for each result of each engine.</p>
+<p><cite>result</cite> can be changed.</p>
+<p>If <cite>result[“url”]</cite> is defined, then <cite>result[“parsed_url”] = urlparse(result[‘url’])</cite></p>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p><cite>result[“url”]</cite> can be changed, but <cite>result[“parsed_url”]</cite> must be updated too.</p>
+</div>
+<p>Return a boolean:</p>
+<ul class="simple">
+<li><p>True to keep the result</p></li>
+<li><p>False to remove the result</p></li>
+</ul>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>request</strong> (<em>flask.request</em>)</p></li>
+<li><p><strong>search</strong> (<a class="reference internal" href="../src/searx.search.html#searx.search.SearchWithPlugins" title="searx.search.SearchWithPlugins"><em>searx.search.SearchWithPlugins</em></a>)</p></li>
+<li><p><strong>result</strong> (<a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><em>Dict</em></a>) – Result, see - <a class="reference internal" href="engines/engine_overview.html#engine-results"><span class="std std-ref">Result Types (template)</span></a></p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>True to keep the result</p>
+</dd>
+<dt class="field-odd">Return type<span class="colon">:</span></dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)">bool</a></p>
+</dd>
+</dl>
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Plugins</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#example-plugin">Example plugin</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#external-plugins">External plugins</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#plugin-entry-points">Plugin entry points</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#pre_search"><code class="docutils literal notranslate"><span class="pre">pre_search()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#post_search"><code class="docutils literal notranslate"><span class="pre">post_search()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#on_result"><code class="docutils literal notranslate"><span class="pre">on_result()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="search_api.html" title="previous chapter">Search API</a>
+ <li>Next: <a href="translation.html" title="next chapter">Translation</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/plugins.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/quickstart.html b/dev/quickstart.html
new file mode 100644
index 000000000..40b23bbc9
--- /dev/null
+++ b/dev/quickstart.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Development Quickstart &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Runtime Management" href="rtm_asdf.html" />
+ <link rel="prev" title="Developer documentation" href="index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="rtm_asdf.html" title="Runtime Management"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="Developer documentation"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Development Quickstart</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="development-quickstart">
+<span id="devquickstart"></span><h1>Development Quickstart<a class="headerlink" href="#development-quickstart" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="makefile.html#makefile"><span class="std std-ref">Makefile &amp; ./manage</span></a></p></li>
+<li><p><a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">Buildhosts</span></a></p></li>
+</ul>
+</aside>
+<p>SearXNG loves developers; Developers do not need to worry about tool chains, the
+usual developer tasks can be comfortably executed via <a class="reference internal" href="makefile.html#makefile"><span class="std std-ref">make</span></a>.</p>
+<p>Don’t hesitate, just clone SearXNG’s sources and start hacking right now ..</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/searxng/searxng.git<span class="w"> </span>searxng
+</pre></div>
+</div>
+<p>Here is how a minimal workflow looks like:</p>
+<ol class="arabic simple">
+<li><p><em>start</em> hacking</p></li>
+<li><p><em>run</em> your code: <a class="reference internal" href="makefile.html#make-run"><span class="std std-ref">make run</span></a></p></li>
+<li><p><em>format &amp; test</em> your code: <a class="reference internal" href="makefile.html#make-format-python"><span class="std std-ref">make format.python</span></a> and <a class="reference internal" href="makefile.html#make-test"><span class="std std-ref">make test</span></a></p></li>
+</ol>
+<p>If you think at some point something fails, go back to <em>start</em>. Otherwise,
+choose a meaningful commit message and we are happy to receive your pull
+request. To not end in <em>wild west</em> we have some directives, please pay attention
+to our “<a class="reference internal" href="contribution_guide.html#how-to-contribute"><span class="std std-ref">How to contribute</span></a>” guideline.</p>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="makefile.html#make-nvm"><span class="std std-ref">NVM make nvm.install nvm.status</span></a></p></li>
+<li><p><a class="reference internal" href="makefile.html#make-themes"><span class="std std-ref">make themes.*</span></a></p></li>
+</ul>
+</aside>
+<p>If you implement themes, you will need to setup a <a class="reference internal" href="makefile.html#make-node-env"><span class="std std-ref">Node.js environment</span></a>: <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">node.env</span></code></p>
+<p>Before you call <em>make run</em> (2.), you need to compile the modified styles and
+JavaScript: <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">themes.all</span></code></p>
+<p>Alternatively you can also compile selective the theme you have modified,
+e.g. the <em>simple</em> theme.</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>make<span class="w"> </span>themes.simple
+</pre></div>
+</div>
+<div class="admonition tip">
+<p class="admonition-title">Tip</p>
+<p>To get live builds while modifying CSS &amp; JS use: <code class="docutils literal notranslate"><span class="pre">LIVE_THEME=simple</span> <span class="pre">make</span> <span class="pre">run</span></code></p>
+</div>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="makefile.html#make-static-build"><span class="std std-ref">make static.build.*</span></a></p></li>
+</ul>
+</aside>
+<p>If you finished your <em>tests</em> you can start to commit your changes. To separate
+the modified source code from the build products first run:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>make<span class="w"> </span>static.build.restore
+</pre></div>
+</div>
+<p>This will restore the old build products and only your changes of the code
+remain in the working tree which can now be added &amp; committed. When all sources
+are committed, you can commit the build products simply by:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>make<span class="w"> </span>static.build.commit
+</pre></div>
+</div>
+<p>Committing the build products should be the last step, just before you send us
+your PR. There is also a make target to rewind this last build commit:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>make<span class="w"> </span>static.build.drop
+</pre></div>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="index.html" title="previous chapter">Developer documentation</a>
+ <li>Next: <a href="rtm_asdf.html" title="next chapter">Runtime Management</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/quickstart.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/reST.html b/dev/reST.html
new file mode 100644
index 000000000..5650d1491
--- /dev/null
+++ b/dev/reST.html
@@ -0,0 +1,1748 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>reST primer &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Tooling box searxng_extra" href="searxng_extra/index.html" />
+ <link rel="prev" title="Makefile &amp; ./manage" href="makefile.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searxng_extra/index.html" title="Tooling box searxng_extra"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="makefile.html" title="Makefile &amp; ./manage"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">reST primer</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="rest-primer">
+<span id="id1"></span><h1>reST primer<a class="headerlink" href="#rest-primer" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title"><a class="reference external" href="https://en.wikipedia.org/wiki/KISS_principle">KISS</a> and <a class="reference external" href="https://docs.python-guide.org/writing/style/">readability</a></p>
+<p>Instead of defining more and more roles, we at SearXNG encourage our
+contributors to follow principles like <a class="reference external" href="https://en.wikipedia.org/wiki/KISS_principle">KISS</a> and <a class="reference external" href="https://docs.python-guide.org/writing/style/">readability</a>.</p>
+</aside>
+<p>We at SearXNG are using reStructuredText (aka <a class="reference external" href="https://docutils.sourceforge.io/rst.html">reST</a>) markup for all kind of
+documentation. With the builders from the <a class="reference external" href="https://www.sphinx-doc.org">Sphinx</a> project a HTML output is
+generated and deployed at <a class="reference external" href="https://docs.searxng.org/">docs.searxng.org</a>. For build prerequisites read
+<a class="reference internal" href="../admin/buildhosts.html#docs-build"><span class="std std-ref">Build docs</span></a>.</p>
+<p>The source files of SearXNG’s documentation are located at <a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs">git://docs</a>.
+Sphinx assumes source files to be encoded in UTF-8 by default. Run <a class="reference internal" href="contribution_guide.html#make-docs-live"><span class="std std-ref">make
+docs.live</span></a> to build HTML while editing.</p>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html">Sphinx-Primer</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/stable/markup/index.html">Sphinx markup constructs</a></p></li>
+<li><p><a class="reference external" href="https://docutils.sourceforge.io/rst.html">reST</a>, <a class="reference external" href="http://docutils.sourceforge.net/docs/index.html">docutils</a>, <a class="reference external" href="http://docutils.sourceforge.net/FAQ.html">docutils FAQ</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org">Sphinx</a>, <a class="reference external" href="https://www.sphinx-doc.org/en/stable/faq.html">sphinx-doc FAQ</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/stable/config.html">sphinx config</a>, <a class="reference external" href="https://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases">doctree</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations">sphinx cross references</a></p></li>
+<li><p><a class="reference external" href="https://return42.github.io/linuxdoc">linuxdoc</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/stable/ext/intersphinx.html">intersphinx</a></p></li>
+<li><p><a class="reference external" href="https://github.com/tardyp/sphinx-jinja">sphinx-jinja</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/stable/ext/autodoc.html">Sphinx’s autodoc</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/stable/domains.html#the-python-domain">Sphinx’s Python domain</a>, <a class="reference external" href="https://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs">Sphinx’s C domain</a></p></li>
+<li><p><a class="reference external" href="https://www.w3.org/TR/SVG11/expanded-toc.html">SVG</a>, <a class="reference external" href="https://www.imagemagick.org">ImageMagick</a></p></li>
+<li><p><a class="reference external" href="https://graphviz.gitlab.io/_pages/doc/info/lang.html">DOT</a>, <a class="reference external" href="https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf">Graphviz’s dot</a>, <a class="reference external" href="https://graphviz.gitlab.io">Graphviz</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#soft-skills" id="id15">Soft skills</a></p></li>
+<li><p><a class="reference internal" href="#basic-inline-markup" id="id16">Basic inline markup</a></p></li>
+<li><p><a class="reference internal" href="#basic-article-structure" id="id17">Basic article structure</a></p>
+<ul>
+<li><p><a class="reference internal" href="#rest-template" id="id18">reST template</a></p></li>
+<li><p><a class="reference internal" href="#headings" id="id19">Headings</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#anchors-links" id="id20">Anchors &amp; Links</a></p>
+<ul>
+<li><p><a class="reference internal" href="#anchors" id="id21">Anchors</a></p></li>
+<li><p><a class="reference internal" href="#link-ordinary-url" id="id22">Link ordinary URL</a></p></li>
+<li><p><a class="reference internal" href="#smart-refs" id="id23">Smart refs</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#literal-blocks" id="id24">Literal blocks</a></p>
+<ul>
+<li><p><a class="reference internal" href="#rest-literal" id="id25"><code class="docutils literal notranslate"><span class="pre">::</span></code></a></p></li>
+<li><p><a class="reference internal" href="#code-block" id="id26"><code class="docutils literal notranslate"><span class="pre">code-block</span></code></a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#unicode-substitution" id="id27">Unicode substitution</a></p></li>
+<li><p><a class="reference internal" href="#roles" id="id28">Roles</a></p></li>
+<li><p><a class="reference internal" href="#figures-images" id="id29">Figures &amp; Images</a></p>
+<ul>
+<li><p><a class="reference internal" href="#dot-files-aka-graphviz" id="id30">DOT files (aka Graphviz)</a></p></li>
+<li><p><a class="reference internal" href="#kernel-render-dot" id="id31"><code class="docutils literal notranslate"><span class="pre">kernel-render</span></code> DOT</a></p></li>
+<li><p><a class="reference internal" href="#kernel-render-svg" id="id32"><code class="docutils literal notranslate"><span class="pre">kernel-render</span></code> SVG</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#list-markups" id="id33">List markups</a></p>
+<ul>
+<li><p><a class="reference internal" href="#bullet-list" id="id34">Bullet list</a></p></li>
+<li><p><a class="reference internal" href="#horizontal-list" id="id35">Horizontal list</a></p></li>
+<li><p><a class="reference internal" href="#definition-list" id="id36">Definition list</a></p></li>
+<li><p><a class="reference internal" href="#quoted-paragraphs" id="id37">Quoted paragraphs</a></p></li>
+<li><p><a class="reference internal" href="#field-lists" id="id38">Field Lists</a></p></li>
+<li><p><a class="reference internal" href="#further-list-blocks" id="id39">Further list blocks</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#admonitions" id="id40">Admonitions</a></p>
+<ul>
+<li><p><a class="reference internal" href="#sidebar" id="id41">Sidebar</a></p></li>
+<li><p><a class="reference internal" href="#generic-admonition" id="id42">Generic admonition</a></p></li>
+<li><p><a class="reference internal" href="#specific-admonitions" id="id43">Specific admonitions</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tables" id="id44">Tables</a></p>
+<ul>
+<li><p><a class="reference internal" href="#simple-tables" id="id45">Simple tables</a></p></li>
+<li><p><a class="reference internal" href="#grid-tables" id="id46">Grid tables</a></p></li>
+<li><p><a class="reference internal" href="#flat-table" id="id47">flat-table</a></p></li>
+<li><p><a class="reference internal" href="#csv-table" id="id48">CSV table</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#templating" id="id49">Templating</a></p></li>
+<li><p><a class="reference internal" href="#tabbed-views" id="id50">Tabbed views</a></p></li>
+<li><p><a class="reference internal" href="#math-equations" id="id51">Math equations</a></p></li>
+</ul>
+</nav>
+<p><a class="reference external" href="https://www.sphinx-doc.org">Sphinx</a> and <a class="reference external" href="https://docutils.sourceforge.io/rst.html">reST</a> have their place in the python ecosystem. Over that reST is
+used in popular projects, e.g the Linux kernel documentation <a class="reference external" href="https://www.kernel.org/doc/html/latest/doc-guide/sphinx.html">[kernel doc]</a>.</p>
+<aside class="sidebar">
+<p class="sidebar-title">Content matters</p>
+<p>The <a class="reference external" href="https://docs.python-guide.org/writing/style/">readability</a> of the reST sources has its value, therefore we recommend to
+make sparse usage of reST markup / .. content matters!</p>
+</aside>
+<p><strong>reST</strong> is a plaintext markup language, its markup is <em>mostly</em> intuitive and
+you will not need to learn much to produce well formed articles with. I use the
+word <em>mostly</em>: like everything in live, reST has its advantages and
+disadvantages, some markups feel a bit grumpy (especially if you are used to
+other plaintext markups).</p>
+<section id="soft-skills">
+<h2><a class="toc-backref" href="#id15" role="doc-backlink">Soft skills</a><a class="headerlink" href="#soft-skills" title="Link to this heading">¶</a></h2>
+<p>Before going any deeper into the markup let’s face on some <strong>soft skills</strong> a
+trained author brings with, to reach a well feedback from readers:</p>
+<ul class="simple">
+<li><p>Documentation is dedicated to an audience and answers questions from the
+audience point of view.</p></li>
+<li><p>Don’t detail things which are general knowledge from the audience point of
+view.</p></li>
+<li><p>Limit the subject, use cross links for any further reading.</p></li>
+</ul>
+<p>To be more concrete what a <em>point of view</em> means. In the (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs">git://docs</a>)
+folder we have three sections (and the <em>blog</em> folder), each dedicate to a
+different group of audience.</p>
+<dl class="simple">
+<dt>User’s POV: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/user">git://docs/user</a></dt><dd><p>A typical user knows about search engines and might have heard about
+meta crawlers and privacy.</p>
+</dd>
+<dt>Admin’s POV: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/admin">git://docs/admin</a></dt><dd><p>A typical Admin knows about setting up services on a linux system, but he does
+not know all the pros and cons of a SearXNG setup.</p>
+</dd>
+<dt>Developer’s POV: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/dev">git://docs/dev</a></dt><dd><p>Depending on the <a class="reference external" href="https://docs.python-guide.org/writing/style/">readability</a> of code, a typical developer is able to read and
+understand source code. Describe what a item aims to do (e.g. a function).
+If the chronological order matters, describe it. Name the <em>out-of-limits
+conditions</em> and all the side effects a external developer will not know.</p>
+</dd>
+</dl>
+</section>
+<section id="basic-inline-markup">
+<span id="rest-inline-markup"></span><h2><a class="toc-backref" href="#id16" role="doc-backlink">Basic inline markup</a><a class="headerlink" href="#basic-inline-markup" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Inline markup</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#rest-roles"><span class="std std-ref">Roles</span></a></p></li>
+<li><p><a class="reference internal" href="#rest-smart-ref"><span class="std std-ref">Smart refs</span></a></p></li>
+</ul>
+</aside>
+<p>Basic inline markup is done with asterisks and backquotes. If asterisks or
+backquotes appear in running text and could be confused with inline markup
+delimiters, they have to be escaped with a backslash (<code class="docutils literal notranslate"><span class="pre">\*pointer</span></code>).</p>
+<table class="docutils align-default" id="id4">
+<caption><span class="caption-number">Table 16 </span><span class="caption-text">basic inline markup</span><a class="headerlink" href="#id4" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 28.6%" />
+<col style="width: 21.4%" />
+<col style="width: 50.0%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>description</p></th>
+<th class="head"><p>rendered</p></th>
+<th class="head"><p>markup</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>one asterisk for emphasis</p></td>
+<td><p><em>italics</em></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">*italics*</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>two asterisks for strong emphasis</p></td>
+<td><p><strong>boldface</strong></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">**boldface**</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>backquotes for code samples and literals</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">foo()</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">``foo()``</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>quote asterisks or backquotes</p></td>
+<td><p>*foo is a pointer</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">\*foo</span> <span class="pre">is</span> <span class="pre">a</span> <span class="pre">pointer</span></code></p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="basic-article-structure">
+<span id="rest-basic-structure"></span><h2><a class="toc-backref" href="#id17" role="doc-backlink">Basic article structure</a><a class="headerlink" href="#basic-article-structure" title="Link to this heading">¶</a></h2>
+<p>The basic structure of an article makes use of heading adornments to markup
+chapter, sections and subsections.</p>
+<section id="rest-template">
+<span id="id2"></span><h3><a class="toc-backref" href="#id18" role="doc-backlink">reST template</a><a class="headerlink" href="#rest-template" title="Link to this heading">¶</a></h3>
+<p>reST template for an simple article:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_doc refname:</span>
+
+<span class="gh">==============</span>
+<span class="gh">Document title</span>
+<span class="gh">==============</span>
+
+Lorem ipsum dolor sit amet, consectetur adipisici elit .. Further read
+<span class="na">:ref:</span><span class="nv">`chapter refname`</span>.
+
+<span class="p">..</span> <span class="nt">_chapter refname:</span>
+
+<span class="gh">Chapter</span>
+<span class="gh">=======</span>
+
+Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+aliquid ex ea commodi consequat ...
+
+<span class="p">..</span> <span class="nt">_section refname:</span>
+
+<span class="gh">Section</span>
+<span class="gh">-------</span>
+
+lorem ..
+
+<span class="p">..</span> <span class="nt">_subsection refname:</span>
+
+<span class="gh">Subsection</span>
+<span class="gh">~~~~~~~~~~</span>
+
+lorem ..
+</pre></div>
+</div>
+</section>
+<section id="headings">
+<h3><a class="toc-backref" href="#id19" role="doc-backlink">Headings</a><a class="headerlink" href="#headings" title="Link to this heading">¶</a></h3>
+<ol class="arabic simple">
+<li><p>title - with overline for document title:</p></li>
+</ol>
+<blockquote>
+<div><div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="gh">==============</span>
+<span class="gh">Document title</span>
+<span class="gh">==============</span>
+</pre></div>
+</div>
+</div></blockquote>
+<ol class="arabic">
+<li><p>chapter - with anchor named <code class="docutils literal notranslate"><span class="pre">anchor</span> <span class="pre">name</span></code>:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_anchor name:</span>
+
+<span class="gh">Chapter</span>
+<span class="gh">=======</span>
+</pre></div>
+</div>
+</li>
+<li><p>section</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="gh">Section</span>
+<span class="gh">-------</span>
+</pre></div>
+</div>
+</li>
+<li><p>subsection</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="gh">Subsection</span>
+<span class="gh">~~~~~~~~~~</span>
+</pre></div>
+</div>
+</li>
+</ol>
+</section>
+</section>
+<section id="anchors-links">
+<h2><a class="toc-backref" href="#id20" role="doc-backlink">Anchors &amp; Links</a><a class="headerlink" href="#anchors-links" title="Link to this heading">¶</a></h2>
+<section id="anchors">
+<span id="rest-anchor"></span><h3><a class="toc-backref" href="#id21" role="doc-backlink">Anchors</a><a class="headerlink" href="#anchors" title="Link to this heading">¶</a></h3>
+<p>To refer a point in the documentation a anchor is needed. The <a class="reference internal" href="#rest-template"><span class="std std-ref">reST
+template</span></a> shows an example where a chapter titled <em>“Chapters”</em>
+gets an anchor named <code class="docutils literal notranslate"><span class="pre">chapter</span> <span class="pre">title</span></code>. Another example from <em>this</em> document,
+where the anchor named <code class="docutils literal notranslate"><span class="pre">reST</span> <span class="pre">anchor</span></code>:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_reST anchor:</span>
+
+<span class="gh">Anchors</span>
+<span class="gh">-------</span>
+
+To refer a point in the documentation a anchor is needed ...
+</pre></div>
+</div>
+<p>To refer anchors use the <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref">ref role</a> markup:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>Visit chapter <span class="na">:ref:</span><span class="nv">`reST anchor`</span>. Or set hyperlink text manually :ref:`foo
+bar &lt;reST anchor&gt;`.
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title"><code class="docutils literal notranslate"><span class="pre">:ref:</span></code> role</p>
+<p>Visit chapter <a class="reference internal" href="#rest-anchor"><span class="std std-ref">Anchors</span></a>. Or set hyperlink text manually <a class="reference internal" href="#rest-anchor"><span class="std std-ref">foo
+bar</span></a>.</p>
+</div>
+</section>
+<section id="link-ordinary-url">
+<span id="rest-ordinary-ref"></span><h3><a class="toc-backref" href="#id22" role="doc-backlink">Link ordinary URL</a><a class="headerlink" href="#link-ordinary-url" title="Link to this heading">¶</a></h3>
+<p>If you need to reference external URLs use <em>named</em> hyperlinks to maintain
+readability of reST sources. Here is a example taken from <em>this</em> article:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_Sphinx Field Lists:</span>
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
+
+With the <span class="ge">*named*</span> hyperlink <span class="s">`Sphinx Field Lists`_</span>, the raw text is much more
+readable.
+
+And this shows the alternative (less readable) hyperlink markup `Sphinx Field
+Lists
+<span class="nt">&lt;https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html&gt;</span>`__.
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Named hyperlink</p>
+<p>With the <em>named</em> hyperlink <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html">Sphinx Field Lists</a>, the raw text is much more
+readable.</p>
+<p>And this shows the alternative (less readable) hyperlink markup <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html">Sphinx Field
+Lists</a>.</p>
+</div>
+</section>
+<section id="smart-refs">
+<span id="rest-smart-ref"></span><h3><a class="toc-backref" href="#id23" role="doc-backlink">Smart refs</a><a class="headerlink" href="#smart-refs" title="Link to this heading">¶</a></h3>
+<p>With the power of <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html">sphinx.ext.extlinks</a> and <a class="reference external" href="https://www.sphinx-doc.org/en/stable/ext/intersphinx.html">intersphinx</a> referencing external
+content becomes smart.</p>
+<table class="docutils align-default" id="id5">
+<caption><span class="caption-number">Table 17 </span><span class="caption-text">smart refs with <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html">sphinx.ext.extlinks</a> and <a class="reference external" href="https://www.sphinx-doc.org/en/stable/ext/intersphinx.html">intersphinx</a></span><a class="headerlink" href="#id5" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 28.6%" />
+<col style="width: 21.4%" />
+<col style="width: 50.0%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>refer …</p></th>
+<th class="head"><p>rendered example</p></th>
+<th class="head"><p>markup</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-rfc" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">rfc</span></code></a></p></td>
+<td><p><span class="target" id="index-0"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc822.html"><strong>RFC 822</strong></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:rfc:`822`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-pep" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">pep</span></code></a></p></td>
+<td><p><span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-0008/"><strong>PEP 8</strong></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:pep:`8`</span></code></p></td>
+</tr>
+<tr class="row-even"><td colspan="3"><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html">sphinx.ext.extlinks</a></p></td>
+</tr>
+<tr class="row-odd"><td><p>project’s wiki article</p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/wiki/Offline-engines"> Offline-engines</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:wiki:`Offline-engines`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>to docs public URL</p></td>
+<td><p><a class="reference external" href="https://docs.searxng.org//dev/reST.html">docs: dev/reST.html</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:docs:`dev/reST.html`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>files &amp; folders origin</p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/dev/reST.rst">git://docs/dev/reST.rst</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:origin:`docs/dev/reST.rst`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>pull request</p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/pull/4">PR 4</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:pull:`4`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>patch</p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/commit/af2cae6">#af2cae6</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:patch:`af2cae6`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>PyPi package</p></td>
+<td><p><a class="reference external" href="https://pypi.org/project/httpx">PyPi: httpx</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:pypi:`httpx`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>manual page man</p></td>
+<td><p><a class="reference external" href="https://manpages.debian.org/jump?q=bash">bash</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:man:`bash`</span></code></p></td>
+</tr>
+<tr class="row-even"><td colspan="3"><p><a class="reference external" href="https://www.sphinx-doc.org/en/stable/ext/intersphinx.html">intersphinx</a></p></td>
+</tr>
+<tr class="row-odd"><td><p>external anchor</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/reference/expressions.html#and" title="(in Python v3.12)"><span>Boolean operations</span></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:ref:`python:and`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>external doc anchor</p></td>
+<td><p><a class="reference external" href="https://jinja.palletsprojects.com/en/3.1.x/templates/" title="(in Jinja v3.1.x)"><span>Template Designer Documentation</span></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:doc:`jinja:templates`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p>python code object</p></td>
+<td><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime.datetime" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:py:obj:`datetime.datetime`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p>flask code object</p></td>
+<td><p><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Flask" title="(in Flask v3.0.x)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">flask.Flask</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:py:obj:`flask.Flask`</span></code></p></td>
+</tr>
+</tbody>
+</table>
+<p>Intersphinx is configured in <a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/conf.py">git://docs/conf.py</a>:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">intersphinx_mapping</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s2">&quot;python&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;https://docs.python.org/3/&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
+ <span class="s2">&quot;flask&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;https://flask.palletsprojects.com/&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
+ <span class="s2">&quot;jinja&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;https://jinja.palletsprojects.com/&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
+ <span class="s2">&quot;linuxdoc&quot;</span> <span class="p">:</span> <span class="p">(</span><span class="s2">&quot;https://return42.github.io/linuxdoc/&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
+ <span class="s2">&quot;sphinx&quot;</span> <span class="p">:</span> <span class="p">(</span><span class="s2">&quot;https://www.sphinx-doc.org/en/master/&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<p>To list all anchors of the inventory (e.g. <code class="docutils literal notranslate"><span class="pre">python</span></code>) use:</p>
+<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>python<span class="w"> </span>-m<span class="w"> </span>sphinx.ext.intersphinx<span class="w"> </span>https://docs.python.org/3/objects.inv
+...
+$<span class="w"> </span>python<span class="w"> </span>-m<span class="w"> </span>sphinx.ext.intersphinx<span class="w"> </span>https://docs.searxng.org/objects.inv
+...
+</pre></div>
+</div>
+</section>
+</section>
+<section id="literal-blocks">
+<h2><a class="toc-backref" href="#id24" role="doc-backlink">Literal blocks</a><a class="headerlink" href="#literal-blocks" title="Link to this heading">¶</a></h2>
+<p>The simplest form of <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#literal-blocks">literal-blocks</a> is a indented block introduced by
+two colons (<code class="docutils literal notranslate"><span class="pre">::</span></code>). For highlighting use <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#highlight">highlight</a> or <a class="reference internal" href="#rest-code"><span class="std std-ref">code-block</span></a> directive. To include literals from external files use
+<a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-literalinclude" title="(in Sphinx v7.4.0)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">literalinclude</span></code></a> or <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kernel-include-directive.html#kernel-include-directive" title="(in LinuxDoc v20240509)"><span class="xref std std-ref">kernel-include</span></a>
+directive (latter one expands environment variables in the path name).</p>
+<section id="rest-literal">
+<span id="id3"></span><h3><a class="toc-backref" href="#id25" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">::</span></code></a><a class="headerlink" href="#rest-literal" title="Link to this heading">¶</a></h3>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="se">::</span>
+
+<span class="s"> Literal block</span>
+
+Lorem ipsum dolor<span class="se">::</span>
+
+<span class="s"> Literal block</span>
+
+Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+eirmod tempor invidunt ut labore ::
+
+ Literal block
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Literal block</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Literal</span> <span class="n">block</span>
+</pre></div>
+</div>
+<p>Lorem ipsum dolor:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Literal</span> <span class="n">block</span>
+</pre></div>
+</div>
+<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+eirmod tempor invidunt ut labore</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Literal</span> <span class="n">block</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="code-block">
+<span id="rest-code"></span><h3><a class="toc-backref" href="#id26" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">code-block</span></code></a><a class="headerlink" href="#code-block" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">Syntax highlighting</p>
+<p>is handled by <a class="reference external" href="https://pygments.org/languages/">pygments</a>.</p>
+</aside>
+<p>The <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-code-block" title="(in Sphinx v7.4.0)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">code-block</span></code></a> directive is a variant of the <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#code">code</a> directive
+with additional options. To learn more about code literals visit
+<a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#code-examples" title="(in Sphinx v7.4.0)"><span>Showing code examples</span></a>.</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>The URL <span class="s">``/stats``</span> handle is shown in <span class="na">:ref:</span><span class="nv">`stats-handle`</span>
+
+<span class="p">..</span> <span class="ow">code-block</span><span class="p">::</span> Python
+ <span class="nc">:caption:</span> python code block
+ <span class="nc">:name:</span> stats-handle
+
+ @app.route(&#39;/stats&#39;, methods=[&#39;GET&#39;])
+ def stats():
+ &quot;&quot;&quot;Render engine statistics page.&quot;&quot;&quot;
+ stats = get_engines_stats()
+ return render(
+ &#39;stats.html&#39;
+ , stats = stats )
+</pre></div>
+</div>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Code block</p>
+<p>The URL <code class="docutils literal notranslate"><span class="pre">/stats</span></code> handle is shown in <a class="reference internal" href="#stats-handle"><span class="std std-ref">python code block</span></a></p>
+<div class="literal-block-wrapper docutils container" id="stats-handle">
+<div class="code-block-caption"><span class="caption-number">Listing 1 </span><span class="caption-text">python code block</span><a class="headerlink" href="#stats-handle" title="Link to this code">¶</a></div>
+<div class="highlight-Python notranslate"><div class="highlight"><pre><span></span><span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s1">&#39;/stats&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;GET&#39;</span><span class="p">])</span>
+<span class="k">def</span> <span class="nf">stats</span><span class="p">():</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;Render engine statistics page.&quot;&quot;&quot;</span>
+ <span class="n">stats</span> <span class="o">=</span> <span class="n">get_engines_stats</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">render</span><span class="p">(</span>
+ <span class="s1">&#39;stats.html&#39;</span>
+ <span class="p">,</span> <span class="n">stats</span> <span class="o">=</span> <span class="n">stats</span> <span class="p">)</span>
+</pre></div>
+</div>
+</div>
+</div>
+</section>
+</section>
+<section id="unicode-substitution">
+<h2><a class="toc-backref" href="#id27" role="doc-backlink">Unicode substitution</a><a class="headerlink" href="#unicode-substitution" title="Link to this heading">¶</a></h2>
+<p>The <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#unicode-character-codes">unicode directive</a> converts Unicode
+character codes (numerical values) to characters. This directive can only be
+used within a substitution definition.</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">|copy|</span> <span class="ow">unicode</span><span class="p">::</span> 0xA9 .. copyright sign
+<span class="p">..</span> <span class="nt">|(TM)|</span> <span class="ow">unicode</span><span class="p">::</span> U+2122
+
+Trademark |(TM)| and copyright |copy| glyphs.
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Unicode</p>
+<p>Trademark ™ and copyright © glyphs.</p>
+</div>
+</section>
+<section id="roles">
+<span id="rest-roles"></span><h2><a class="toc-backref" href="#id28" role="doc-backlink">Roles</a><a class="headerlink" href="#roles" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html">Sphinx Roles</a></p></li>
+<li><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html" title="(in Sphinx v7.4.0)"><span>MOVED: Domains</span></a></p></li>
+</ul>
+</aside>
+<p>A <em>custom interpreted text role</em> (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#roles">ref</a>) is an inline piece of
+explicit markup. It signifies that that the enclosed text should be interpreted
+in a specific way.</p>
+<p>The general markup is one of:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="na">:rolename:</span><span class="nv">`ref-name`</span>
+<span class="na">:rolename:</span><span class="nv">`ref text &lt;ref-name&gt;`</span>
+</pre></div>
+</div>
+<table class="docutils align-default" id="id6">
+<caption><span class="caption-number">Table 18 </span><span class="caption-text">smart refs with <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html">sphinx.ext.extlinks</a> and <a class="reference external" href="https://www.sphinx-doc.org/en/stable/ext/intersphinx.html">intersphinx</a></span><a class="headerlink" href="#id6" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 28.6%" />
+<col style="width: 21.4%" />
+<col style="width: 50.0%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>role</p></th>
+<th class="head"><p>rendered example</p></th>
+<th class="head"><p>markup</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-guilabel" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">guilabel</span></code></a></p></td>
+<td><p><span class="guilabel"><span class="accelerator">C</span>ancel</span></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:guilabel:`&amp;Cancel`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-kbd" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">kbd</span></code></a></p></td>
+<td><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">x</kbd> <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">f</kbd></kbd></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:kbd:`C-x</span> <span class="pre">C-f`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-menuselection" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">menuselection</span></code></a></p></td>
+<td><p><span class="menuselection">Open ‣ File</span></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:menuselection:`Open</span> <span class="pre">--&gt;</span> <span class="pre">File`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/referencing.html#role-download" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">download</span></code></a></p></td>
+<td><p><a class="reference download internal" download="" href="../_downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst"><code class="xref download docutils literal notranslate"><span class="pre">this</span> <span class="pre">file</span></code></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:download:`this</span> <span class="pre">file</span> <span class="pre">&lt;reST.rst&gt;`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference internal" href="#math">math</a></p></td>
+<td><p><img class="math" src="../_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg" alt="a^2 + b^2 = c^2"/></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:math:`a^2</span> <span class="pre">+</span> <span class="pre">b^2</span> <span class="pre">=</span> <span class="pre">c^2`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/referencing.html#role-ref" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">ref</span></code></a></p></td>
+<td><p><a class="reference internal" href="#svg-image-example"><span class="std std-ref">Simple SVG image.</span></a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:ref:`svg</span> <span class="pre">image</span> <span class="pre">example`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-command" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">command</span></code></a></p></td>
+<td><p><strong class="command">ls -la</strong></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:command:`ls</span> <span class="pre">-la`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/roles.html#emphasis">emphasis</a></p></td>
+<td><p><em>italic</em></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:emphasis:`italic`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/roles.html#strong">strong</a></p></td>
+<td><p><strong>bold</strong></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:strong:`bold`</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/roles.html#literal">literal</a></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">foo()</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:literal:`foo()`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/roles.html#subscript">subscript</a></p></td>
+<td><p>H<sub>2</sub>O</p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">H\</span> <span class="pre">:sub:`2`\</span> <span class="pre">O</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/roles.html#superscript">superscript</a></p></td>
+<td><p>E = mc<sup>2</sup></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">E</span> <span class="pre">=</span> <span class="pre">mc\</span> <span class="pre">:sup:`2`</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/roles.html#title-reference">title-reference</a></p></td>
+<td><p><cite>Time</cite></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">:title:`Time`</span></code></p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="figures-images">
+<h2><a class="toc-backref" href="#id29" role="doc-backlink">Figures &amp; Images</a><a class="headerlink" href="#figures-images" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Image processing</p>
+<p>With the directives from <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kfigure.html#kfigure" title="(in LinuxDoc v20240509)"><span class="xref std std-ref">linuxdoc</span></a> the build process
+is flexible. To get best results in the generated output format, install
+<a class="reference external" href="https://www.imagemagick.org">ImageMagick</a> and <a class="reference external" href="https://graphviz.gitlab.io">Graphviz</a>.</p>
+</aside>
+<p>SearXNG’s sphinx setup includes: <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kfigure.html#kfigure" title="(in LinuxDoc v20240509)"><span>Scalable figure and image handling</span></a>. Scalable here means;
+scalable in sense of the build process. Normally in absence of a converter
+tool, the build process will break. From the authors POV it’s annoying to care
+about the build process when handling with images, especially since he has no
+access to the build process. With <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kfigure.html#kfigure" title="(in LinuxDoc v20240509)"><span>Scalable figure and image handling</span></a> the build process
+continues and scales output quality in dependence of installed image processors.</p>
+<p>If you want to add an image, you should use the <code class="docutils literal notranslate"><span class="pre">kernel-figure</span></code> (inheritance
+of <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#figure">figure</a>) and <code class="docutils literal notranslate"><span class="pre">kernel-image</span></code> (inheritance of <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#image">image</a>)
+directives. E.g. to insert a figure with a scalable image format use SVG
+(<a class="reference internal" href="#svg-image-example"><span class="std std-ref">Simple SVG image.</span></a>):</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_svg image example:</span>
+
+<span class="p">..</span> <span class="ow">kernel-figure</span><span class="p">::</span> svg_image.svg
+ <span class="nc">:alt:</span> SVG image example
+
+ Simple SVG image
+
+ To refer the figure, a caption block is needed: <span class="na">:ref:</span><span class="nv">`svg image example`</span>.
+</pre></div>
+</div>
+<figure class="align-default" id="id7">
+<img alt="SVG image example" src="../_images/svg_image.svg" /><figcaption>
+<p><span class="caption-number">Fig. 4 </span><span class="caption-text">Simple SVG image.</span><a class="headerlink" href="#id7" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+<p>To refer the figure, a caption block is needed: <a class="reference internal" href="#svg-image-example"><span class="std std-ref">Simple SVG image.</span></a>.</p>
+<section id="dot-files-aka-graphviz">
+<h3><a class="toc-backref" href="#id30" role="doc-backlink">DOT files (aka Graphviz)</a><a class="headerlink" href="#dot-files-aka-graphviz" title="Link to this heading">¶</a></h3>
+<p>With <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kfigure.html#kernel-figure" title="(in LinuxDoc v20240509)"><span>kernel-figure &amp; kernel-image</span></a> reST support for <strong>DOT</strong> formatted files is
+given.</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf">Graphviz’s dot</a></p></li>
+<li><p><a class="reference external" href="https://graphviz.gitlab.io/_pages/doc/info/lang.html">DOT</a></p></li>
+<li><p><a class="reference external" href="https://graphviz.gitlab.io">Graphviz</a></p></li>
+</ul>
+<p>A simple example is shown in <a class="reference internal" href="#dot-file-example"><span class="std std-ref">DOT’s hello world example</span></a>:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_dot file example:</span>
+
+<span class="p">..</span> <span class="ow">kernel-figure</span><span class="p">::</span> hello.dot
+ <span class="nc">:alt:</span> hello world
+
+ DOT&#39;s hello world example
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">hello.dot</p>
+<figure class="align-default" id="id8">
+<img alt="hello world" src="../_images/hello.svg" /><figcaption>
+<p><span class="caption-number">Fig. 5 </span><span class="caption-text">DOT’s hello world example</span><a class="headerlink" href="#id8" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+</div>
+</section>
+<section id="kernel-render-dot">
+<h3><a class="toc-backref" href="#id31" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">kernel-render</span></code> DOT</a><a class="headerlink" href="#kernel-render-dot" title="Link to this heading">¶</a></h3>
+<p>Embed <em>render</em> markups (or languages) like Graphviz’s <strong>DOT</strong> is provided by the
+<a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kfigure.html#kernel-render" title="(in LinuxDoc v20240509)"><span>kernel-render</span></a> directive. A simple example of embedded <a class="reference external" href="https://graphviz.gitlab.io/_pages/doc/info/lang.html">DOT</a> is
+shown in figure <a class="reference internal" href="#dot-render-example"><span class="std std-ref">Embedded DOT (Graphviz) code</span></a>:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_dot render example:</span>
+
+<span class="p">..</span> <span class="ow">kernel-render</span><span class="p">::</span> DOT
+ <span class="nc">:alt:</span> digraph
+ <span class="nc">:caption:</span> Embedded DOT (Graphviz) code
+
+ digraph foo {
+ &quot;bar&quot; -&gt; &quot;baz&quot;;
+ }
+
+Attribute <span class="s">``caption``</span> is needed, if you want to refer the figure: :ref:`dot
+render example`.
+</pre></div>
+</div>
+<p>Please note <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/kfigure.html#kfigure-build-tools" title="(in LinuxDoc v20240509)"><span class="xref std std-ref">build tools</span></a>. If <a class="reference external" href="https://graphviz.gitlab.io">Graphviz</a> is
+installed, you will see an vector image. If not, the raw markup is inserted as
+<em>literal-block</em>.</p>
+<div class="rst-example admonition">
+<p class="admonition-title">kernel-render DOT</p>
+<figure class="align-default" id="id9">
+<span id="dot-render-example"></span><img alt="digraph" src="../_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg" /><figcaption>
+<p><span class="caption-number">Fig. 6 </span><span class="caption-text">Embedded DOT (Graphviz) code</span><a class="headerlink" href="#id9" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+<p>Attribute <code class="docutils literal notranslate"><span class="pre">caption</span></code> is needed, if you want to refer the figure: <a class="reference internal" href="#dot-render-example"><span class="std std-ref">Embedded DOT (Graphviz) code</span></a>.</p>
+</div>
+</section>
+<section id="kernel-render-svg">
+<h3><a class="toc-backref" href="#id32" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">kernel-render</span></code> SVG</a><a class="headerlink" href="#kernel-render-svg" title="Link to this heading">¶</a></h3>
+<p>A simple example of embedded <a class="reference external" href="https://www.w3.org/TR/SVG11/expanded-toc.html">SVG</a> is shown in figure <a class="reference internal" href="#svg-render-example"><span class="std std-ref">Embedded SVG markup</span></a>:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_svg render example:</span>
+
+<span class="p">..</span> <span class="ow">kernel-render</span><span class="p">::</span> SVG
+ <span class="nc">:caption:</span> Embedded <span class="gs">**SVG**</span> markup
+ <span class="nc">:alt:</span> so-nw-arrow
+</pre></div>
+</div>
+<blockquote>
+<div><div class="highlight-xml notranslate"><div class="highlight"><pre><span></span><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
+<span class="nt">&lt;svg</span><span class="w"> </span><span class="na">xmlns=</span><span class="s">&quot;http://www.w3.org/2000/svg&quot;</span><span class="w"> </span><span class="na">version=</span><span class="s">&quot;1.1&quot;</span>
+<span class="w"> </span><span class="na">baseProfile=</span><span class="s">&quot;full&quot;</span><span class="w"> </span><span class="na">width=</span><span class="s">&quot;70px&quot;</span><span class="w"> </span><span class="na">height=</span><span class="s">&quot;40px&quot;</span>
+<span class="w"> </span><span class="na">viewBox=</span><span class="s">&quot;0 0 700 400&quot;</span>
+<span class="w"> </span><span class="nt">&gt;</span>
+<span class="w"> </span><span class="nt">&lt;line</span><span class="w"> </span><span class="na">x1=</span><span class="s">&quot;180&quot;</span><span class="w"> </span><span class="na">y1=</span><span class="s">&quot;370&quot;</span>
+<span class="w"> </span><span class="na">x2=</span><span class="s">&quot;500&quot;</span><span class="w"> </span><span class="na">y2=</span><span class="s">&quot;50&quot;</span>
+<span class="w"> </span><span class="na">stroke=</span><span class="s">&quot;black&quot;</span><span class="w"> </span><span class="na">stroke-width=</span><span class="s">&quot;15px&quot;</span>
+<span class="w"> </span><span class="nt">/&gt;</span>
+<span class="w"> </span><span class="nt">&lt;polygon</span><span class="w"> </span><span class="na">points=</span><span class="s">&quot;585 0 525 25 585 50&quot;</span>
+<span class="w"> </span><span class="na">transform=</span><span class="s">&quot;rotate(135 525 25)&quot;</span>
+<span class="w"> </span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/svg&gt;</span>
+</pre></div>
+</div>
+</div></blockquote>
+<div class="rst-example admonition">
+<p class="admonition-title">kernel-render SVG</p>
+<figure class="align-default" id="id10">
+<span id="svg-render-example"></span><img alt="so-nw-arrow" src="../_images/SVG-1fb7029fa2cc454a267bae271cccb2c591387416.svg" /><figcaption>
+<p><span class="caption-number">Fig. 7 </span><span class="caption-text">Embedded <strong>SVG</strong> markup</span><a class="headerlink" href="#id10" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+</div>
+</section>
+</section>
+<section id="list-markups">
+<span id="rest-lists"></span><h2><a class="toc-backref" href="#id33" role="doc-backlink">List markups</a><a class="headerlink" href="#list-markups" title="Link to this heading">¶</a></h2>
+<section id="bullet-list">
+<h3><a class="toc-backref" href="#id34" role="doc-backlink">Bullet list</a><a class="headerlink" href="#bullet-list" title="Link to this heading">¶</a></h3>
+<p>List markup (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#bullet-lists">ref</a>) is simple:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="m">-</span> This is a bulleted list.
+
+ <span class="m">1.</span> Nested lists are possible, but be aware that they must be separated from
+ the parent list items by blank line
+ <span class="m">2.</span> Second item of nested list
+
+<span class="m">-</span> It has two items, the second
+ item uses two lines.
+
+<span class="m">#.</span> This is a numbered list.
+<span class="m">#.</span> It has two items too.
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">bullet list</p>
+<ul class="simple">
+<li><p>This is a bulleted list.</p>
+<ol class="arabic simple">
+<li><p>Nested lists are possible, but be aware that they must be separated from
+the parent list items by blank line</p></li>
+<li><p>Second item of nested list</p></li>
+</ol>
+</li>
+<li><p>It has two items, the second
+item uses two lines.</p></li>
+</ul>
+<ol class="arabic simple">
+<li><p>This is a numbered list.</p></li>
+<li><p>It has two items too.</p></li>
+</ol>
+</div>
+</section>
+<section id="horizontal-list">
+<h3><a class="toc-backref" href="#id35" role="doc-backlink">Horizontal list</a><a class="headerlink" href="#horizontal-list" title="Link to this heading">¶</a></h3>
+<p>The <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-hlist" title="(in Sphinx v7.4.0)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">..</span> <span class="pre">hlist::</span></code></a> transforms a bullet list into a more compact
+list.</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">hlist</span><span class="p">::</span>
+
+ <span class="m">-</span> first list item
+ <span class="m">-</span> second list item
+ <span class="m">-</span> third list item
+<span class="c"> ...</span>
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">hlist</p>
+<table class="hlist"><tr><td><ul class="simple">
+<li><p>first list item</p></li>
+<li><p>second list item</p></li>
+<li><p>third list item</p></li>
+<li><p>next list item</p></li>
+</ul>
+</td><td><ul class="simple">
+<li><p>next list item xxxx</p></li>
+<li><p>next list item yyyy</p></li>
+<li><p>next list item zzzz</p></li>
+</ul>
+</td></tr></table>
+</div>
+</section>
+<section id="definition-list">
+<h3><a class="toc-backref" href="#id36" role="doc-backlink">Definition list</a><a class="headerlink" href="#definition-list" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">Note ..</p>
+<ul class="simple">
+<li><p>the term cannot have more than one line of text</p></li>
+<li><p>there is <strong>no blank line between term and definition block</strong> // this
+distinguishes definition lists (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#definition-lists">ref</a>) from block
+quotes (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#block-quotes">ref</a>).</p></li>
+</ul>
+</aside>
+<p>Each definition list (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#definition-lists">ref</a>) item contains a term,
+optional classifiers and a definition. A term is a simple one-line word or
+phrase. Optional classifiers may follow the term on the same line, each after
+an inline ‘ : ‘ (<strong>space, colon, space</strong>). A definition is a block indented
+relative to the term, and may contain multiple paragraphs and other body
+elements. There may be no blank line between a term line and a definition block
+(<em>this distinguishes definition lists from block quotes</em>). Blank lines are
+required before the first and after the last definition list item, but are
+optional in-between.</p>
+<p>Definition lists are created as follows:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>term 1 (up to a line of text)
+ Definition 1.
+
+See the typo : this line is not a term!
+
+ And this is not term&#39;s definition. <span class="gs">**There is a blank line**</span> in between
+ the line above and this paragraph. That&#39;s why this paragraph is taken as
+ <span class="gs">**block quote**</span> (<span class="na">:duref:</span><span class="nv">`ref &lt;block-quotes&gt;`</span>) and not as term&#39;s definition!
+
+term 2
+ Definition 2, paragraph 1.
+
+ Definition 2, paragraph 2.
+
+term 3 : classifier
+ Definition 3.
+
+term 4 : classifier one : classifier two
+ Definition 4.
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">definition list</p>
+<dl class="simple">
+<dt>term 1 (up to a line of text)</dt><dd><p>Definition 1.</p>
+</dd>
+</dl>
+<p>See the typo : this line is not a term!</p>
+<blockquote>
+<div><p>And this is not term’s definition. <strong>There is a blank line</strong> in between
+the line above and this paragraph. That’s why this paragraph is taken as
+<strong>block quote</strong> (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#block-quotes">ref</a>) and not as term’s definition!</p>
+</div></blockquote>
+<dl>
+<dt>term 2</dt><dd><p>Definition 2, paragraph 1.</p>
+<p>Definition 2, paragraph 2.</p>
+</dd>
+<dt>term 3<span class="classifier">classifier</span></dt><dd><p>Definition 3.</p>
+</dd>
+</dl>
+<p>term 4 : classifier one : classifier two</p>
+</div>
+</section>
+<section id="quoted-paragraphs">
+<h3><a class="toc-backref" href="#id37" role="doc-backlink">Quoted paragraphs</a><a class="headerlink" href="#quoted-paragraphs" title="Link to this heading">¶</a></h3>
+<p>Quoted paragraphs (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#block-quotes">ref</a>) are created by just indenting
+them more than the surrounding paragraphs. Line blocks (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#line-blocks">ref</a>) are a way of preserving line breaks:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>normal paragraph ...
+lorem ipsum.
+
+ Quoted paragraph ...
+ lorem ipsum.
+
+<span class="o">|</span> These lines are
+<span class="o">|</span> broken exactly like in
+<span class="o">|</span> the source file.
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Quoted paragraph and line block</p>
+<p>normal paragraph …
+lorem ipsum.</p>
+<blockquote>
+<div><p>Quoted paragraph …
+lorem ipsum.</p>
+</div></blockquote>
+<div class="line-block">
+<div class="line">These lines are</div>
+<div class="line">broken exactly like in</div>
+<div class="line">the source file.</div>
+</div>
+</div>
+</section>
+<section id="field-lists">
+<span id="rest-field-list"></span><h3><a class="toc-backref" href="#id38" role="doc-backlink">Field Lists</a><a class="headerlink" href="#field-lists" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">bibliographic fields</p>
+<p>First lines fields are bibliographic fields, see <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html">Sphinx Field Lists</a>.</p>
+</aside>
+<p>Field lists are used as part of an extension syntax, such as options for
+directives, or database-like records meant for further processing. Field lists
+are mappings from field names to field bodies. They marked up like this:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="nc">:fieldname:</span> Field content
+<span class="nc">:foo:</span> first paragraph in field foo
+
+ second paragraph in field foo
+
+<span class="nc">:bar:</span> Field content
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Field List</p>
+<dl class="field-list">
+<dt class="field-odd">fieldname<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Field content</p>
+</dd>
+<dt class="field-even">foo<span class="colon">:</span></dt>
+<dd class="field-even"><p>first paragraph in field foo</p>
+<p>second paragraph in field foo</p>
+</dd>
+<dt class="field-odd">bar<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Field content</p>
+</dd>
+</dl>
+</div>
+<p>They are commonly used in Python documentation:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">my_function</span><span class="p">(</span><span class="n">my_arg</span><span class="p">,</span> <span class="n">my_other_arg</span><span class="p">):</span>
+<span class="w"> </span><span class="sd">&quot;&quot;&quot;A function just for me.</span>
+
+<span class="sd"> :param my_arg: The first of my arguments.</span>
+<span class="sd"> :param my_other_arg: The second of my arguments.</span>
+
+<span class="sd"> :returns: A message (just for me, of course).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+</pre></div>
+</div>
+</section>
+<section id="further-list-blocks">
+<h3><a class="toc-backref" href="#id39" role="doc-backlink">Further list blocks</a><a class="headerlink" href="#further-list-blocks" title="Link to this heading">¶</a></h3>
+<ul class="simple">
+<li><p>field lists (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#field-lists">ref</a>, with caveats noted in
+<a class="reference internal" href="#rest-field-list"><span class="std std-ref">Field Lists</span></a>)</p></li>
+<li><p>option lists (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#option-lists">ref</a>)</p></li>
+<li><p>quoted literal blocks (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#quoted-literal-blocks">ref</a>)</p></li>
+<li><p>doctest blocks (<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#doctest-blocks">ref</a>)</p></li>
+</ul>
+</section>
+</section>
+<section id="admonitions">
+<h2><a class="toc-backref" href="#id40" role="doc-backlink">Admonitions</a><a class="headerlink" href="#admonitions" title="Link to this heading">¶</a></h2>
+<section id="sidebar">
+<h3><a class="toc-backref" href="#id41" role="doc-backlink">Sidebar</a><a class="headerlink" href="#sidebar" title="Link to this heading">¶</a></h3>
+<p>Sidebar is an eye catcher, often used for admonitions pointing further stuff or
+site effects. Here is the source of the sidebar <a class="reference internal" href="#rest-primer"><span class="std std-ref">on top of this page</span></a>.</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">sidebar</span><span class="p">::</span> KISS_ and readability_
+
+ Instead of defining more and more roles, we at SearXNG encourage our
+ contributors to follow principles like KISS_ and readability_.
+</pre></div>
+</div>
+</section>
+<section id="generic-admonition">
+<h3><a class="toc-backref" href="#id42" role="doc-backlink">Generic admonition</a><a class="headerlink" href="#generic-admonition" title="Link to this heading">¶</a></h3>
+<p>The generic <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#admonitions">admonition</a> needs a title:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">admonition</span><span class="p">::</span> generic admonition title
+
+ lorem ipsum ..
+</pre></div>
+</div>
+<div class="admonition-generic-admonition-title admonition">
+<p class="admonition-title">generic admonition title</p>
+<p>lorem ipsum ..</p>
+</div>
+</section>
+<section id="specific-admonitions">
+<h3><a class="toc-backref" href="#id43" role="doc-backlink">Specific admonitions</a><a class="headerlink" href="#specific-admonitions" title="Link to this heading">¶</a></h3>
+<p>Specific admonitions: <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#hint">hint</a>, <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#note">note</a>, <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#tip">tip</a> <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#attention">attention</a>,
+<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#caution">caution</a>, <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#danger">danger</a>, <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#error">error</a>, , <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#important">important</a>, and
+<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#warning">warning</a> .</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">hint</span><span class="p">::</span>
+
+ lorem ipsum ..
+
+<span class="p">..</span> <span class="ow">note</span><span class="p">::</span>
+
+ lorem ipsum ..
+
+<span class="p">..</span> <span class="ow">warning</span><span class="p">::</span>
+
+ lorem ipsum ..
+</pre></div>
+</div>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition tip">
+<p class="admonition-title">Tip</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition attention">
+<p class="admonition-title">Attention</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition caution">
+<p class="admonition-title">Caution</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition danger">
+<p class="admonition-title">Danger</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition important">
+<p class="admonition-title">Important</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition error">
+<p class="admonition-title">Error</p>
+<p>lorem ipsum ..</p>
+</div>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>lorem ipsum ..</p>
+</div>
+</section>
+</section>
+<section id="tables">
+<h2><a class="toc-backref" href="#id44" role="doc-backlink">Tables</a><a class="headerlink" href="#tables" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Nested tables</p>
+<p>Nested tables are ugly! Not all builder support nested tables, don’t use
+them!</p>
+</aside>
+<p>ASCII-art tables like <a class="reference internal" href="#rest-simple-table"><span class="std std-ref">Simple tables</span></a> and <a class="reference internal" href="#rest-grid-table"><span class="std std-ref">Grid tables</span></a> might
+be comfortable for readers of the text-files, but they have huge disadvantages
+in the creation and modifying. First, they are hard to edit. Think about
+adding a row or a column to a ASCII-art table or adding a paragraph in a cell,
+it is a nightmare on big tables.</p>
+<aside class="sidebar">
+<p class="sidebar-title">List tables</p>
+<p>For meaningful patch and diff use <a class="reference internal" href="#rest-flat-table"><span class="std std-ref">flat-table</span></a>.</p>
+</aside>
+<p>Second the diff of modifying ASCII-art tables is not meaningful, e.g. widening a
+cell generates a diff in which also changes are included, which are only
+ascribable to the ASCII-art. Anyway, if you prefer ASCII-art for any reason,
+here are some helpers:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://www.emacswiki.org/emacs/TableMode">Emacs Table Mode</a></p></li>
+<li><p><a class="reference external" href="https://www.tablesgenerator.com/text_tables">Online Tables Generator</a></p></li>
+</ul>
+<section id="simple-tables">
+<span id="rest-simple-table"></span><h3><a class="toc-backref" href="#id45" role="doc-backlink">Simple tables</a><a class="headerlink" href="#simple-tables" title="Link to this heading">¶</a></h3>
+<p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#simple-tables">Simple tables</a> allow <em>colspan</em> but not <em>rowspan</em>. If
+your table need some metadata (e.g. a title) you need to add the <code class="docutils literal notranslate"><span class="pre">..</span> <span class="pre">table::</span>
+<span class="pre">directive</span></code> <a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#table">(ref)</a> in front and place the table in its body:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">table</span><span class="p">::</span> foo gate truth table
+ <span class="nc">:widths:</span> grid
+ <span class="nc">:align:</span> left
+
+ ====== ====== ======
+ Inputs Output
+ ------------- ------
+ A B A or B
+ ====== ====== ======
+ False
+ --------------------
+ True
+ --------------------
+ True False True
+ (foo)
+ ------ ------ ------
+ False True
+ (foo)
+ ====== =============
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Simple ASCII table</p>
+<table class="docutils align-left" id="id11">
+<caption><span class="caption-number">Table 19 </span><span class="caption-text">foo gate truth table</span><a class="headerlink" href="#id11" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 33.3%" />
+<col style="width: 33.3%" />
+<col style="width: 33.3%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head" colspan="2"><p>Inputs</p></th>
+<th class="head"><p>Output</p></th>
+</tr>
+<tr class="row-even"><th class="head"><p>A</p></th>
+<th class="head"><p>B</p></th>
+<th class="head"><p>A or B</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><td colspan="3"><p>False</p></td>
+</tr>
+<tr class="row-even"><td colspan="3"><p>True</p></td>
+</tr>
+<tr class="row-odd"><td><p>True</p></td>
+<td><p>False
+(foo)</p></td>
+<td><p>True</p></td>
+</tr>
+<tr class="row-even"><td><p>False</p></td>
+<td colspan="2"><p>True
+(foo)</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+<section id="grid-tables">
+<span id="rest-grid-table"></span><h3><a class="toc-backref" href="#id46" role="doc-backlink">Grid tables</a><a class="headerlink" href="#grid-tables" title="Link to this heading">¶</a></h3>
+<p><a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#grid-tables">Grid tables</a> allow colspan <em>colspan</em> and <em>rowspan</em>:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">table</span><span class="p">::</span> grid table example
+ <span class="nc">:widths:</span> 1 1 5
+
+ +------------+------------+-----------+
+ <span class="o">|</span> Header 1 | Header 2 | Header 3 |
+ +============+============+===========+
+ <span class="o">|</span> body row 1 | column 2 | column 3 |
+ +------------+------------+-----------+
+ <span class="o">|</span> body row 2 | Cells may span columns.|
+ +------------+------------+-----------+
+ <span class="o">|</span> body row 3 | Cells may | - Cells |
+ +------------+ span rows. | - contain |
+ <span class="o">|</span> body row 4 | | - blocks. |
+ +------------+------------+-----------+
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">ASCII grid table</p>
+<table class="docutils align-default" id="id12">
+<caption><span class="caption-number">Table 20 </span><span class="caption-text">grid table example</span><a class="headerlink" href="#id12" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 14.3%" />
+<col style="width: 14.3%" />
+<col style="width: 71.4%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>Header 1</p></th>
+<th class="head"><p>Header 2</p></th>
+<th class="head"><p>Header 3</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>body row 1</p></td>
+<td><p>column 2</p></td>
+<td><p>column 3</p></td>
+</tr>
+<tr class="row-odd"><td><p>body row 2</p></td>
+<td colspan="2"><p>Cells may span columns.</p></td>
+</tr>
+<tr class="row-even"><td><p>body row 3</p></td>
+<td rowspan="2"><p>Cells may
+span rows.</p></td>
+<td rowspan="2"><ul class="simple">
+<li><p>Cells</p></li>
+<li><p>contain</p></li>
+<li><p>blocks.</p></li>
+</ul>
+</td>
+</tr>
+<tr class="row-odd"><td><p>body row 4</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+<section id="flat-table">
+<span id="rest-flat-table"></span><h3><a class="toc-backref" href="#id47" role="doc-backlink">flat-table</a><a class="headerlink" href="#flat-table" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">flat-table</span></code> is a further developed variant of the <a class="reference external" href="https://return42.github.io/linuxdoc/linuxdoc-howto/table-markup.html#list-table-directives" title="(in LinuxDoc v20240509)"><span class="xref std std-ref">list tables</span></a>. It is a double-stage list similar to the
+<a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/directives.html#list-table">list-table</a> with some additional features:</p>
+<dl class="simple">
+<dt>column-span: <code class="docutils literal notranslate"><span class="pre">cspan</span></code></dt><dd><p>with the role <code class="docutils literal notranslate"><span class="pre">cspan</span></code> a cell can be extended through additional columns</p>
+</dd>
+<dt>row-span: <code class="docutils literal notranslate"><span class="pre">rspan</span></code></dt><dd><p>with the role <code class="docutils literal notranslate"><span class="pre">rspan</span></code> a cell can be extended through additional rows</p>
+</dd>
+<dt>auto-span:</dt><dd><p>spans rightmost cell of a table row over the missing cells on the right side
+of that table-row. With Option <code class="docutils literal notranslate"><span class="pre">:fill-cells:</span></code> this behavior can changed
+from <em>auto span</em> to <em>auto fill</em>, which automatically inserts (empty) cells
+instead of spanning the last cell.</p>
+</dd>
+<dt>options:</dt><dd><dl class="field-list simple">
+<dt class="field-odd">header-rows<span class="colon">:</span></dt>
+<dd class="field-odd"><p>[int] count of header rows</p>
+</dd>
+<dt class="field-even">stub-columns<span class="colon">:</span></dt>
+<dd class="field-even"><p>[int] count of stub columns</p>
+</dd>
+<dt class="field-odd">widths<span class="colon">:</span></dt>
+<dd class="field-odd"><p>[[int] [int] … ] widths of columns</p>
+</dd>
+<dt class="field-even">fill-cells<span class="colon">:</span></dt>
+<dd class="field-even"><p>instead of auto-span missing cells, insert missing cells</p>
+</dd>
+</dl>
+</dd>
+<dt>roles:</dt><dd><dl class="field-list simple">
+<dt class="field-odd">cspan<span class="colon">:</span></dt>
+<dd class="field-odd"><p>[int] additional columns (<em>morecols</em>)</p>
+</dd>
+<dt class="field-even">rspan<span class="colon">:</span></dt>
+<dd class="field-even"><p>[int] additional rows (<em>morerows</em>)</p>
+</dd>
+</dl>
+</dd>
+</dl>
+<p>The example below shows how to use this markup. The first level of the staged
+list is the <em>table-row</em>. In the <em>table-row</em> there is only one markup allowed,
+the list of the cells in this <em>table-row</em>. Exception are <em>comments</em> ( <code class="docutils literal notranslate"><span class="pre">..</span></code> )
+and <em>targets</em> (e.g. a ref to <a class="reference internal" href="#row-body-2"><span class="std std-ref">row 2 of table’s body</span></a>).</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">flat-table</span><span class="p">::</span> <span class="s">``flat-table``</span> example
+ <span class="nc">:header-rows:</span> 2
+ <span class="nc">:stub-columns:</span> 1
+ <span class="nc">:widths:</span> 1 1 1 1 2
+
+ <span class="m">*</span> - <span class="na">:rspan:</span><span class="nv">`1`</span> head / stub
+ <span class="m">-</span> <span class="na">:cspan:</span><span class="nv">`3`</span> head 1.1-4
+
+ <span class="m">*</span> - head 2.1
+ <span class="m">-</span> head 2.2
+ <span class="m">-</span> head 2.3
+ <span class="m">-</span> head 2.4
+
+ <span class="m">*</span> .. row body 1 / this is a comment
+
+ <span class="m">-</span> row 1
+ <span class="m">-</span> <span class="na">:rspan:</span><span class="nv">`2`</span> cell 1-3.1
+ <span class="m">-</span> cell 1.2
+ <span class="m">-</span> cell 1.3
+ <span class="m">-</span> cell 1.4
+
+ <span class="m">*</span> .. Comments and targets are allowed on <span class="ge">*table-row*</span> stage.
+<span class="p"> ..</span> <span class="nt">_`row body 2`:</span>
+
+ <span class="m">-</span> row 2
+ <span class="m">-</span> cell 2.2
+ <span class="m">-</span> <span class="na">:rspan:</span><span class="nv">`1`</span> <span class="na">:cspan:</span><span class="nv">`1`</span>
+ cell 2.3 with a span over
+
+ <span class="m">*</span> col 3-4 &amp;
+ <span class="m">*</span> row 2-3
+
+ <span class="m">*</span> - row 3
+ <span class="m">-</span> cell 3.2
+
+ <span class="m">*</span> - row 4
+ <span class="m">-</span> cell 4.1
+ <span class="m">-</span> cell 4.2
+ <span class="m">-</span> cell 4.3
+ <span class="m">-</span> cell 4.4
+
+ <span class="m">*</span> - row 5
+ <span class="m">-</span> cell 5.1 with automatic span to right end
+
+ <span class="m">*</span> - row 6
+ <span class="m">-</span> cell 6.1
+ <span class="m">-</span> ..
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">List table</p>
+<table class="docutils align-default" id="id13">
+<caption><span class="caption-number">Table 21 </span><span class="caption-text"><code class="docutils literal notranslate"><span class="pre">flat-table</span></code> example</span><a class="headerlink" href="#id13" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 16.7%" />
+<col style="width: 16.7%" />
+<col style="width: 16.7%" />
+<col style="width: 16.7%" />
+<col style="width: 33.3%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" rowspan="2"><p> head / stub</p></th>
+<th class="head" colspan="4"><p> head 1.1-4</p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>head 2.1</p></th>
+<th class="head"><p>head 2.2</p></th>
+<th class="head"><p>head 2.3</p></th>
+<th class="head"><p>head 2.4</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p>row 1</p></th>
+<td rowspan="3"><p> cell 1-3.1</p></td>
+<td><p>cell 1.2</p></td>
+<td><p>cell 1.3</p></td>
+<td><p>cell 1.4</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p>row 2</p>
+</th>
+<td><p>cell 2.2</p>
+</td>
+<td colspan="2" rowspan="2"><p id="row-body-2">
+cell 2.3 with a span over</p>
+<ul class="simple">
+<li><p>col 3-4 &amp;</p></li>
+<li><p>row 2-3</p></li>
+</ul>
+</td>
+</tr>
+<tr class="row-odd"><th class="stub"><p>row 3</p></th>
+<td><p>cell 3.2</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p>row 4</p></th>
+<td><p>cell 4.1</p></td>
+<td><p>cell 4.2</p></td>
+<td><p>cell 4.3</p></td>
+<td><p>cell 4.4</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p>row 5</p></th>
+<td colspan="4"><p>cell 5.1 with automatic span to right end</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p>row 6</p></th>
+<td><p>cell 6.1</p></td>
+<td colspan="3"></td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+<section id="csv-table">
+<h3><a class="toc-backref" href="#id48" role="doc-backlink">CSV table</a><a class="headerlink" href="#csv-table" title="Link to this heading">¶</a></h3>
+<p>CSV table might be the choice if you want to include CSV-data from a outstanding
+(build) process into your documentation.</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">csv-table</span><span class="p">::</span> CSV table example
+ <span class="nc">:header:</span> .. , Column 1, Column 2
+ <span class="nc">:widths:</span> 2 5 5
+ <span class="nc">:stub-columns:</span> 1
+ <span class="nc">:file:</span> csv_table.txt
+</pre></div>
+</div>
+<p>Content of file <code class="docutils literal notranslate"><span class="pre">csv_table.txt</span></code>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">stub</span> <span class="n">col</span> <span class="n">row</span> <span class="mi">1</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="s2">&quot;loremLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</span>
+<span class="n">eirmod</span> <span class="n">tempor</span> <span class="n">invidunt</span> <span class="n">ut</span> <span class="n">labore</span> <span class="n">et</span> <span class="n">dolore</span> <span class="n">magna</span> <span class="n">aliquyam</span> <span class="n">erat</span><span class="p">,</span> <span class="n">sed</span> <span class="n">diam</span>
+<span class="n">voluptua</span><span class="o">.</span><span class="s2">&quot;</span>
+<span class="n">stub</span> <span class="n">col</span> <span class="n">row</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;At vero eos et accusam et justo duo dolores et ea rebum. Stet clita</span>
+<span class="n">kasd</span> <span class="n">gubergren</span><span class="p">,</span> <span class="n">no</span> <span class="n">sea</span> <span class="n">takimata</span> <span class="n">sanctus</span> <span class="n">est</span> <span class="n">Lorem</span> <span class="n">ipsum</span> <span class="n">dolor</span> <span class="n">sit</span> <span class="n">amet</span><span class="o">.</span><span class="s2">&quot;, column</span>
+<span class="n">stub</span> <span class="n">col</span> <span class="n">row</span> <span class="mi">1</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">column</span>
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">CSV table</p>
+<table class="docutils align-default" id="id14">
+<caption><span class="caption-number">Table 22 </span><span class="caption-text">CSV table example</span><a class="headerlink" href="#id14" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 23.1%" />
+<col style="width: 38.5%" />
+<col style="width: 38.5%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub"></th>
+<th class="head"><p>Column 1</p></th>
+<th class="head"><p>Column 2</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><th class="stub"><p>stub col row 1</p></th>
+<td><p>column</p></td>
+<td><p>loremLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+voluptua.</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p>stub col row 1</p></th>
+<td><p>At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
+kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p></td>
+<td><p>column</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p>stub col row 1</p></th>
+<td><p>column</p></td>
+<td><p>column</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</section>
+</section>
+<section id="templating">
+<h2><a class="toc-backref" href="#id49" role="doc-backlink">Templating</a><a class="headerlink" href="#templating" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Build environment</p>
+<p>All <em>generic-doc</em> tasks are running in the <a class="reference internal" href="makefile.html#make-install"><span class="std std-ref">Python environment (make install)</span></a>.</p>
+</aside>
+<p>Templating is suitable for documentation which is created generic at the build
+time. The <a class="reference external" href="https://github.com/tardyp/sphinx-jinja">sphinx-jinja</a> extension evaluates <a class="reference external" href="https://jinja.palletsprojects.com/">jinja</a> templates in the <a class="reference internal" href="makefile.html#make-install"><span class="std std-ref">Python environment (make install)</span></a> (with SearXNG modules installed). We use this e.g. to build chapter:
+<a class="reference internal" href="../user/configured_engines.html#configured-engines"><span class="std std-ref">Configured Engines</span></a>. Below the jinja directive from the
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/admin/engines.rst">git://docs/admin/engines.rst</a> is shown:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="gh">==================</span>
+<span class="gh">Configured Engines</span>
+<span class="gh">==================</span>
+
+<span class="p">..</span> <span class="ow">sidebar</span><span class="p">::</span> Further reading ..
+
+ <span class="m">-</span> <span class="na">:ref:</span><span class="nv">`settings categories_as_tabs`</span>
+ <span class="m">-</span> <span class="na">:ref:</span><span class="nv">`engines-dev`</span>
+ <span class="m">-</span> <span class="na">:ref:</span><span class="nv">`settings engine`</span>
+ <span class="m">-</span> <span class="na">:ref:</span><span class="nv">`general engine configuration`</span>
+
+<span class="p">..</span> <span class="ow">jinja</span><span class="p">::</span> searx
+
+ SearXNG supports {{engines | length}} search engines of which
+ {{enabled_engine_count}} are enabled by default.
+
+ Engines can be assigned to multiple <span class="na">:ref:</span><span class="nv">`categories &lt;engine categories&gt;`</span>.
+ The UI displays the tabs that are configured in :ref:`categories_as_tabs
+ &lt;settings categories_as_tabs&gt;`. In addition to these UI categories (also
+ called <span class="ge">*tabs*</span>), engines can be queried by their name or the categories they
+ belong to, by using a <span class="na">:ref:</span><span class="nv">`\!bing syntax &lt;search-syntax&gt;`</span>.
+
+<span class="p">..</span> <span class="ow">contents</span><span class="p">::</span>
+ <span class="nc">:depth:</span> 2
+ <span class="nc">:local:</span>
+ <span class="nc">:backlinks:</span> entry
+
+<span class="p">..</span> <span class="ow">jinja</span><span class="p">::</span> searx
+
+ {% for category, engines in categories_as_tabs.items() %}
+
+ tab <span class="s">``!{{category.replace(&#39; &#39;, &#39;_&#39;)}}``</span>
+ ---------------------------------------
+
+ {% for group, group_bang, engines in engines | group_engines_in_tab %}
+
+ {% if loop.length &gt; 1 %}
+ {% if group_bang %}group <span class="s">``{{group_bang}}``{% else %}{{group}}{% endif %}</span>
+<span class="s"> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span>
+<span class="s"> {% endif %}</span>
+
+<span class="s"> .. flat-table::</span>
+<span class="s"> :header-rows: 2</span>
+<span class="s"> :stub-columns: 1</span>
+<span class="s"> :widths: 10 1 10 1 1 1 1 1 1 1</span>
+
+<span class="s"> * - :cspan:`5` Engines configured by default (in :ref:`settings.yml &lt;engine settings&gt;`)</span>
+<span class="s"> - :cspan:`3` :ref:`Supported features &lt;engine file&gt;`</span>
+
+<span class="s"> * - Name</span>
+<span class="s"> - !bang</span>
+<span class="s"> - Module</span>
+<span class="s"> - Disabled</span>
+<span class="s"> - Timeout</span>
+<span class="s"> - Weight</span>
+<span class="s"> - Paging</span>
+<span class="s"> - Locale</span>
+<span class="s"> - Safe search</span>
+<span class="s"> - Time range</span>
+
+<span class="s"> {% for mod in engines %}</span>
+
+<span class="s"> * - `{{mod.name}} &lt;{{mod.about and mod.about.website}}&gt;`_</span>
+<span class="s"> {%- if mod.about and mod.about.language %}</span>
+<span class="s"> ({{mod.about.language | upper}})</span>
+<span class="s"> {%- endif %}</span>
+<span class="s"> - ``</span>!{{mod.shortcut}}<span class="s">``</span>
+<span class="s"> - {%- if &#39;searx.engines.&#39; + mod.__name__ in documented_modules %}</span>
+<span class="s"> :py:mod:`~searx.engines.{{mod.__name__}}`</span>
+<span class="s"> {%- else %}</span>
+<span class="s"> :origin:`{{mod.__name__}} &lt;searx/engines/{{mod.__name__}}.py&gt;`</span>
+<span class="s"> {%- endif %}</span>
+<span class="s"> - {{(mod.disabled and &quot;y&quot;) or &quot;&quot;}}</span>
+<span class="s"> - {{mod.timeout}}</span>
+<span class="s"> - {{mod.weight or 1 }}</span>
+<span class="s"> {% if mod.engine_type == &#39;online&#39; %}</span>
+<span class="s"> - {{(mod.paging and &quot;y&quot;) or &quot;&quot;}}</span>
+<span class="s"> - {{(mod.language_support and &quot;y&quot;) or &quot;&quot;}}</span>
+<span class="s"> - {{(mod.safesearch and &quot;y&quot;) or &quot;&quot;}}</span>
+<span class="s"> - {{(mod.time_range_support and &quot;y&quot;) or &quot;&quot;}}</span>
+<span class="s"> {% else %}</span>
+<span class="s"> - :cspan:`3` not applicable ({{mod.engine_type}})</span>
+<span class="s"> {% endif %}</span>
+
+<span class="s"> {% endfor %}</span>
+<span class="s"> {% endfor %}</span>
+<span class="s"> {% endfor %}</span>
+</pre></div>
+</div>
+<p>The context for the template is selected in the line <code class="docutils literal notranslate"><span class="pre">..</span> <span class="pre">jinja::</span> <span class="pre">searx</span></code>. In
+sphinx’s build configuration (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/docs/conf.py">git://docs/conf.py</a>) the <code class="docutils literal notranslate"><span class="pre">searx</span></code> context
+contains the <code class="docutils literal notranslate"><span class="pre">engines</span></code> and <code class="docutils literal notranslate"><span class="pre">plugins</span></code>.</p>
+<div class="highlight-py notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">searx.search</span>
+<span class="kn">import</span> <span class="nn">searx.engines</span>
+<span class="kn">import</span> <span class="nn">searx.plugins</span>
+<span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+<span class="n">jinja_contexts</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="s1">&#39;searx&#39;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s1">&#39;engines&#39;</span><span class="p">:</span> <span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">engines</span><span class="p">,</span>
+ <span class="s1">&#39;plugins&#39;</span><span class="p">:</span> <span class="n">searx</span><span class="o">.</span><span class="n">plugins</span><span class="o">.</span><span class="n">plugins</span>
+ <span class="p">},</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+</section>
+<section id="tabbed-views">
+<h2><a class="toc-backref" href="#id50" role="doc-backlink">Tabbed views</a><a class="headerlink" href="#tabbed-views" title="Link to this heading">¶</a></h2>
+<p>With <a class="reference external" href="https://github.com/djungelorm/sphinx-tabs">sphinx-tabs</a> extension we have <em>tabbed views</em>. To provide installation
+instructions with one tab per distribution we use the <a class="reference external" href="https://github.com/djungelorm/sphinx-tabs#group-tabs">group-tabs</a> directive,
+others are <a class="reference external" href="https://github.com/djungelorm/sphinx-tabs#basic-tabs">basic-tabs</a> and <a class="reference external" href="https://github.com/djungelorm/sphinx-tabs#code-tabs">code-tabs</a>. Below a <em>group-tab</em> example from
+<a class="reference internal" href="../admin/buildhosts.html#docs-build"><span class="std std-ref">Build docs</span></a> is shown:</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">tabs</span><span class="p">::</span>
+
+<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Ubuntu / debian
+
+<span class="p"> ..</span> <span class="ow">code-block</span><span class="p">::</span> <span class="k">sh</span>
+
+ $<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>shellcheck
+
+<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Arch Linux
+
+<span class="p"> ..</span> <span class="ow">code-block</span><span class="p">::</span> <span class="k">sh</span>
+
+ $<span class="w"> </span>sudo<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>shellcheck
+
+<span class="p"> ..</span> <span class="ow">group-tab</span><span class="p">::</span> Fedora / RHEL
+
+<span class="p"> ..</span> <span class="ow">code-block</span><span class="p">::</span> sh
+
+ $ sudo dnf install ShellCheck
+</pre></div>
+</div>
+</section>
+<section id="math-equations">
+<span id="math"></span><h2><a class="toc-backref" href="#id51" role="doc-backlink">Math equations</a><a class="headerlink" href="#math-equations" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">About LaTeX</p>
+<ul class="simple">
+<li><p><a class="reference external" href="http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/macros/latex/required/amsmath/amsldoc.pdf">amsmath user guide</a></p></li>
+<li><p><a class="reference external" href="https://en.wikibooks.org/wiki/LaTeX/Mathematics">Mathematics</a></p></li>
+<li><p><a class="reference internal" href="../admin/buildhosts.html#docs-build"><span class="std std-ref">Build docs</span></a></p></li>
+</ul>
+</aside>
+<p>The input language for mathematics is LaTeX markup using the <a class="reference external" href="https://ctan.org/pkg/amsmath">CTAN: amsmath</a>
+package.</p>
+<p>To embed LaTeX markup in reST documents, use role <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-math" title="(in Sphinx v7.4.0)"><code class="xref rst rst-role docutils literal notranslate"><span class="pre">:math:</span></code></a> for
+inline and directive <a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-math" title="(in Sphinx v7.4.0)"><code class="xref rst rst-dir docutils literal notranslate"><span class="pre">..</span> <span class="pre">math::</span></code></a> for block markup.</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span>In <span class="na">:math:numref:</span><span class="nv">`schroedinger general`</span> the time-dependent Schrödinger equation
+is shown.
+
+<span class="p">..</span> <span class="ow">math</span><span class="p">::</span>
+ <span class="nc">:label:</span> schroedinger general
+
+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle.
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">LaTeX math equation</p>
+<p>In <a class="reference internal" href="#equation-schroedinger-general">(1)</a> the time-dependent Schrödinger equation
+is shown.</p>
+<div class="math" id="equation-schroedinger-general">
+<p><span class="eqno">(1)<a class="headerlink" href="#equation-schroedinger-general" title="Link to this equation">¶</a></span><img src="../_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg" alt="\mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle."/></p>
+</div></div>
+<p>The next example shows the difference of <code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> (<em>textstyle</em>) and <code class="docutils literal notranslate"><span class="pre">\dfrac</span></code>
+(<em>displaystyle</em>) used in a inline markup or another fraction.</p>
+<div class="highlight-reST notranslate"><div class="highlight"><pre><span></span><span class="s">``\tfrac``</span> <span class="gs">**inline example**</span> <span class="na">:math:</span><span class="nv">`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`</span>
+<span class="s">``\dfrac``</span> <span class="gs">**inline example**</span> <span class="na">:math:</span><span class="nv">`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`</span>
+</pre></div>
+</div>
+<div class="rst-example admonition">
+<p class="admonition-title">Line spacing</p>
+<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+voluptua. …
+<code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> <strong>inline example</strong> <img class="math" src="../_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg" alt="\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}"/>
+At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
+<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+voluptua. …
+<code class="docutils literal notranslate"><span class="pre">\tfrac</span></code> <strong>inline example</strong> <img class="math" src="../_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg" alt="\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}"/>
+At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="makefile.html">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">reST primer</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#soft-skills">Soft skills</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#basic-inline-markup">Basic inline markup</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#basic-article-structure">Basic article structure</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#rest-template">reST template</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#headings">Headings</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#anchors-links">Anchors &amp; Links</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#anchors">Anchors</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#link-ordinary-url">Link ordinary URL</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#smart-refs">Smart refs</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#literal-blocks">Literal blocks</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#rest-literal"><code class="docutils literal notranslate"><span class="pre">::</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#code-block"><code class="docutils literal notranslate"><span class="pre">code-block</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#unicode-substitution">Unicode substitution</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#roles">Roles</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#figures-images">Figures &amp; Images</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#dot-files-aka-graphviz">DOT files (aka Graphviz)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#kernel-render-dot"><code class="docutils literal notranslate"><span class="pre">kernel-render</span></code> DOT</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#kernel-render-svg"><code class="docutils literal notranslate"><span class="pre">kernel-render</span></code> SVG</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#list-markups">List markups</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#bullet-list">Bullet list</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#horizontal-list">Horizontal list</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#definition-list">Definition list</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#quoted-paragraphs">Quoted paragraphs</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#field-lists">Field Lists</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#further-list-blocks">Further list blocks</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#admonitions">Admonitions</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#sidebar">Sidebar</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#generic-admonition">Generic admonition</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#specific-admonitions">Specific admonitions</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tables">Tables</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#simple-tables">Simple tables</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#grid-tables">Grid tables</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#flat-table">flat-table</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#csv-table">CSV table</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#templating">Templating</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#tabbed-views">Tabbed views</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#math-equations">Math equations</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="makefile.html" title="previous chapter">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a>
+ <li>Next: <a href="searxng_extra/index.html" title="next chapter">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/reST.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/rtm_asdf.html b/dev/rtm_asdf.html
new file mode 100644
index 000000000..6559d2a90
--- /dev/null
+++ b/dev/rtm_asdf.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Runtime Management &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="How to contribute" href="contribution_guide.html" />
+ <link rel="prev" title="Development Quickstart" href="quickstart.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="contribution_guide.html" title="How to contribute"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="quickstart.html" title="Development Quickstart"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Runtime Management</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="runtime-management">
+<h1>Runtime Management<a class="headerlink" href="#runtime-management" title="Link to this heading">¶</a></h1>
+<p>The runtimes are managed with asdf and are activated in this project via the
+<a class="reference external" href=".tool-versions">.tool-versions</a>. If you have not yet installed <a class="reference external" href="https://asdf-vm.com/">asdf</a>, then
+chapter <a class="reference internal" href="#introduce-asdf"><span class="std std-ref">Introduce asdf</span></a> may be of help to you.</p>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#get-started" id="id2">Get started</a></p></li>
+<li><p><a class="reference internal" href="#manage-versions" id="id3">Manage Versions</a></p></li>
+<li><p><a class="reference internal" href="#introduce-asdf" id="id4">Introduce asdf</a></p></li>
+</ul>
+</nav>
+<section id="get-started">
+<h2><a class="toc-backref" href="#id2" role="doc-backlink">Get started</a><a class="headerlink" href="#get-started" title="Link to this heading">¶</a></h2>
+<p>If you have asdf installed you can install the runtimes of this project by:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>/path/to/searxng
+$<span class="w"> </span>asdf<span class="w"> </span>install<span class="w"> </span><span class="c1"># will install runtimes listed in .tool-versions</span>
+...
+</pre></div>
+</div>
+</section>
+<section id="manage-versions">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">Manage Versions</a><a class="headerlink" href="#manage-versions" title="Link to this heading">¶</a></h2>
+<p>If you want to perform a <code class="docutils literal notranslate"><span class="pre">test</span></code> with special runtime versions of nodejs,
+python or shellcheck, you can patch the <code class="docutils literal notranslate"><span class="pre">.tool-versions</span></code>:</p>
+<div class="highlight-diff notranslate"><div class="highlight"><pre><span></span><span class="gd">--- a/.tool-versions</span>
+<span class="gi">+++ b/.tool-versions</span>
+<span class="gu">@@ -1,2 +1,2 @@</span>
+<span class="gd">-python 3.12.0</span>
+<span class="gd">-shellcheck 0.9.0</span>
+<span class="gi">+python 3.11.6</span>
+<span class="gi">+shellcheck 0.8.0</span>
+</pre></div>
+</div>
+<p>To install use <code class="docutils literal notranslate"><span class="pre">asdf</span> <span class="pre">install</span></code> again. If the runtime tools have changed, any
+existing (nodejs and python) environments should be cleaned up with a <code class="docutils literal notranslate"><span class="pre">make</span>
+<span class="pre">clean</span></code>.</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>asdf<span class="w"> </span>install
+...
+$<span class="w"> </span>make<span class="w"> </span>clean<span class="w"> </span><span class="nb">test</span>
+</pre></div>
+</div>
+</section>
+<section id="introduce-asdf">
+<span id="id1"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Introduce asdf</a><a class="headerlink" href="#introduce-asdf" title="Link to this heading">¶</a></h2>
+<p>To <a class="reference external" href="https://asdf-vm.com/guide/getting-started.html#_2-download-asdf">download asdf</a> and <a class="reference external" href="https://asdf-vm.com/guide/getting-started.html#_3-install-asdf">install asdf</a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/asdf-vm/asdf.git<span class="w"> </span>~/.asdf<span class="w"> </span>--branch<span class="w"> </span>&lt;version&gt;
+$<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s1">&#39;. &quot;$HOME/.asdf/asdf.sh&quot;&#39;</span><span class="w"> </span>&gt;&gt;<span class="w"> </span>~/.bashrc
+$<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s1">&#39;. &quot;$HOME/.asdf/completions/asdf.bash&quot;&#39;</span><span class="w"> </span>&gt;&gt;<span class="w"> </span>~/.bashrc
+</pre></div>
+</div>
+<p>Start a new shell and try to <a class="reference external" href="https://asdf-vm.com/guide/getting-started.html#install-the-plugin">install plugins</a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>asdf<span class="w"> </span>plugin-list-all<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-E<span class="w"> </span><span class="s1">&#39;(golang|python|nodejs|shellcheck).git&#39;</span>
+golang<span class="w"> </span>https://github.com/asdf-community/asdf-golang.git
+nodejs<span class="w"> </span>https://github.com/asdf-vm/asdf-nodejs.git
+python<span class="w"> </span>https://github.com/danhper/asdf-python.git
+shellcheck<span class="w"> </span>https://github.com/luizm/asdf-shellcheck.git
+
+$<span class="w"> </span>asdf<span class="w"> </span>plugin<span class="w"> </span>add<span class="w"> </span>golang<span class="w"> </span>https://github.com/asdf-community/asdf-golang.git
+$<span class="w"> </span>asdf<span class="w"> </span>plugin<span class="w"> </span>add<span class="w"> </span>nodejs<span class="w"> </span>https://github.com/asdf-vm/asdf-nodejs.git
+$<span class="w"> </span>asdf<span class="w"> </span>plugin<span class="w"> </span>add<span class="w"> </span>python<span class="w"> </span>https://github.com/danhper/asdf-python.git
+$<span class="w"> </span>asdf<span class="w"> </span>plugin<span class="w"> </span>add<span class="w"> </span>shellcheck<span class="w"> </span>https://github.com/luizm/asdf-shellcheck.git
+</pre></div>
+</div>
+<p>Each plugin has dependencies, to compile runtimes visit the URLs from above and
+look out for the dependencies you need to install on your OS, on Debian for the
+runtimes listed above you will need:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>update
+$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>dirmngr<span class="w"> </span>gpg<span class="w"> </span>curl<span class="w"> </span>gawk<span class="w"> </span>coreutils<span class="w"> </span>build-essential<span class="w"> </span>libssl-dev<span class="w"> </span>zlib1g-dev<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>libbz2-dev<span class="w"> </span>libreadline-dev<span class="w"> </span>libsqlite3-dev<span class="w"> </span><span class="se">\</span>
+<span class="w"> </span>libncursesw5-dev<span class="w"> </span>xz-utils<span class="w"> </span>tk-dev<span class="w"> </span>libxml2-dev<span class="w"> </span>libxmlsec1-dev<span class="w"> </span>libffi-dev<span class="w"> </span>liblzma-dev
+</pre></div>
+</div>
+<p>With dependencies installed you can install/compile runtimes:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>asdf<span class="w"> </span>install<span class="w"> </span>golang<span class="w"> </span>latest
+$<span class="w"> </span>asdf<span class="w"> </span>install<span class="w"> </span>nodejs<span class="w"> </span>latest
+$<span class="w"> </span>asdf<span class="w"> </span>install<span class="w"> </span>python<span class="w"> </span>latest
+$<span class="w"> </span>asdf<span class="w"> </span>install<span class="w"> </span>shellcheck<span class="w"> </span>latest
+</pre></div>
+</div>
+<p>Python will be compiled and will take a while.</p>
+<p>In the repository the version is defined in <a class="reference external" href=".tool-versions">.tool-versions</a>. Outside the
+repository, its recommended that the runtime should use the versions of the OS
+(<a class="reference external" href="https://asdf-vm.com/manage/versions.html#fallback-to-system-version">Fallback to System Version</a>) / if not already done register the system
+versions global:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>/
+$<span class="w"> </span>asdf<span class="w"> </span>global<span class="w"> </span>golang<span class="w"> </span>system
+$<span class="w"> </span>asdf<span class="w"> </span>global<span class="w"> </span>nodejs<span class="w"> </span>system
+$<span class="w"> </span>asdf<span class="w"> </span>global<span class="w"> </span>python<span class="w"> </span>system
+$<span class="w"> </span>asdf<span class="w"> </span>global<span class="w"> </span>shellcheck<span class="w"> </span>system
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Runtime Management</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#get-started">Get started</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#manage-versions">Manage Versions</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#introduce-asdf">Introduce asdf</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="quickstart.html" title="previous chapter">Development Quickstart</a>
+ <li>Next: <a href="contribution_guide.html" title="next chapter">How to contribute</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/rtm_asdf.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/search_api.html b/dev/search_api.html
new file mode 100644
index 000000000..82cf6e317
--- /dev/null
+++ b/dev/search_api.html
@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Search API &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Plugins" href="plugins.html" />
+ <link rel="prev" title="Tineye" href="engines/online_url_search/tineye.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="plugins.html" title="Plugins"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="engines/online_url_search/tineye.html" title="Tineye"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Search API</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="search-api">
+<span id="id1"></span><h1>Search API<a class="headerlink" href="#search-api" title="Link to this heading">¶</a></h1>
+<p>The search supports both <code class="docutils literal notranslate"><span class="pre">GET</span></code> and <code class="docutils literal notranslate"><span class="pre">POST</span></code>.</p>
+<p>Furthermore, two endpoints <code class="docutils literal notranslate"><span class="pre">/</span></code> and <code class="docutils literal notranslate"><span class="pre">/search</span></code> are available for querying.</p>
+<p><code class="docutils literal notranslate"><span class="pre">GET</span> <span class="pre">/</span></code></p>
+<p><code class="docutils literal notranslate"><span class="pre">GET</span> <span class="pre">/search</span></code></p>
+<section id="parameters">
+<h2>Parameters<a class="headerlink" href="#parameters" title="Link to this heading">¶</a></h2>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="engines/engine_overview.html#engines-dev"><span class="std std-ref">Engine Overview</span></a></p></li>
+<li><p><a class="reference internal" href="../admin/settings/settings.html#settings-yml"><span class="std std-ref">settings.yml</span></a></p></li>
+<li><p><a class="reference internal" href="../user/configured_engines.html#configured-engines"><span class="std std-ref">Configured Engines</span></a></p></li>
+</ul>
+</aside>
+<dl>
+<dt><code class="docutils literal notranslate"><span class="pre">q</span></code><span class="classifier">required</span></dt><dd><p>The search query. This string is passed to external search services. Thus,
+SearXNG supports syntax of each search service. For example, <code class="docutils literal notranslate"><span class="pre">site:github.com</span>
+<span class="pre">SearXNG</span></code> is a valid query for Google. However, if simply the query above is
+passed to any search engine which does not filter its results based on this
+syntax, you might not get the results you wanted.</p>
+<p>See more at <a class="reference internal" href="../user/search-syntax.html#search-syntax"><span class="std std-ref">Search syntax</span></a></p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">categories</span></code><span class="classifier">optional</span></dt><dd><p>Comma separated list, specifies the active search categories (see
+<a class="reference internal" href="../user/configured_engines.html#configured-engines"><span class="std std-ref">Configured Engines</span></a>)</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">engines</span></code><span class="classifier">optional</span></dt><dd><p>Comma separated list, specifies the active search engines (see
+<a class="reference internal" href="../user/configured_engines.html#configured-engines"><span class="std std-ref">Configured Engines</span></a>).</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">language</span></code><span class="classifier">default from <a class="reference internal" href="../admin/settings/settings_search.html#settings-search"><span class="std std-ref">search:</span></a></span></dt><dd><p>Code of the language.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">pageno</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">1</span></code></span></dt><dd><p>Search page number.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">time_range</span></code><span class="classifier">optional</span></dt><dd><p>[ <code class="docutils literal notranslate"><span class="pre">day</span></code>, <code class="docutils literal notranslate"><span class="pre">month</span></code>, <code class="docutils literal notranslate"><span class="pre">year</span></code> ]</p>
+<p>Time range of search for engines which support it. See if an engine supports
+time range search in the preferences page of an instance.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">format</span></code><span class="classifier">optional</span></dt><dd><p>[ <code class="docutils literal notranslate"><span class="pre">json</span></code>, <code class="docutils literal notranslate"><span class="pre">csv</span></code>, <code class="docutils literal notranslate"><span class="pre">rss</span></code> ]</p>
+<p>Output format of results. Format needs to be activated in <a class="reference internal" href="../admin/settings/settings_search.html#settings-search"><span class="std std-ref">search:</span></a>.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">results_on_new_tab</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">0</span></code></span></dt><dd><p>[ <code class="docutils literal notranslate"><span class="pre">0</span></code>, <code class="docutils literal notranslate"><span class="pre">1</span></code> ]</p>
+<p>Open search results on new tab.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">image_proxy</span></code><span class="classifier">default from <a class="reference internal" href="../admin/settings/settings_server.html#settings-server"><span class="std std-ref">server:</span></a></span></dt><dd><p>[ <code class="docutils literal notranslate"><span class="pre">True</span></code>, <code class="docutils literal notranslate"><span class="pre">False</span></code> ]</p>
+<p>Proxy image results through SearXNG.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">autocomplete</span></code><span class="classifier">default from <a class="reference internal" href="../admin/settings/settings_search.html#settings-search"><span class="std std-ref">search:</span></a></span></dt><dd><p>[ <code class="docutils literal notranslate"><span class="pre">google</span></code>, <code class="docutils literal notranslate"><span class="pre">dbpedia</span></code>, <code class="docutils literal notranslate"><span class="pre">duckduckgo</span></code>, <code class="docutils literal notranslate"><span class="pre">mwmbl</span></code>, <code class="docutils literal notranslate"><span class="pre">startpage</span></code>,
+<code class="docutils literal notranslate"><span class="pre">wikipedia</span></code>, <code class="docutils literal notranslate"><span class="pre">stract</span></code>, <code class="docutils literal notranslate"><span class="pre">swisscows</span></code>, <code class="docutils literal notranslate"><span class="pre">qwant</span></code> ]</p>
+<p>Service which completes words as you type.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">safesearch</span></code><span class="classifier">default from <a class="reference internal" href="../admin/settings/settings_search.html#settings-search"><span class="std std-ref">search:</span></a></span></dt><dd><p>[ <code class="docutils literal notranslate"><span class="pre">0</span></code>, <code class="docutils literal notranslate"><span class="pre">1</span></code>, <code class="docutils literal notranslate"><span class="pre">2</span></code> ]</p>
+<p>Filter search results of engines which support safe search. See if an engine
+supports safe search in the preferences page of an instance.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">theme</span></code><span class="classifier">default <code class="docutils literal notranslate"><span class="pre">simple</span></code></span></dt><dd><p>[ <code class="docutils literal notranslate"><span class="pre">simple</span></code> ]</p>
+<p>Theme of instance.</p>
+<p>Please note, available themes depend on an instance. It is possible that an
+instance administrator deleted, created or renamed themes on their instance.
+See the available options in the preferences page of the instance.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">enabled_plugins</span></code><span class="classifier">optional</span></dt><dd><p>List of enabled plugins.</p>
+<dl class="field-list">
+<dt class="field-odd">default<span class="colon">:</span></dt>
+<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">Hash_plugin</span></code>, <code class="docutils literal notranslate"><span class="pre">Self_Information</span></code>,
+<code class="docutils literal notranslate"><span class="pre">Tracker_URL_remover</span></code>, <code class="docutils literal notranslate"><span class="pre">Ahmia_blacklist</span></code></p>
+</dd>
+<dt class="field-even">values<span class="colon">:</span></dt>
+<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">Hash_plugin</span></code>, <code class="docutils literal notranslate"><span class="pre">Self_Information</span></code>,
+<code class="docutils literal notranslate"><span class="pre">Tracker_URL_remover</span></code>, <code class="docutils literal notranslate"><span class="pre">Ahmia_blacklist</span></code>,</p>
+<p><code class="docutils literal notranslate"><span class="pre">Hostname_replace</span></code>, <code class="docutils literal notranslate"><span class="pre">Open_Access_DOI_rewrite</span></code>,
+<code class="docutils literal notranslate"><span class="pre">Vim-like_hotkeys</span></code>, <code class="docutils literal notranslate"><span class="pre">Tor_check_plugin</span></code></p>
+</dd>
+</dl>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">disabled_plugins</span></code>: optional</dt><dd><p>List of disabled plugins.</p>
+<dl class="field-list simple">
+<dt class="field-odd">default<span class="colon">:</span></dt>
+<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">Hostname_replace</span></code>, <code class="docutils literal notranslate"><span class="pre">Open_Access_DOI_rewrite</span></code>,
+<code class="docutils literal notranslate"><span class="pre">Vim-like_hotkeys</span></code>, <code class="docutils literal notranslate"><span class="pre">Tor_check_plugin</span></code></p>
+</dd>
+<dt class="field-even">values<span class="colon">:</span></dt>
+<dd class="field-even"><p>see values from <code class="docutils literal notranslate"><span class="pre">enabled_plugins</span></code></p>
+</dd>
+</dl>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">enabled_engines</span></code><span class="classifier">optional</span><span class="classifier"><em>all</em> <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines">engines</a></span></dt><dd><p>List of enabled engines.</p>
+</dd>
+<dt><code class="docutils literal notranslate"><span class="pre">disabled_engines</span></code><span class="classifier">optional</span><span class="classifier"><em>all</em> <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines">engines</a></span></dt><dd><p>List of disabled engines.</p>
+</dd>
+</dl>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Search API</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#parameters">Parameters</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="engines/online_url_search/tineye.html" title="previous chapter">Tineye</a>
+ <li>Next: <a href="plugins.html" title="next chapter">Plugins</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/search_api.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/searxng_extra/index.html b/dev/searxng_extra/index.html
new file mode 100644
index 000000000..e07c1d3b4
--- /dev/null
+++ b/dev/searxng_extra/index.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Tooling box searxng_extra &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="searxng_extra/update/" href="update.html" />
+ <link rel="prev" title="reST primer" href="../reST.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="update.html" title="searxng_extra/update/"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../reST.html" title="reST primer"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="tooling-box-searxng-extra">
+<span id="searxng-extra"></span><h1>Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code><a class="headerlink" href="#tooling-box-searxng-extra" title="Link to this heading">¶</a></h1>
+<p>In the folder <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/">git://searxng_extra/</a> we maintain some tools useful for CI and
+developers.</p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="update.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-ahmia-blacklist-py"><code class="docutils literal notranslate"><span class="pre">update_ahmia_blacklist.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-currencies-py"><code class="docutils literal notranslate"><span class="pre">update_currencies.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-engine-descriptions-py"><code class="docutils literal notranslate"><span class="pre">update_engine_descriptions.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-external-bangs-py"><code class="docutils literal notranslate"><span class="pre">update_external_bangs.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-firefox-version-py"><code class="docutils literal notranslate"><span class="pre">update_firefox_version.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-engine-traits-py"><code class="docutils literal notranslate"><span class="pre">update_engine_traits.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-osm-keys-tags-py"><code class="docutils literal notranslate"><span class="pre">update_osm_keys_tags.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-pygments-py"><code class="docutils literal notranslate"><span class="pre">update_pygments.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-locales-py"><code class="docutils literal notranslate"><span class="pre">update_locales.py</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="update.html#update-wikidata-units-py"><code class="docutils literal notranslate"><span class="pre">update_wikidata_units.py</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="standalone_searx.py.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="standalone_searx.py.html#searxng_extra.standalone_searx.get_search_query"><code class="docutils literal notranslate"><span class="pre">get_search_query()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="standalone_searx.py.html#searxng_extra.standalone_searx.json_serial"><code class="docutils literal notranslate"><span class="pre">json_serial()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="standalone_searx.py.html#searxng_extra.standalone_searx.no_parsed_url"><code class="docutils literal notranslate"><span class="pre">no_parsed_url()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="standalone_searx.py.html#searxng_extra.standalone_searx.parse_argument"><code class="docutils literal notranslate"><span class="pre">parse_argument()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="standalone_searx.py.html#searxng_extra.standalone_searx.to_dict"><code class="docutils literal notranslate"><span class="pre">to_dict()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a><ul>
+<li class="toctree-l3"><a class="reference internal" href="update.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="standalone_searx.py.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="../reST.html" title="previous chapter">reST primer</a>
+ <li>Next: <a href="update.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/searxng_extra/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/searxng_extra/standalone_searx.py.html b/dev/searxng_extra/standalone_searx.py.html
new file mode 100644
index 000000000..0df2ae9cb
--- /dev/null
+++ b/dev/searxng_extra/standalone_searx.py.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra/standalone_searx.py &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="DevOps tooling box" href="../../utils/index.html" />
+ <link rel="prev" title="searxng_extra/update/" href="update.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../../utils/index.html" title="DevOps tooling box"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="update.html" title="searxng_extra/update/"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="module-searxng_extra.standalone_searx">
+<span id="searxng-extra-standalone-searx-py"></span><span id="standalone-searx-py"></span><h1><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code><a class="headerlink" href="#module-searxng_extra.standalone_searx" title="Link to this heading">¶</a></h1>
+<p>Script to run SearXNG from terminal.</p>
+<blockquote>
+<div><p>DON’T USE THIS SCRIPT!!</p>
+</div></blockquote>
+<div class="admonition danger">
+<p class="admonition-title">Danger</p>
+<p>Be warned, using the <code class="docutils literal notranslate"><span class="pre">standalone_searx.py</span></code> won’t give you privacy!</p>
+<p>On the contrary, this script behaves like a SearXNG server: your IP is
+exposed and tracked by all active engines (google, bing, qwant, … ), with
+every query!</p>
+</div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>This is an old and grumpy hack / SearXNG is a Flask application with
+client/server structure, which can’t be turned into a command line tool the
+way it was done here.</p>
+</div>
+<p>Getting categories without initiate the engine will only return <cite>[‘general’]</cite></p>
+<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">searx.engines</span>
+<span class="gp">... </span><span class="nb">list</span><span class="p">(</span><span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">categories</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+<span class="go">[&#39;general&#39;]</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">searx.search</span>
+<span class="gp">... </span><span class="n">searx</span><span class="o">.</span><span class="n">search</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+<span class="gp">... </span><span class="nb">list</span><span class="p">(</span><span class="n">searx</span><span class="o">.</span><span class="n">engines</span><span class="o">.</span><span class="n">categories</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+<span class="go">[&#39;general&#39;, &#39;it&#39;, &#39;science&#39;, &#39;images&#39;, &#39;news&#39;, &#39;videos&#39;, &#39;music&#39;, &#39;files&#39;, &#39;social media&#39;, &#39;map&#39;]</span>
+</pre></div>
+</div>
+<p>Example to use this script:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>python3<span class="w"> </span>searxng_extra/standalone_searx.py<span class="w"> </span>rain
+</pre></div>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.standalone_searx.get_search_query">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.standalone_searx.</span></span><span class="sig-name descname"><span class="pre">get_search_query</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">args</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/argparse.html#argparse.Namespace" title="(in Python v3.12)"><span class="pre">Namespace</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_categories</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="../../src/searx.search.html#searx.search.SearchQuery" title="searx.search.models.SearchQuery"><span class="pre">SearchQuery</span></a></span></span><a class="reference internal" href="../../_modules/searxng_extra/standalone_searx.html#get_search_query"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.standalone_searx.get_search_query" title="Link to this definition">¶</a></dt>
+<dd><p>Get search results for the query</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.standalone_searx.json_serial">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.standalone_searx.</span></span><span class="sig-name descname"><span class="pre">json_serial</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a></span></span><a class="reference internal" href="../../_modules/searxng_extra/standalone_searx.html#json_serial"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.standalone_searx.json_serial" title="Link to this definition">¶</a></dt>
+<dd><p>JSON serializer for objects not serializable by default json code.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Raises<span class="colon">:</span></dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#TypeError" title="(in Python v3.12)"><strong>TypeError</strong></a> – raised when <strong>obj</strong> is not serializable</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.standalone_searx.no_parsed_url">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.standalone_searx.</span></span><span class="sig-name descname"><span class="pre">no_parsed_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">results</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../../_modules/searxng_extra/standalone_searx.html#no_parsed_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.standalone_searx.no_parsed_url" title="Link to this definition">¶</a></dt>
+<dd><p>Remove parsed url from dict.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.standalone_searx.parse_argument">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.standalone_searx.</span></span><span class="sig-name descname"><span class="pre">parse_argument</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">args</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">category_choices</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/argparse.html#argparse.Namespace" title="(in Python v3.12)"><span class="pre">Namespace</span></a></span></span><a class="reference internal" href="../../_modules/searxng_extra/standalone_searx.html#parse_argument"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.standalone_searx.parse_argument" title="Link to this definition">¶</a></dt>
+<dd><p>Parse command line.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Raises<span class="colon">:</span></dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#SystemExit" title="(in Python v3.12)"><strong>SystemExit</strong></a> – Query argument required on <cite>args</cite></p>
+</dd>
+</dl>
+<p>Examples:</p>
+<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">importlib</span>
+<span class="gp">... </span><span class="c1"># load module</span>
+<span class="gp">... </span><span class="n">spec</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">spec_from_file_location</span><span class="p">(</span>
+<span class="gp">... </span> <span class="s1">&#39;utils.standalone_searx&#39;</span><span class="p">,</span> <span class="s1">&#39;utils/standalone_searx.py&#39;</span><span class="p">)</span>
+<span class="gp">... </span><span class="n">sas</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">module_from_spec</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
+<span class="gp">... </span><span class="n">spec</span><span class="o">.</span><span class="n">loader</span><span class="o">.</span><span class="n">exec_module</span><span class="p">(</span><span class="n">sas</span><span class="p">)</span>
+<span class="gp">... </span><span class="n">sas</span><span class="o">.</span><span class="n">parse_argument</span><span class="p">()</span>
+<span class="go">usage: ptipython [-h] [--category [{general}]] [--lang [LANG]] [--pageno [PAGENO]] [--safesearch [{0,1,2}]] [--timerange [{day,week,month,year}]]</span>
+<span class="go"> query</span>
+<span class="go">SystemExit: 2</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">sas</span><span class="o">.</span><span class="n">parse_argument</span><span class="p">([</span><span class="s1">&#39;rain&#39;</span><span class="p">])</span>
+<span class="go">Namespace(category=&#39;general&#39;, lang=&#39;all&#39;, pageno=1, query=&#39;rain&#39;, safesearch=&#39;0&#39;, timerange=None)</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.standalone_searx.to_dict">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.standalone_searx.</span></span><span class="sig-name descname"><span class="pre">to_dict</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../../src/searx.search.html#searx.search.SearchQuery" title="searx.search.models.SearchQuery"><span class="pre">SearchQuery</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../../_modules/searxng_extra/standalone_searx.html#to_dict"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.standalone_searx.to_dict" title="Link to this definition">¶</a></dt>
+<dd><p>Get result from parsed arguments.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="update.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searxng_extra.standalone_searx.get_search_query"><code class="docutils literal notranslate"><span class="pre">get_search_query()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searxng_extra.standalone_searx.json_serial"><code class="docutils literal notranslate"><span class="pre">json_serial()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searxng_extra.standalone_searx.no_parsed_url"><code class="docutils literal notranslate"><span class="pre">no_parsed_url()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searxng_extra.standalone_searx.parse_argument"><code class="docutils literal notranslate"><span class="pre">parse_argument()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searxng_extra.standalone_searx.to_dict"><code class="docutils literal notranslate"><span class="pre">to_dict()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a>
+ <ul>
+ <li>Previous: <a href="update.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a>
+ <li>Next: <a href="../../utils/index.html" title="next chapter">DevOps tooling box</a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/searxng_extra/standalone_searx.py.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/searxng_extra/update.html b/dev/searxng_extra/update.html
new file mode 100644
index 000000000..5a24f939e
--- /dev/null
+++ b/dev/searxng_extra/update.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>searxng_extra/update/ &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=a5c4661c" />
+ <script src="../../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+ <link rel="next" title="searxng_extra/standalone_searx.py" href="standalone_searx.py.html" />
+ <link rel="prev" title="Tooling box searxng_extra" href="index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="standalone_searx.py.html" title="searxng_extra/standalone_searx.py"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="Tooling box searxng_extra"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="searxng-extra-update">
+<h1><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code><a class="headerlink" href="#searxng-extra-update" title="Link to this heading">¶</a></h1>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/__init__.py">[source]</a></p>
+<p>Scripts to update static data in <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/">git://searx/data/</a></p>
+<section id="update-ahmia-blacklist-py">
+<span id="id1"></span><h2><code class="docutils literal notranslate"><span class="pre">update_ahmia_blacklist.py</span></code><a class="headerlink" href="#update-ahmia-blacklist-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_ahmia_blacklist.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_ahmia_blacklist">This script saves <a class="reference external" href="https://ahmia.fi/blacklist/">Ahmia’s blacklist</a> for onion sites.</p>
+<p>Output file: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/ahmia_blacklist.txt">git://searx/data/ahmia_blacklist.txt</a> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/data-update.yml">CI Update data
+…</a>).</p>
+</section>
+<section id="update-currencies-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_currencies.py</span></code><a class="headerlink" href="#update-currencies-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_currencies.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_currencies">Fetch currencies from <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wikidata.py">git://searx/engines/wikidata.py</a> engine.</p>
+<p>Output file: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/currencies.json">git://searx/data/currencies.json</a> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/data-update.yml">CI Update data …</a>).</p>
+</section>
+<section id="update-engine-descriptions-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_engine_descriptions.py</span></code><a class="headerlink" href="#update-engine-descriptions-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_engine_descriptions.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_engine_descriptions">Fetch website description from websites and from
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wikidata.py">git://searx/engines/wikidata.py</a> engine.</p>
+<p>Output file: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/engine_descriptions.json">git://searx/data/engine_descriptions.json</a>.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.update.update_engine_descriptions.get_output">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_engine_descriptions.</span></span><span class="sig-name descname"><span class="pre">get_output</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searxng_extra/update/update_engine_descriptions.html#get_output"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_engine_descriptions.get_output" title="Link to this definition">¶</a></dt>
+<dd><p>From descriptions[engine][language] = [description, source]
+To</p>
+<ul class="simple">
+<li><p>output[language][engine] = description_and_source</p></li>
+<li><dl class="simple">
+<dt>description_and_source can be:</dt><dd><ul>
+<li><p>[description, source]</p></li>
+<li><p>description (if source = “wikipedia”)</p></li>
+<li><p>[f”engine:lang”, “ref”] (reference to another existing description)</p></li>
+</ul>
+</dd>
+</dl>
+</li>
+</ul>
+</dd></dl>
+
+</section>
+<section id="update-external-bangs-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_external_bangs.py</span></code><a class="headerlink" href="#update-external-bangs-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_external_bangs.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_external_bangs">Update <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/external_bangs.json">git://searx/data/external_bangs.json</a> using the duckduckgo bangs
+from <a class="reference internal" href="#searxng_extra.update.update_external_bangs.BANGS_URL" title="searxng_extra.update.update_external_bangs.BANGS_URL"><code class="xref py py-obj docutils literal notranslate"><span class="pre">BANGS_URL</span></code></a>.</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/data-update.yml">CI Update data …</a></p></li>
+</ul>
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.update.update_external_bangs.merge_when_no_leaf">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_external_bangs.</span></span><span class="sig-name descname"><span class="pre">merge_when_no_leaf</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">node</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searxng_extra/update/update_external_bangs.html#merge_when_no_leaf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_external_bangs.merge_when_no_leaf" title="Link to this definition">¶</a></dt>
+<dd><p>Minimize the number of nodes</p>
+<p><code class="docutils literal notranslate"><span class="pre">A</span> <span class="pre">-&gt;</span> <span class="pre">B</span> <span class="pre">-&gt;</span> <span class="pre">C</span></code></p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">B</span></code> is child of <code class="docutils literal notranslate"><span class="pre">A</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">C</span></code> is child of <code class="docutils literal notranslate"><span class="pre">B</span></code></p></li>
+</ul>
+<p>If there are no <code class="docutils literal notranslate"><span class="pre">C</span></code> equals to <code class="docutils literal notranslate"><span class="pre">&lt;LEAF_KEY&gt;</span></code>, then each <code class="docutils literal notranslate"><span class="pre">C</span></code> are merged
+into <code class="docutils literal notranslate"><span class="pre">A</span></code>. For example (5 nodes):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">d</span> <span class="o">-&gt;</span> <span class="n">d</span> <span class="o">-&gt;</span> <span class="n">g</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="n">LEAF_KEY</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">ddg</span><span class="p">)</span>
+ <span class="o">-&gt;</span> <span class="n">i</span> <span class="o">-&gt;</span> <span class="n">g</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="n">LEAF_KEY</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">dig</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>becomes (3 nodes):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">d</span> <span class="o">-&gt;</span> <span class="n">dg</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="n">LEAF_KEY</span><span class="o">&gt;</span>
+ <span class="o">-&gt;</span> <span class="n">ig</span> <span class="o">-&gt;</span> <span class="o">&lt;</span><span class="n">LEAF_KEY</span><span class="o">&gt;</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searxng_extra.update.update_external_bangs.BANGS_URL">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_external_bangs.</span></span><span class="sig-name descname"><span class="pre">BANGS_URL</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'https://duckduckgo.com/bang.js'</span></em><a class="headerlink" href="#searxng_extra.update.update_external_bangs.BANGS_URL" title="Link to this definition">¶</a></dt>
+<dd><p>JSON file which contains the bangs.</p>
+</dd></dl>
+
+</section>
+<section id="update-firefox-version-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_firefox_version.py</span></code><a class="headerlink" href="#update-firefox-version-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_firefox_version.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_firefox_version">Fetch firefox useragent signatures</p>
+<p>Output file: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/useragents.json">git://searx/data/useragents.json</a> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/data-update.yml">CI Update data …</a>).</p>
+</section>
+<section id="update-engine-traits-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_engine_traits.py</span></code><a class="headerlink" href="#update-engine-traits-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_engine_traits.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_engine_traits">Update <a class="reference internal" href="../engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap" title="searx.enginelib.traits.EngineTraitsMap"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.enginelib.traits.EngineTraitsMap</span></code></a> and <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/languages.py">git://searx/languages.py</a></p>
+<dl class="simple">
+<dt><a class="reference internal" href="../engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE" title="searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE</span></code></a>:</dt><dd><p>Persistence of engines traits, fetched from the engines.</p>
+</dd>
+<dt><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/languages.py">git://searx/languages.py</a></dt><dd><p>Is generated from intersecting each engine’s supported traits.</p>
+</dd>
+</dl>
+<p>The script <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_engine_traits.py">git://searxng_extra/update/update_engine_traits.py</a> is called in
+the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/data-update.yml">CI Update data …</a></p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searxng_extra.update.update_engine_traits.UnicodeEscape">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_engine_traits.</span></span><span class="sig-name descname"><span class="pre">UnicodeEscape</span></span><a class="reference internal" href="../../_modules/searxng_extra/update/update_engine_traits.html#UnicodeEscape"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_engine_traits.UnicodeEscape" title="Link to this definition">¶</a></dt>
+<dd><p>Escape unicode string in <a class="reference external" href="https://docs.python.org/3/library/pprint.html#pprint.pformat" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">pprint.pformat</span></code></a></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.update.update_engine_traits.fetch_traits_map">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_engine_traits.</span></span><span class="sig-name descname"><span class="pre">fetch_traits_map</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searxng_extra/update/update_engine_traits.html#fetch_traits_map"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_engine_traits.fetch_traits_map" title="Link to this definition">¶</a></dt>
+<dd><p>Fetchs supported languages for each engine and writes json file with those.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.update.update_engine_traits.filter_locales">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_engine_traits.</span></span><span class="sig-name descname"><span class="pre">filter_locales</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">traits_map</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap" title="searx.enginelib.traits.EngineTraitsMap"><span class="pre">EngineTraitsMap</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searxng_extra/update/update_engine_traits.html#filter_locales"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_engine_traits.filter_locales" title="Link to this definition">¶</a></dt>
+<dd><p>Filter language &amp; region tags by a threshold.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.update.update_engine_traits.get_unicode_flag">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_engine_traits.</span></span><span class="sig-name descname"><span class="pre">get_unicode_flag</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale" title="(in Babel v2.2)"><span class="pre">Locale</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searxng_extra/update/update_engine_traits.html#get_unicode_flag"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_engine_traits.get_unicode_flag" title="Link to this definition">¶</a></dt>
+<dd><p>Determine a unicode flag (emoji) that fits to the <code class="docutils literal notranslate"><span class="pre">locale</span></code></p>
+</dd></dl>
+
+</section>
+<section id="update-osm-keys-tags-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_osm_keys_tags.py</span></code><a class="headerlink" href="#update-osm-keys-tags-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_osm_keys_tags.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_osm_keys_tags">Fetch OSM keys and tags.</p>
+<p>To get the i18n names, the scripts uses <a class="reference external" href="https://query.wikidata.org/">Wikidata Query Service</a> instead of for
+example <a class="reference external" href="https://taginfo.openstreetmap.org/taginfo/apidoc">OSM tags API</a> (side note: the actual change log from
+<a class="reference external" href="https://map.atownsend.org.uk/maps/map/changelog.html">map.atownsend.org.uk</a> might be useful to normalize OSM tags).</p>
+<p>Output file: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/osm_keys_tags">git://searx/data/osm_keys_tags</a> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/data-update.yml">CI Update data …</a>).</p>
+<dl>
+<dt><code class="xref py py-obj docutils literal notranslate"><span class="pre">SPARQL_TAGS_REQUEST</span></code> :</dt><dd><p>Wikidata SPARQL query that returns <em>type-categories</em> and <em>types</em>. The
+returned tag is <code class="docutils literal notranslate"><span class="pre">Tag:{category}={type}</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">get_tags()</span></code>).
+Example:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://taginfo.openstreetmap.org/tags/building=house#overview">https://taginfo.openstreetmap.org/tags/building=house#overview</a></p></li>
+<li><p><a class="reference external" href="https://wiki.openstreetmap.org/wiki/Tag:building%3Dhouse">https://wiki.openstreetmap.org/wiki/Tag:building%3Dhouse</a>
+at the bottom of the infobox (right side), there is a link to wikidata:
+<a class="reference external" href="https://www.wikidata.org/wiki/Q3947">https://www.wikidata.org/wiki/Q3947</a>
+see property “OpenStreetMap tag or key” (P1282)</p></li>
+<li><p><a class="reference external" href="https://wiki.openstreetmap.org/wiki/Tag%3Abuilding%3Dbungalow">https://wiki.openstreetmap.org/wiki/Tag%3Abuilding%3Dbungalow</a>
+<a class="reference external" href="https://www.wikidata.org/wiki/Q850107">https://www.wikidata.org/wiki/Q850107</a></p></li>
+</ul>
+</dd>
+<dt><code class="xref py py-obj docutils literal notranslate"><span class="pre">SPARQL_KEYS_REQUEST</span></code> :</dt><dd><p>Wikidata SPARQL query that returns <em>keys</em>. Example with “payment”:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://wiki.openstreetmap.org/wiki/Key%3Apayment">https://wiki.openstreetmap.org/wiki/Key%3Apayment</a>
+at the bottom of infobox (right side), there is a link to wikidata:
+<a class="reference external" href="https://www.wikidata.org/wiki/Q1148747">https://www.wikidata.org/wiki/Q1148747</a>
+link made using the “OpenStreetMap tag or key” property (P1282)
+to be confirm: there is a one wiki page per key ?</p></li>
+<li><p><a class="reference external" href="https://taginfo.openstreetmap.org/keys/payment#values">https://taginfo.openstreetmap.org/keys/payment#values</a></p></li>
+<li><p><a class="reference external" href="https://taginfo.openstreetmap.org/keys/payment:cash#values">https://taginfo.openstreetmap.org/keys/payment:cash#values</a></p></li>
+</ul>
+<p><code class="docutils literal notranslate"><span class="pre">rdfs:label</span></code> get all the labels without language selection
+(as opposed to SERVICE <code class="docutils literal notranslate"><span class="pre">wikibase:label</span></code>).</p>
+</dd>
+</dl>
+</section>
+<section id="update-pygments-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_pygments.py</span></code><a class="headerlink" href="#update-pygments-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_pygments.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_pygments">Update pygments style</p>
+<p>Call this script after each upgrade of pygments</p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searxng_extra.update.update_pygments.Formatter">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_pygments.</span></span><span class="sig-name descname"><span class="pre">Formatter</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">options</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searxng_extra/update/update_pygments.html#Formatter"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_pygments.Formatter" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</section>
+<section id="update-locales-py">
+<span id="id2"></span><h2><code class="docutils literal notranslate"><span class="pre">update_locales.py</span></code><a class="headerlink" href="#update-locales-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_locales.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_locales">Update locale names in <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/locales.json">git://searx/data/locales.json</a> used by
+<a class="reference internal" href="../../src/searx.locales.html#searx-locales"><span class="std std-ref">Locales</span></a></p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../../src/searx.locales.html#searx.locales.RTL_LOCALES" title="searx.locales.RTL_LOCALES"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.locales.RTL_LOCALES</span></code></a></p></li>
+<li><p><a class="reference internal" href="../../src/searx.locales.html#searx.locales.LOCALE_NAMES" title="searx.locales.LOCALE_NAMES"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.locales.LOCALE_NAMES</span></code></a></p></li>
+</ul>
+<dl class="py function">
+<dt class="sig sig-object py" id="searxng_extra.update.update_locales.get_locale_descr">
+<span class="sig-prename descclassname"><span class="pre">searxng_extra.update.update_locales.</span></span><span class="sig-name descname"><span class="pre">get_locale_descr</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale" title="(in Babel v2.2)"><span class="pre">Locale</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">tr_locale</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searxng_extra/update/update_locales.html#get_locale_descr"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searxng_extra.update.update_locales.get_locale_descr" title="Link to this definition">¶</a></dt>
+<dd><p>Get locale name e.g. ‘Français - fr’ or ‘Português (Brasil) - pt-BR’</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>locale</strong> – instance of <code class="xref py py-class docutils literal notranslate"><span class="pre">Locale</span></code></p></li>
+<li><p><strong>tr_locale</strong> – name e.g. ‘fr’ or ‘pt_BR’ (delimiter is <em>underscore</em>)</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+</section>
+<section id="update-wikidata-units-py">
+<h2><code class="docutils literal notranslate"><span class="pre">update_wikidata_units.py</span></code><a class="headerlink" href="#update-wikidata-units-py" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searxng_extra/update/update_wikidata_units.py">[source]</a></p>
+<p id="module-searxng_extra.update.update_wikidata_units">Fetch units from <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wikidata.py">git://searx/engines/wikidata.py</a> engine.</p>
+<p>Output file: <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/wikidata_units.json">git://searx/data/wikidata_units.json</a> (<a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/data-update.yml">CI Update data
+…</a>).</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../../index.html">
+ <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../plugins.html">Plugins</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../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="../reST.html">reST primer</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a><ul class="current">
+<li class="toctree-l3 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#update-ahmia-blacklist-py"><code class="docutils literal notranslate"><span class="pre">update_ahmia_blacklist.py</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#update-currencies-py"><code class="docutils literal notranslate"><span class="pre">update_currencies.py</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#update-engine-descriptions-py"><code class="docutils literal notranslate"><span class="pre">update_engine_descriptions.py</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_engine_descriptions.get_output"><code class="docutils literal notranslate"><span class="pre">get_output()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#update-external-bangs-py"><code class="docutils literal notranslate"><span class="pre">update_external_bangs.py</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_external_bangs.merge_when_no_leaf"><code class="docutils literal notranslate"><span class="pre">merge_when_no_leaf()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_external_bangs.BANGS_URL"><code class="docutils literal notranslate"><span class="pre">BANGS_URL</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#update-firefox-version-py"><code class="docutils literal notranslate"><span class="pre">update_firefox_version.py</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#update-engine-traits-py"><code class="docutils literal notranslate"><span class="pre">update_engine_traits.py</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_engine_traits.UnicodeEscape"><code class="docutils literal notranslate"><span class="pre">UnicodeEscape</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_engine_traits.fetch_traits_map"><code class="docutils literal notranslate"><span class="pre">fetch_traits_map()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_engine_traits.filter_locales"><code class="docutils literal notranslate"><span class="pre">filter_locales()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_engine_traits.get_unicode_flag"><code class="docutils literal notranslate"><span class="pre">get_unicode_flag()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#update-osm-keys-tags-py"><code class="docutils literal notranslate"><span class="pre">update_osm_keys_tags.py</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#update-pygments-py"><code class="docutils literal notranslate"><span class="pre">update_pygments.py</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_pygments.Formatter"><code class="docutils literal notranslate"><span class="pre">Formatter</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#update-locales-py"><code class="docutils literal notranslate"><span class="pre">update_locales.py</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searxng_extra.update.update_locales.get_locale_descr"><code class="docutils literal notranslate"><span class="pre">get_locale_descr()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#update-wikidata-units-py"><code class="docutils literal notranslate"><span class="pre">update_wikidata_units.py</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="standalone_searx.py.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../../index.html">Overview</a>
+ <ul>
+ <li><a href="../index.html">Developer documentation</a>
+ <ul>
+ <li><a href="index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a>
+ <ul>
+ <li>Previous: <a href="index.html" title="previous chapter">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a>
+ <li>Next: <a href="standalone_searx.py.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a></ul>
+ </li></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../../_sources/dev/searxng_extra/update.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/dev/translation.html b/dev/translation.html
new file mode 100644
index 000000000..786d4a0ae
--- /dev/null
+++ b/dev/translation.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Translation &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Developing in Linux Containers" href="lxcdev.html" />
+ <link rel="prev" title="Plugins" href="plugins.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="lxcdev.html" title="Developing in Linux Containers"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="plugins.html" title="Plugins"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Developer documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Translation</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="translation">
+<span id="id1"></span><h1>Translation<a class="headerlink" href="#translation" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title"><a class="reference external" href="https://translate.codeberg.org/projects/searxng/"><img alt="translated" src="https://translate.codeberg.org/widgets/searxng/-/searxng/svg-badge.svg" /></a></p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../src/searx.babel_extract.html#searx-babel-extract"><span class="std std-ref">Custom message extractor (i18n)</span></a></p></li>
+<li><p><a class="reference external" href="https://docs.weblate.org">Weblate</a></p></li>
+<li><p>SearXNG <a class="reference external" href="https://github.com/searxng/searxng/tree/translations">translations branch</a></p></li>
+<li><p>SearXNG <a class="reference external" href="https://translate.codeberg.org/projects/searxng/searxng/#repository">Weblate repository</a></p></li>
+<li><p>Weblate Client: <a class="reference external" href="https://docs.weblate.org/en/latest/wlc.html">wlc</a></p></li>
+<li><p>Babel Command-Line: <a class="reference external" href="http://babel.pocoo.org/en/latest/cmdline.html">pybabel</a></p></li>
+<li><p><a class="reference external" href="https://docs.weblate.org/en/latest/workflows.html">weblate workflow</a></p></li>
+</ul>
+</aside>
+<p>Translation takes place on <a class="reference external" href="https://translate.codeberg.org/projects/searxng/">translate.codeberg.org</a>.</p>
+<p>Translations which has been added by translators on the <a class="reference external" href="https://translate.codeberg.org/projects/searxng/">translate.codeberg.org</a> UI are
+committed to Weblate’s counterpart of the SearXNG <em>origin</em> repository which is
+located at <code class="docutils literal notranslate"><span class="pre">https://translate.codeberg.org/git/searxng/searxng</span></code>.</p>
+<p>There is no need to clone this repository, <a class="reference internal" href="#searxng-weblate-workflow"><span class="std std-ref">SearXNG’s PR workflow to be in sync with Weblate</span></a> take
+care of the synchronization with the <em>origin</em>. To avoid merging commits from
+the counterpart directly on the <code class="docutils literal notranslate"><span class="pre">master</span></code> branch of <em>SearXNG origin</em>, a <em>pull
+request</em> (PR) is created by this workflow.</p>
+<p>Weblate monitors the <a class="reference external" href="https://github.com/searxng/searxng/tree/translations">translations branch</a>, not the <code class="docutils literal notranslate"><span class="pre">master</span></code> branch. This
+branch is an <a class="reference external" href="https://git-scm.com/docs/git-checkout#Documentation/git-checkout.txt---orphanltnewbranchgt">orphan branch</a>, decoupled from the master branch (we already know
+orphan branches from the <code class="docutils literal notranslate"><span class="pre">gh-pages</span></code>). The <a class="reference external" href="https://github.com/searxng/searxng/tree/translations">translations branch</a> contains
+only the</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">translation/messages.pot</span></code> and the</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">translation/*/messages.po</span></code> files, nothing else.</p></li>
+</ul>
+<figure class="align-default" id="id3">
+<span id="searxng-weblate-workflow"></span><img alt="../_images/translation.svg" src="../_images/translation.svg" /><figcaption>
+<p><span class="caption-number">Fig. 3 </span><span class="caption-text">SearXNG’s PR workflow to be in sync with Weblate</span><a class="headerlink" href="#id3" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+<dl class="simple">
+<dt>Sync from <em>origin</em> to <em>weblate</em>: using <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">weblate.push.translations</span></code></dt><dd><p>For each commit on the <code class="docutils literal notranslate"><span class="pre">master</span></code> branch of SearXNG <em>origin</em> the GitHub job
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/integration.yml">babel / Update translations branch</a> checks for updated translations.</p>
+</dd>
+<dt>Sync from <em>weblate</em> to <em>origin</em>: using <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">weblate.translations.commit</span></code></dt><dd><p>Every Friday, the GitHub workflow <a class="reference external" href="https://github.com/searxng/searxng/blob/master/.github/workflows/translations-update.yml">babel / create PR for additions from
+weblate</a> creates a PR with the
+updated translation files:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">translation/messages.pot</span></code>,</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">translation/*/messages.po</span></code> and</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">translation/*/messages.mo</span></code></p></li>
+</ul>
+</dd>
+</dl>
+<section id="id2">
+<h2>wlc<a class="headerlink" href="#id2" title="Link to this heading">¶</a></h2>
+<p>All weblate integration is done by GitHub workflows, but if you want to use <a class="reference external" href="https://docs.weblate.org/en/latest/wlc.html">wlc</a>,
+copy this content into <a class="reference external" href="https://docs.weblate.org/en/latest/wlc.html#wlc-config">wlc configuration</a> in your HOME <code class="docutils literal notranslate"><span class="pre">~/.config/weblate</span></code></p>
+<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[keys]</span>
+<span class="na">https</span><span class="o">:</span><span class="s">//translate.codeberg.org/api/ = APIKEY</span>
+</pre></div>
+</div>
+<p>Replace <code class="docutils literal notranslate"><span class="pre">APIKEY</span></code> by your <a class="reference external" href="https://translate.codeberg.org/accounts/profile/#api">API key</a>.</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developer documentation</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Development Quickstart</a></li>
+<li class="toctree-l2"><a class="reference internal" href="rtm_asdf.html">Runtime Management</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contribution_guide.html">How to contribute</a></li>
+<li class="toctree-l2"><a class="reference internal" href="engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="plugins.html">Plugins</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Translation</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#id2">wlc</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="lxcdev.html">Developing in Linux Containers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="reST.html">reST primer</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Developer documentation</a>
+ <ul>
+ <li>Previous: <a href="plugins.html" title="previous chapter">Plugins</a>
+ <li>Next: <a href="lxcdev.html" title="next chapter">Developing in Linux Containers</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/dev/translation.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/genindex.html b/genindex.html
new file mode 100644
index 000000000..e13e3d298
--- /dev/null
+++ b/genindex.html
@@ -0,0 +1,2088 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Index &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=a5c4661c" />
+ <script src="_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="_static/doctools.js?v=9a2dae69"></script>
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="#" />
+ <link rel="search" title="Search" href="search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="#" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Index</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+
+<h1 id="index">Index</h1>
+
+<div class="genindex-jumpbox">
+ <a href="#A"><strong>A</strong></a>
+ | <a href="#B"><strong>B</strong></a>
+ | <a href="#C"><strong>C</strong></a>
+ | <a href="#D"><strong>D</strong></a>
+ | <a href="#E"><strong>E</strong></a>
+ | <a href="#F"><strong>F</strong></a>
+ | <a href="#G"><strong>G</strong></a>
+ | <a href="#H"><strong>H</strong></a>
+ | <a href="#I"><strong>I</strong></a>
+ | <a href="#J"><strong>J</strong></a>
+ | <a href="#L"><strong>L</strong></a>
+ | <a href="#M"><strong>M</strong></a>
+ | <a href="#N"><strong>N</strong></a>
+ | <a href="#O"><strong>O</strong></a>
+ | <a href="#P"><strong>P</strong></a>
+ | <a href="#Q"><strong>Q</strong></a>
+ | <a href="#R"><strong>R</strong></a>
+ | <a href="#S"><strong>S</strong></a>
+ | <a href="#T"><strong>T</strong></a>
+ | <a href="#U"><strong>U</strong></a>
+ | <a href="#V"><strong>V</strong></a>
+ | <a href="#W"><strong>W</strong></a>
+ | <a href="#Z"><strong>Z</strong></a>
+
+</div>
+<h2 id="A">A</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/annas_archive.html#searx.engines.annas_archive.aa_content">aa_content (in module searx.engines.annas_archive)</a>
+</li>
+ <li><a href="dev/engines/online/annas_archive.html#searx.engines.annas_archive.aa_ext">aa_ext (in module searx.engines.annas_archive)</a>
+</li>
+ <li><a href="dev/engines/online/annas_archive.html#searx.engines.annas_archive.aa_sort">aa_sort (in module searx.engines.annas_archive)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.about">about (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.ADDITIONAL_TRANSLATIONS">ADDITIONAL_TRANSLATIONS (in module searx.locales)</a>
+</li>
+ <li><a href="src/searx.plugins.unit_converter.html#searx.plugins.unit_converter.ADDITIONAL_UNITS">ADDITIONAL_UNITS (in module searx.plugins.unit_converter)</a>
+</li>
+ <li><a href="src/searx.plugins.unit_converter.html#searx.plugins.unit_converter.ALIAS_SYMBOLS">ALIAS_SYMBOLS (in module searx.plugins.unit_converter)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.all_locale">all_locale (searx.enginelib.traits.EngineTraits attribute)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/seekr.html#searx.engines.seekr.api_key">api_key (in module searx.engines.seekr)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/wallhaven.html#searx.engines.wallhaven.api_key">(in module searx.engines.wallhaven)</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.API_MAX">API_MAX (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="dev/engines/online/qwant.html#searx.engines.qwant.api_url">api_url (in module searx.engines.qwant)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.API_WONDOW">API_WONDOW (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="dev/engines/online/void.html#searx.engines.voidlinux.ARCH_RE">ARCH_RE (in module searx.engines.voidlinux)</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo_definitions.area_to_str">area_to_str() (in module searx.engines.duckduckgo_definitions)</a>
+</li>
+ <li><a href="dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.assign_headers">assign_headers() (in module searx.engines.mullvad_leta)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="B">B</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/piped.html#searx.engines.piped.backend_url">backend_url (in module searx.engines.piped)</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_external_bangs.BANGS_URL">BANGS_URL (in module searxng_extra.update.update_external_bangs)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing.base_url">base_url (in module searx.engines.bing)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_images.base_url">(in module searx.engines.bing_images)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_news.base_url">(in module searx.engines.bing_news)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_videos.base_url">(in module searx.engines.bing_videos)</a>
+</li>
+ <li><a href="dev/engines/online/lemmy.html#searx.engines.lemmy.base_url">(in module searx.engines.lemmy)</a>
+</li>
+ <li><a href="dev/engines/mediawiki.html#searx.engines.mediawiki.base_url">(in module searx.engines.mediawiki)</a>
+</li>
+ <li><a href="dev/engines/online/peertube.html#searx.engines.peertube.base_url">(in module searx.engines.peertube)</a>
+</li>
+ <li><a href="dev/engines/online/yacy.html#searx.engines.yacy.base_url">(in module searx.engines.yacy)</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_lists.block_ip">block_ip() (in module searx.botdetection.ip_lists)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/brave.html#searx.engines.brave.brave_spellcheck">brave_spellcheck (in module searx.engines.brave)</a>
+</li>
+ <li><a href="dev/engines/online/bt4g.html#searx.engines.bt4g.bt4g_category">bt4g_category (in module searx.engines.bt4g)</a>
+</li>
+ <li><a href="dev/engines/online/bt4g.html#searx.engines.bt4g.bt4g_order_by">bt4g_order_by (in module searx.engines.bt4g)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.build_engine_locales">build_engine_locales() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/engines/online/torznab.html#searx.engines.torznab.build_result">build_result() (in module searx.engines.torznab)</a>
+</li>
+ <li>
+ built-in function
+
+ <ul>
+ <li><a href="dev/plugins.html#on_result">on_result()</a>
+</li>
+ <li><a href="dev/plugins.html#post_search">post_search()</a>
+</li>
+ <li><a href="dev/plugins.html#pre_search">pre_search()</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.BURST_MAX">BURST_MAX (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.BURST_MAX_SUSPICIOUS">BURST_MAX_SUSPICIOUS (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.BURST_WINDOW">BURST_WINDOW (in module searx.botdetection.ip_limit)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="C">C</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.cache_vqd">cache_vqd() (in module searx.engines.duckduckgo)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.categories">categories (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_news.ceid_list">ceid_list (in module searx.engines.google_news)</a>
+</li>
+ <li><a href="dev/engines/offline/command-line-engines.html#searx.engines.command.check_parsing_options">check_parsing_options() (in module searx.engines.command)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config">Config (class in searx.botdetection.config)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPage.content">content (searx.infopage.InfoPage property)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.content_xpath">content_xpath (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.convert_str_to_int">convert_str_to_int() (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.cookies">cookies (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.copy">copy() (searx.enginelib.traits.EngineTraits method)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.custom">custom (searx.enginelib.traits.EngineTraits attribute)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="D">D</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.data_type">data_type (searx.enginelib.traits.EngineTraits attribute)</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo_extra.ddg_category">ddg_category (in module searx.engines.duckduckgo_extra)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config.default">default() (searx.botdetection.config.Config method)</a>
+
+ <ul>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsEncoder.default">(searx.enginelib.traits.EngineTraitsEncoder method)</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online.default_request_params">default_request_params() (in module searx.search.processors.online)</a>
+</li>
+ <li><a href="src/searx.plugins.tor_check.html#searx.plugins.tor_check.description">description (in module searx.plugins.tor_check)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_scholar.detect_google_captcha">detect_google_captcha() (in module searx.engines.google_scholar)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.utils.html#searx.utils.detect_language">detect_language() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.dict_subset">dict_subset() (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.disabled">disabled (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.display_error_messages">display_error_messages (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikidata.display_type">display_type (in module searx.engines.wikidata)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.display_type">(in module searx.engines.wikipedia)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/online_url_search/tineye.html#searx.engines.tineye.DOWNLOAD_ERROR">DOWNLOAD_ERROR (in module searx.engines.tineye)</a>
+</li>
+ <li><a href="src/searx.redislib.html#searx.redislib.drop_counter">drop_counter() (in module searx.redislib)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="E">E</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.utils.html#searx.utils.ecma_unescape">ecma_unescape() (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.enable_http">enable_http (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine">Engine (class in searx.enginelib)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.engine">engine (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/engines.html#searx.engines.engine_shortcuts">engine_shortcuts (in module searx.engines)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE">ENGINE_TRAITS_FILE (searx.enginelib.traits.EngineTraitsMap attribute)</a>
+</li>
+ <li><a href="dev/engines/online_url_search/tineye.html#searx.engines.tineye.engine_type">engine_type (in module searx.engines.tineye)</a>
+
+ <ul>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.engine_type">(searx.enginelib.Engine attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.abstract.EngineProcessor">EngineProcessor (class in searx.search.processors.abstract)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.search.html#searx.search.EngineRef">EngineRef (class in searx.search)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits">EngineTraits (class in searx.enginelib.traits)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsEncoder">EngineTraitsEncoder (class in searx.enginelib.traits)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap">EngineTraitsMap (class in searx.enginelib.traits)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.eval_xpath">eval_xpath() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.eval_xpath_getindex">eval_xpath_getindex() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.eval_xpath_list">eval_xpath_list() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.babel_extract.html#searx.babel_extract.extract">extract() (in module searx.babel_extract)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.extract_text">extract_text() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.extract_url">extract_url() (in module searx.utils)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="F">F</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/dailymotion.html#searx.engines.dailymotion.family_filter_map">family_filter_map (in module searx.engines.dailymotion)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.fetch_traits">fetch_traits (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/online/annas_archive.html#searx.engines.annas_archive.fetch_traits">fetch_traits() (in module searx.engines.annas_archive)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/archlinux.html#searx.engines.archlinux.fetch_traits">(in module searx.engines.archlinux)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing.fetch_traits">(in module searx.engines.bing)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_news.fetch_traits">(in module searx.engines.bing_news)</a>
+</li>
+ <li><a href="dev/engines/online/brave.html#searx.engines.brave.fetch_traits">(in module searx.engines.brave)</a>
+</li>
+ <li><a href="dev/engines/online/dailymotion.html#searx.engines.dailymotion.fetch_traits">(in module searx.engines.dailymotion)</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.fetch_traits">(in module searx.engines.duckduckgo)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google.fetch_traits">(in module searx.engines.google)</a>
+</li>
+ <li><a href="dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.fetch_traits">(in module searx.engines.mullvad_leta)</a>
+</li>
+ <li><a href="dev/engines/online/odysee.html#searx.engines.odysee.fetch_traits">(in module searx.engines.odysee)</a>
+</li>
+ <li><a href="dev/engines/online/peertube.html#searx.engines.peertube.fetch_traits">(in module searx.engines.peertube)</a>
+</li>
+ <li><a href="dev/engines/online/radio_browser.html#searx.engines.radio_browser.fetch_traits">(in module searx.engines.radio_browser)</a>
+</li>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.fetch_traits">(in module searx.engines.startpage)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikidata.fetch_traits">(in module searx.engines.wikidata)</a>
+</li>
+ <li><a href="dev/engines/online/yahoo.html#searx.engines.yahoo.fetch_traits">(in module searx.engines.yahoo)</a>
+</li>
+ <li><a href="dev/engines/online/zlibrary.html#searx.engines.zlibrary.fetch_traits">(in module searx.engines.zlibrary)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.fetch_traits">(searx.enginelib.traits.EngineTraits class method)</a>
+</li>
+ </ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.fetch_traits_map">fetch_traits_map() (in module searxng_extra.update.update_engine_traits)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.fetch_wikimedia_traits">fetch_wikimedia_traits() (in module searx.engines.wikipedia)</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.filter_locales">filter_locales() (in module searxng_extra.update.update_engine_traits)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.first_page_num">first_page_num (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPageSet.folder">folder (searx.infopage.InfoPageSet attribute)</a>
+</li>
+ <li><a href="dev/engines/online_url_search/tineye.html#searx.engines.tineye.FORMAT_NOT_SUPPORTED">FORMAT_NOT_SUPPORTED (in module searx.engines.tineye)</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_pygments.Formatter">Formatter (class in searxng_extra.update.update_pygments)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.from_data">from_data() (searx.enginelib.traits.EngineTraitsMap class method)</a>
+</li>
+ <li><a href="dev/engines/online/piped.html#searx.engines.piped.frontend_url">frontend_url (in module searx.engines.piped)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="G">G</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.utils.html#searx.utils.gen_useragent">gen_useragent() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config.get">get() (searx.botdetection.config.Config method)</a>
+</li>
+ <li><a href="dev/engines/online/torznab.html#searx.engines.torznab.get_attribute">get_attribute() (in module searx.engines.torznab)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPage.get_ctx">get_ctx() (searx.infopage.InfoPage method)</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.get_ddg_lang">get_ddg_lang() (in module searx.engines.duckduckgo)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.get_engine_from_settings">get_engine_from_settings() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.get_engine_locale">get_engine_locale() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google.get_google_info">get_google_info() (in module searx.engines.google)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.get_language">get_language() (searx.enginelib.traits.EngineTraits method)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.get_locale">get_locale() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_locales.get_locale_descr">get_locale_descr() (in module searxng_extra.update.update_locales)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.get_network">get_network() (in module searx.botdetection)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.get_official_locales">get_official_locales() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_engine_descriptions.get_output">get_output() (in module searxng_extra.update.update_engine_descriptions)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPageSet.get_page">get_page() (searx.infopage.InfoPageSet method)</a>
+</li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.abstract.EngineProcessor.get_params">get_params() (searx.search.processors.abstract.EngineProcessor method)</a>
+
+ <ul>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online.OnlineProcessor.get_params">(searx.search.processors.online.OnlineProcessor method)</a>
+</li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params">(searx.search.processors.online_currency.OnlineCurrencyProcessor method)</a>
+</li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params">(searx.search.processors.online_dictionary.OnlineDictionaryProcessor method)</a>
+</li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params">(searx.search.processors.online_url_search.OnlineUrlSearchProcessor method)</a>
+</li>
+ </ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.get_ping_key">get_ping_key() (in module searx.botdetection.link_token)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.get_real_ip">get_real_ip() (in module searx.botdetection)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.get_region">get_region() (searx.enginelib.traits.EngineTraits method)</a>
+</li>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.get_sc_code">get_sc_code() (in module searx.engines.startpage)</a>
+</li>
+ <li><a href="dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.get_search_query">get_search_query() (in module searxng_extra.standalone_searx)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikidata.get_thumbnail">get_thumbnail() (in module searx.engines.wikidata)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.get_token">get_token() (in module searx.botdetection.link_token)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.get_torrent_size">get_torrent_size() (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/online/torznab.html#searx.engines.torznab.get_torznab_attribute">get_torznab_attribute() (in module searx.engines.torznab)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.get_translation_locales">get_translation_locales() (in module searx.locales)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.get_translations">get_translations() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.get_unicode_flag">get_unicode_flag() (in module searxng_extra.update.update_engine_traits)</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.get_vqd">get_vqd() (in module searx.engines.duckduckgo)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.get_wiki_params">get_wiki_params() (in module searx.engines.wikipedia)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.get_xpath">get_xpath() (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/online/brave.html#searx.engines.brave.Goggles">Goggles (in module searx.engines.brave)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.autocomplete.google_complete">google_complete() (in module searx.autocomplete)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="H">H</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.headers">headers (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPage.html">html (searx.infopage.InfoPage property)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.html_to_text">html_to_text() (in module searx.utils)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/yacy.html#searx.engines.yacy.http_digest_auth_pass">http_digest_auth_pass (in module searx.engines.yacy)</a>
+</li>
+ <li><a href="dev/engines/online/yacy.html#searx.engines.yacy.http_digest_auth_user">http_digest_auth_user (in module searx.engines.yacy)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.humanize_bytes">humanize_bytes() (in module searx.utils)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="I">I</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/dailymotion.html#searx.engines.dailymotion.iframe_src">iframe_src (in module searx.engines.dailymotion)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.inactive">inactive (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="src/searx.redislib.html#searx.redislib.incr_counter">incr_counter() (in module searx.redislib)</a>
+</li>
+ <li><a href="src/searx.redislib.html#searx.redislib.incr_sliding_window">incr_sliding_window() (in module searx.redislib)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPage">InfoPage (class in searx.infopage)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPageSet">InfoPageSet (class in searx.infopage)</a>
+</li>
+ <li><a href="dev/engines/online/annas_archive.html#searx.engines.annas_archive.init">init() (in module searx.engines.annas_archive)</a>
+
+ <ul>
+ <li><a href="dev/engines/demo/demo_offline.html#searx.engines.demo_offline.init">(in module searx.engines.demo_offline)</a>
+</li>
+ <li><a href="dev/engines/demo/demo_online.html#searx.engines.demo_online.init">(in module searx.engines.demo_online)</a>
+</li>
+ <li><a href="dev/engines/online/mrs.html#searx.engines.mrs.init">(in module searx.engines.mrs)</a>
+</li>
+ <li><a href="dev/engines/online/torznab.html#searx.engines.torznab.init">(in module searx.engines.torznab)</a>
+</li>
+ <li><a href="dev/engines/online/zlibrary.html#searx.engines.zlibrary.init">(in module searx.engines.zlibrary)</a>
+</li>
+ </ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="admin/searx.limiter.html#searx.limiter.initialize">initialize() (in module searx.limiter)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.int_or_zero">int_or_zero() (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo_definitions.is_broken_text">is_broken_text() (in module searx.engines.duckduckgo_definitions)</a>
+</li>
+ <li><a href="admin/searx.limiter.html#searx.limiter.is_installed">is_installed() (in module searx.limiter)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.is_locale_supported">is_locale_supported() (searx.enginelib.traits.EngineTraits method)</a>
+</li>
+ <li><a href="dev/engines/engines.html#searx.engines.is_missing_required_attributes">is_missing_required_attributes() (in module searx.engines)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.is_suspicious">is_suspicious() (in module searx.botdetection.link_token)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.is_valid_lang">is_valid_lang() (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.is_vpn_connected">is_vpn_connected() (in module searx.engines.mullvad_leta)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPageSet.iter_pages">iter_pages() (searx.infopage.InfoPageSet method)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="J">J</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.utils.html#searx.utils.js_variable_to_python">js_variable_to_python() (in module searx.utils)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.json_serial">json_serial() (in module searxng_extra.standalone_searx)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="L">L</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/yahoo.html#searx.engines.yahoo.lang2domain">lang2domain (in module searx.engines.yahoo)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.lang_all">lang_all (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.language">language (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.language_support">language_support (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.language_tag">language_tag() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.languages">languages (searx.enginelib.traits.EngineTraits attribute)</a>
+</li>
+ <li><a href="dev/engines/online/lemmy.html#searx.engines.lemmy.lemmy_type">lemmy_type (in module searx.engines.lemmy)</a>
+</li>
+ <li><a href="admin/searx.limiter.html#searx.limiter.LIMITER_CFG">LIMITER_CFG (in module searx.limiter)</a>
+</li>
+ <li><a href="admin/searx.limiter.html#searx.limiter.LIMITER_CFG_SCHEMA">LIMITER_CFG_SCHEMA (in module searx.limiter)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.list_of_wikipedias">list_of_wikipedias (in module searx.engines.wikipedia)</a>
+</li>
+ <li><a href="dev/engines/engines.html#searx.engines.load_engine">load_engine() (in module searx.engines)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/engines.html#searx.engines.load_engines">load_engines() (in module searx.engines)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.LOCALE_BEST_MATCH">LOCALE_BEST_MATCH (in module searx.locales)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPageSet.locale_default">locale_default (searx.infopage.InfoPageSet attribute)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.LOCALE_NAMES">LOCALE_NAMES (in module searx.locales)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPageSet.locales">locales (searx.infopage.InfoPageSet attribute)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.locales_initialize">locales_initialize() (in module searx.locales)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.LONG_MAX">LONG_MAX (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.LONG_MAX_SUSPICIOUS">LONG_MAX_SUSPICIOUS (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.LONG_WINDOW">LONG_WINDOW (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="src/searx.redislib.html#searx.redislib.LUA_SCRIPT_STORAGE">LUA_SCRIPT_STORAGE (in module searx.redislib)</a>
+</li>
+ <li><a href="src/searx.redislib.html#searx.redislib.lua_script_storage">lua_script_storage() (in module searx.redislib)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="M">M</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.utils.html#searx.utils.markdown_to_text">markdown_to_text() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.match_locale">match_locale() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing.max_page">max_page (in module searx.engines.bing)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/brave.html#searx.engines.brave.max_page">(in module searx.engines.brave)</a>
+</li>
+ <li><a href="dev/engines/online/qwant.html#searx.engines.qwant.max_page">(in module searx.engines.qwant)</a>
+</li>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.max_page">(in module searx.engines.startpage)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_external_bangs.merge_when_no_leaf">merge_when_no_leaf() (in module searxng_extra.update.update_external_bangs)</a>
+</li>
+ <li>
+ module
+
+ <ul>
+ <li><a href="src/searx.babel_extract.html#module-searx.babel_extract">searx.babel_extract</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection">searx.botdetection</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.config">searx.botdetection.config</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_accept">searx.botdetection.http_accept</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_accept_encoding">searx.botdetection.http_accept_encoding</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_accept_language">searx.botdetection.http_accept_language</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_connection">searx.botdetection.http_connection</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_user_agent">searx.botdetection.http_user_agent</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.ip_limit">searx.botdetection.ip_limit</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.ip_lists">searx.botdetection.ip_lists</a>
+</li>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.link_token">searx.botdetection.link_token</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#module-searx.enginelib">searx.enginelib</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#module-searx.enginelib.traits">searx.enginelib.traits</a>
+</li>
+ <li><a href="dev/engines/engines.html#module-searx.engines">searx.engines</a>
+</li>
+ <li><a href="dev/engines/online/annas_archive.html#module-searx.engines.annas_archive">searx.engines.annas_archive</a>
+</li>
+ <li><a href="dev/engines/online/archlinux.html#module-searx.engines.archlinux">searx.engines.archlinux</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing">searx.engines.bing</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing_images">searx.engines.bing_images</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing_news">searx.engines.bing_news</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing_videos">searx.engines.bing_videos</a>
+</li>
+ <li><a href="dev/engines/online/bpb.html#module-searx.engines.bpb">searx.engines.bpb</a>
+</li>
+ <li><a href="dev/engines/online/brave.html#module-searx.engines.brave">searx.engines.brave</a>
+</li>
+ <li><a href="dev/engines/online/bt4g.html#module-searx.engines.bt4g">searx.engines.bt4g</a>
+</li>
+ <li><a href="dev/engines/offline/command-line-engines.html#module-searx.engines.command">searx.engines.command</a>
+</li>
+ <li><a href="dev/engines/online/dailymotion.html#module-searx.engines.dailymotion">searx.engines.dailymotion</a>
+</li>
+ <li><a href="dev/engines/demo/demo_offline.html#module-searx.engines.demo_offline">searx.engines.demo_offline</a>
+</li>
+ <li><a href="dev/engines/demo/demo_online.html#module-searx.engines.demo_online">searx.engines.demo_online</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo">searx.engines.duckduckgo</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_definitions">searx.engines.duckduckgo_definitions</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_extra">searx.engines.duckduckgo_extra</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_weather">searx.engines.duckduckgo_weather</a>
+</li>
+ <li><a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.elasticsearch">searx.engines.elasticsearch</a>
+</li>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google">searx.engines.google</a>
+</li>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_images">searx.engines.google_images</a>
+</li>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_news">searx.engines.google_news</a>
+</li>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_scholar">searx.engines.google_scholar</a>
+</li>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_videos">searx.engines.google_videos</a>
+</li>
+ <li><a href="dev/engines/online/lemmy.html#module-searx.engines.lemmy">searx.engines.lemmy</a>
+</li>
+ <li><a href="dev/engines/online/loc.html#module-searx.engines.loc">searx.engines.loc</a>
+</li>
+ <li><a href="dev/engines/online/mastodon.html#module-searx.engines.mastodon">searx.engines.mastodon</a>
+</li>
+ <li><a href="dev/engines/mediawiki.html#module-searx.engines.mediawiki">searx.engines.mediawiki</a>
+</li>
+ <li><a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.meilisearch">searx.engines.meilisearch</a>
+</li>
+ <li><a href="dev/engines/offline/nosql-engines.html#module-searx.engines.mongodb">searx.engines.mongodb</a>
+</li>
+ <li><a href="dev/engines/online/moviepilot.html#module-searx.engines.moviepilot">searx.engines.moviepilot</a>
+</li>
+ <li><a href="dev/engines/online/mrs.html#module-searx.engines.mrs">searx.engines.mrs</a>
+</li>
+ <li><a href="dev/engines/online/mullvad_leta.html#module-searx.engines.mullvad_leta">searx.engines.mullvad_leta</a>
+</li>
+ <li><a href="dev/engines/online/mwmbl.html#module-searx.engines.mwmbl">searx.engines.mwmbl</a>
+</li>
+ <li><a href="dev/engines/offline/sql-engines.html#module-searx.engines.mysql_server">searx.engines.mysql_server</a>
+</li>
+ <li><a href="dev/engines/online/odysee.html#module-searx.engines.odysee">searx.engines.odysee</a>
+</li>
+ <li><a href="dev/engines/online/peertube.html#module-searx.engines.peertube">searx.engines.peertube</a>
+</li>
+ <li><a href="dev/engines/online/piped.html#module-searx.engines.piped">searx.engines.piped</a>
+</li>
+ <li><a href="dev/engines/offline/sql-engines.html#module-searx.engines.postgresql">searx.engines.postgresql</a>
+</li>
+ <li><a href="dev/engines/online/presearch.html#module-searx.engines.presearch">searx.engines.presearch</a>
+</li>
+ <li><a href="dev/engines/online/qwant.html#module-searx.engines.qwant">searx.engines.qwant</a>
+</li>
+ <li><a href="dev/engines/online/radio_browser.html#module-searx.engines.radio_browser">searx.engines.radio_browser</a>
+</li>
+ <li><a href="dev/engines/online/recoll.html#module-searx.engines.recoll">searx.engines.recoll</a>
+</li>
+ <li><a href="dev/engines/offline/nosql-engines.html#module-searx.engines.redis_server">searx.engines.redis_server</a>
+</li>
+ <li><a href="dev/engines/online/seekr.html#module-searx.engines.seekr">searx.engines.seekr</a>
+</li>
+ <li><a href="dev/engines/online/peertube.html#module-searx.engines.sepiasearch">searx.engines.sepiasearch</a>
+</li>
+ <li><a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.solr">searx.engines.solr</a>
+</li>
+ <li><a href="dev/engines/offline/sql-engines.html#module-searx.engines.sqlite">searx.engines.sqlite</a>
+</li>
+ <li><a href="dev/engines/online/startpage.html#module-searx.engines.startpage">searx.engines.startpage</a>
+</li>
+ <li><a href="dev/engines/online/tagesschau.html#module-searx.engines.tagesschau">searx.engines.tagesschau</a>
+</li>
+ <li><a href="dev/engines/online_url_search/tineye.html#module-searx.engines.tineye">searx.engines.tineye</a>
+</li>
+ <li><a href="dev/engines/online/torznab.html#module-searx.engines.torznab">searx.engines.torznab</a>
+</li>
+ <li><a href="dev/engines/online/void.html#module-searx.engines.voidlinux">searx.engines.voidlinux</a>
+</li>
+ <li><a href="dev/engines/online/wallhaven.html#module-searx.engines.wallhaven">searx.engines.wallhaven</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#module-searx.engines.wikidata">searx.engines.wikidata</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#module-searx.engines.wikipedia">searx.engines.wikipedia</a>
+</li>
+ <li><a href="dev/engines/xpath.html#module-searx.engines.xpath">searx.engines.xpath</a>
+</li>
+ <li><a href="dev/engines/online/yacy.html#module-searx.engines.yacy">searx.engines.yacy</a>
+</li>
+ <li><a href="dev/engines/online/yahoo.html#module-searx.engines.yahoo">searx.engines.yahoo</a>
+</li>
+ <li><a href="dev/engines/online/zlibrary.html#module-searx.engines.zlibrary">searx.engines.zlibrary</a>
+</li>
+ <li><a href="src/searx.exceptions.html#module-searx.exceptions">searx.exceptions</a>
+</li>
+ <li><a href="src/searx.infopage.html#module-searx.infopage">searx.infopage</a>
+</li>
+ <li><a href="admin/searx.limiter.html#module-searx.limiter">searx.limiter</a>
+</li>
+ <li><a href="src/searx.locales.html#module-searx.locales">searx.locales</a>
+</li>
+ <li><a href="src/searx.plugins.tor_check.html#module-searx.plugins.tor_check">searx.plugins.tor_check</a>
+</li>
+ <li><a href="src/searx.plugins.unit_converter.html#module-searx.plugins.unit_converter">searx.plugins.unit_converter</a>
+</li>
+ <li><a href="src/searx.redisdb.html#module-searx.redisdb">searx.redisdb</a>
+</li>
+ <li><a href="src/searx.redislib.html#module-searx.redislib">searx.redislib</a>
+</li>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.abstract">searx.search.processors.abstract</a>
+</li>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.offline">searx.search.processors.offline</a>
+</li>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online">searx.search.processors.online</a>
+</li>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online_currency">searx.search.processors.online_currency</a>
+</li>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online_dictionary">searx.search.processors.online_dictionary</a>
+</li>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online_url_search">searx.search.processors.online_url_search</a>
+</li>
+ <li><a href="src/searx.locales.html#module-searx.sxng_locales">searx.sxng_locales</a>
+</li>
+ <li><a href="src/searx.utils.html#module-searx.utils">searx.utils</a>
+</li>
+ <li><a href="dev/searxng_extra/standalone_searx.py.html#module-searxng_extra.standalone_searx">searxng_extra.standalone_searx</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_ahmia_blacklist">searxng_extra.update.update_ahmia_blacklist</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_currencies">searxng_extra.update.update_currencies</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_engine_descriptions">searxng_extra.update.update_engine_descriptions</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_engine_traits">searxng_extra.update.update_engine_traits</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_external_bangs">searxng_extra.update.update_external_bangs</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_firefox_version">searxng_extra.update.update_firefox_version</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_locales">searxng_extra.update.update_locales</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_osm_keys_tags">searxng_extra.update.update_osm_keys_tags</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_pygments">searxng_extra.update.update_pygments</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_wikidata_units">searxng_extra.update.update_wikidata_units</a>
+</li>
+ </ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/mwmbl.html#searx.autocomplete.mwmbl">mwmbl() (in module searx.autocomplete)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="N">N</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.plugins.tor_check.html#searx.plugins.tor_check.name">name (in module searx.plugins.tor_check)</a>
+
+ <ul>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.name">(searx.enginelib.Engine attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.no_parsed_url">no_parsed_url() (in module searxng_extra.standalone_searx)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.no_result_for_http_status">no_result_for_http_status (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/online_url_search/tineye.html#searx.engines.tineye.NO_SIGNATURE_ERROR">NO_SIGNATURE_ERROR (in module searx.engines.tineye)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.normalize_url">normalize_url() (in module searx.utils)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="O">O</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.offline.OfflineProcessor">OfflineProcessor (class in searx.search.processors.offline)</a>
+</li>
+ <li><a href="src/searx.redisdb.html#searx.redisdb.OLD_REDIS_URL_DEFAULT_URL">OLD_REDIS_URL_DEFAULT_URL (in module searx.redisdb)</a>
+</li>
+ <li>
+ on_result()
+
+ <ul>
+ <li><a href="dev/plugins.html#on_result">built-in function</a>
+</li>
+ </ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online_currency.OnlineCurrencyProcessor">OnlineCurrencyProcessor (class in searx.search.processors.online_currency)</a>
+</li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online_dictionary.OnlineDictionaryProcessor">OnlineDictionaryProcessor (class in searx.search.processors.online_dictionary)</a>
+</li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online.OnlineProcessor">OnlineProcessor (class in searx.search.processors.online)</a>
+</li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.online_url_search.OnlineUrlSearchProcessor">OnlineUrlSearchProcessor (class in searx.search.processors.online_url_search)</a>
+</li>
+ <li><a href="src/searx.search.html#searx.search.SearchWithPlugins.ordered_plugin_list">ordered_plugin_list (searx.search.SearchWithPlugins attribute)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="P">P</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.page_size">page_size (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_news.paging">paging (in module searx.engines.bing_news)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/brave.html#searx.engines.brave.paging">(in module searx.engines.brave)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.paging">(in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.paging">(searx.enginelib.Engine attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.parse_argument">parse_argument() (in module searxng_extra.standalone_searx)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_scholar.parse_gs_a">parse_gs_a() (in module searx.engines.google_scholar)</a>
+</li>
+ <li><a href="dev/engines/online_url_search/tineye.html#searx.engines.tineye.parse_tineye_match">parse_tineye_match() (in module searx.engines.tineye)</a>
+</li>
+ <li><a href="dev/engines/online/yahoo.html#searx.engines.yahoo.parse_url">parse_url() (in module searx.engines.yahoo)</a>
+</li>
+ <li><a href="dev/engines/online/qwant.html#searx.engines.qwant.parse_web_api">parse_web_api() (in module searx.engines.qwant)</a>
+</li>
+ <li><a href="dev/engines/online/qwant.html#searx.engines.qwant.parse_web_lite">parse_web_lite() (in module searx.engines.qwant)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_lists.pass_ip">pass_ip() (in module searx.botdetection.ip_lists)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config.path">path() (searx.botdetection.config.Config method)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.ping">ping() (in module searx.botdetection.link_token)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.PING_KEY">PING_KEY (in module searx.botdetection.link_token)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.PING_LIVE_TIME">PING_LIVE_TIME (in module searx.botdetection.link_token)</a>
+</li>
+ <li><a href="dev/engines/online/piped.html#searx.engines.piped.piped_filter">piped_filter (in module searx.engines.piped)</a>
+</li>
+ <li>
+ post_search()
+
+ <ul>
+ <li><a href="dev/plugins.html#post_search">built-in function</a>
+</li>
+ </ul></li>
+ <li><a href="admin/searx.limiter.html#searx.limiter.pre_request">pre_request() (in module searx.limiter)</a>
+</li>
+ <li>
+ pre_search()
+
+ <ul>
+ <li><a href="dev/plugins.html#pre_search">built-in function</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.plugins.tor_check.html#searx.plugins.tor_check.preference_section">preference_section (in module searx.plugins.tor_check)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.proxies">proxies (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="src/searx.redislib.html#searx.redislib.purge_by_prefix">purge_by_prefix() (in module searx.redislib)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config.pyobj">pyobj() (searx.botdetection.config.Config method)</a>
+</li>
+ <li>
+ Python Enhancement Proposals
+
+ <ul>
+ <li><a href="dev/reST.html#index-1">PEP 8</a>
+</li>
+ </ul></li>
+ </ul></td>
+</tr></table>
+
+<h2 id="Q">Q</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.plugins.tor_check.html#searx.plugins.tor_check.query_examples">query_examples (in module searx.plugins.tor_check)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.plugins.tor_check.html#searx.plugins.tor_check.query_keywords">query_keywords (in module searx.plugins.tor_check)</a>
+</li>
+ <li><a href="dev/engines/online/qwant.html#searx.engines.qwant.qwant_categ">qwant_categ (in module searx.engines.qwant)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="R">R</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPage.raw_content">raw_content (searx.infopage.InfoPage property)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.region">region (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.locales.region_tag">region_tag() (in module searx.locales)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.regions">regions (searx.enginelib.traits.EngineTraits attribute)</a>
+</li>
+ <li><a href="src/searx.search.html#searx.search.SearchWithPlugins.request">request (searx.search.SearchWithPlugins attribute)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing.request">request() (in module searx.engines.bing)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_images.request">(in module searx.engines.bing_images)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_news.request">(in module searx.engines.bing_news)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_videos.request">(in module searx.engines.bing_videos)</a>
+</li>
+ <li><a href="dev/engines/demo/demo_online.html#searx.engines.demo_online.request">(in module searx.engines.demo_online)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google.request">(in module searx.engines.google)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_images.request">(in module searx.engines.google_images)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_news.request">(in module searx.engines.google_news)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_scholar.request">(in module searx.engines.google_scholar)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_videos.request">(in module searx.engines.google_videos)</a>
+</li>
+ <li><a href="dev/engines/online/peertube.html#searx.engines.peertube.request">(in module searx.engines.peertube)</a>
+</li>
+ <li><a href="dev/engines/online/qwant.html#searx.engines.qwant.request">(in module searx.engines.qwant)</a>
+</li>
+ <li><a href="dev/engines/online/peertube.html#searx.engines.sepiasearch.request">(in module searx.engines.sepiasearch)</a>
+</li>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.request">(in module searx.engines.startpage)</a>
+</li>
+ <li><a href="dev/engines/online_url_search/tineye.html#searx.engines.tineye.request">(in module searx.engines.tineye)</a>
+</li>
+ <li><a href="dev/engines/online/torznab.html#searx.engines.torznab.request">(in module searx.engines.torznab)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.request">(in module searx.engines.wikipedia)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.request">(in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/online/yahoo.html#searx.engines.yahoo.request">(in module searx.engines.yahoo)</a>
+</li>
+ </ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_images.response">response() (in module searx.engines.bing_images)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_news.response">(in module searx.engines.bing_news)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_videos.response">(in module searx.engines.bing_videos)</a>
+</li>
+ <li><a href="dev/engines/demo/demo_online.html#searx.engines.demo_online.response">(in module searx.engines.demo_online)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google.response">(in module searx.engines.google)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_images.response">(in module searx.engines.google_images)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_news.response">(in module searx.engines.google_news)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_scholar.response">(in module searx.engines.google_scholar)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_videos.response">(in module searx.engines.google_videos)</a>
+</li>
+ <li><a href="dev/engines/online/mullvad_leta.html#searx.engines.mullvad_leta.response">(in module searx.engines.mullvad_leta)</a>
+</li>
+ <li><a href="dev/engines/online_url_search/tineye.html#searx.engines.tineye.response">(in module searx.engines.tineye)</a>
+</li>
+ <li><a href="dev/engines/online/torznab.html#searx.engines.torznab.response">(in module searx.engines.torznab)</a>
+</li>
+ <li><a href="dev/engines/online/void.html#searx.engines.voidlinux.response">(in module searx.engines.voidlinux)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.response">(in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/online/yahoo.html#searx.engines.yahoo.response">(in module searx.engines.yahoo)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.rest_v1_summary_url">rest_v1_summary_url (in module searx.engines.wikipedia)</a>
+</li>
+ <li><a href="src/searx.search.html#searx.search.Search.result_container">result_container (searx.search.Search attribute)</a>
+
+ <ul>
+ <li><a href="src/searx.search.html#searx.search.SearchWithPlugins.result_container">(searx.search.SearchWithPlugins attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/online/dailymotion.html#searx.engines.dailymotion.result_fields">result_fields (in module searx.engines.dailymotion)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.results_xpath">results_xpath (in module searx.engines.xpath)</a>
+</li>
+ <li>
+ RFC
+
+ <ul>
+ <li><a href="dev/reST.html#index-0">RFC 822</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.locales.html#searx.locales.RTL_LOCALES">RTL_LOCALES (in module searx.locales)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="S">S</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.safe_search_map">safe_search_map (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.safe_search_support">safe_search_support (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing.safesearch">safesearch (in module searx.engines.bing)</a>
+
+ <ul>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.safesearch">(searx.enginelib.Engine attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/online/wallhaven.html#searx.engines.wallhaven.safesearch_map">safesearch_map (in module searx.engines.wallhaven)</a>
+</li>
+ <li><a href="dev/engines/online/dailymotion.html#searx.engines.dailymotion.safesearch_params">safesearch_params (in module searx.engines.dailymotion)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.save_data">save_data() (searx.enginelib.traits.EngineTraitsMap method)</a>
+</li>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.sc_code_cache_sec">sc_code_cache_sec (in module searx.engines.startpage)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.SchemaIssue">SchemaIssue</a>
+</li>
+ <li><a href="src/searx.search.html#searx.search.Search">Search (class in searx.search)</a>
+</li>
+ <li><a href="dev/engines/demo/demo_offline.html#searx.engines.demo_offline.search">search() (in module searx.engines.demo_offline)</a>
+
+ <ul>
+ <li><a href="src/searx.search.html#searx.search.Search.search">(searx.search.Search method)</a>
+</li>
+ <li><a href="src/searx.search.html#searx.search.SearchWithPlugins.search">(searx.search.SearchWithPlugins method)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.search_form_xpath">search_form_xpath (in module searx.engines.startpage)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.SEARCH_LANGUAGE_CODES">SEARCH_LANGUAGE_CODES (in module searx.utils)</a>
+</li>
+ <li><a href="dev/engines/online/yacy.html#searx.engines.yacy.search_mode">search_mode (in module searx.engines.yacy)</a>
+</li>
+ <li><a href="src/searx.search.html#searx.search.Search.search_query">search_query (searx.search.Search attribute)</a>
+
+ <ul>
+ <li><a href="src/searx.search.html#searx.search.SearchWithPlugins.search_query">(searx.search.SearchWithPlugins attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/mediawiki.html#searx.engines.mediawiki.search_type">search_type (in module searx.engines.mediawiki)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/presearch.html#searx.engines.presearch.search_type">(in module searx.engines.presearch)</a>
+</li>
+ <li><a href="dev/engines/online/yacy.html#searx.engines.yacy.search_type">(in module searx.engines.yacy)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/online/dailymotion.html#searx.engines.dailymotion.search_url">search_url (in module searx.engines.dailymotion)</a>
+
+ <ul>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.search_url">(in module searx.engines.xpath)</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.search.html#searx.search.SearchQuery">SearchQuery (class in searx.search)</a>
+</li>
+ <li><a href="src/searx.search.html#searx.search.SearchWithPlugins">SearchWithPlugins (class in searx.search)</a>
+</li>
+ <li>
+ searx.babel_extract
+
+ <ul>
+ <li><a href="src/searx.babel_extract.html#module-searx.babel_extract">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.config
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.config">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.http_accept
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_accept">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.http_accept_encoding
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_accept_encoding">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.http_accept_language
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_accept_language">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.http_connection
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_connection">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.http_user_agent
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.http_user_agent">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.ip_limit
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.ip_limit">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.ip_lists
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.ip_lists">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.botdetection.link_token
+
+ <ul>
+ <li><a href="src/searx.botdetection.html#module-searx.botdetection.link_token">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.enginelib
+
+ <ul>
+ <li><a href="dev/engines/enginelib.html#module-searx.enginelib">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.enginelib.traits
+
+ <ul>
+ <li><a href="dev/engines/enginelib.html#module-searx.enginelib.traits">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines
+
+ <ul>
+ <li><a href="dev/engines/engines.html#module-searx.engines">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.annas_archive
+
+ <ul>
+ <li><a href="dev/engines/online/annas_archive.html#module-searx.engines.annas_archive">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.archlinux
+
+ <ul>
+ <li><a href="dev/engines/online/archlinux.html#module-searx.engines.archlinux">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.bing
+
+ <ul>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.bing_images
+
+ <ul>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing_images">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.bing_news
+
+ <ul>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing_news">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.bing_videos
+
+ <ul>
+ <li><a href="dev/engines/online/bing.html#module-searx.engines.bing_videos">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.bpb
+
+ <ul>
+ <li><a href="dev/engines/online/bpb.html#module-searx.engines.bpb">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.brave
+
+ <ul>
+ <li><a href="dev/engines/online/brave.html#module-searx.engines.brave">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.bt4g
+
+ <ul>
+ <li><a href="dev/engines/online/bt4g.html#module-searx.engines.bt4g">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.command
+
+ <ul>
+ <li><a href="dev/engines/offline/command-line-engines.html#module-searx.engines.command">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.dailymotion
+
+ <ul>
+ <li><a href="dev/engines/online/dailymotion.html#module-searx.engines.dailymotion">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.demo_offline
+
+ <ul>
+ <li><a href="dev/engines/demo/demo_offline.html#module-searx.engines.demo_offline">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.demo_online
+
+ <ul>
+ <li><a href="dev/engines/demo/demo_online.html#module-searx.engines.demo_online">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.duckduckgo
+
+ <ul>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.duckduckgo_definitions
+
+ <ul>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_definitions">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.duckduckgo_extra
+
+ <ul>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_extra">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.duckduckgo_weather
+
+ <ul>
+ <li><a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_weather">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.elasticsearch
+
+ <ul>
+ <li><a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.elasticsearch">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.google
+
+ <ul>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.google_images
+
+ <ul>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_images">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.google_news
+
+ <ul>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_news">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.google_scholar
+
+ <ul>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_scholar">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.google_videos
+
+ <ul>
+ <li><a href="dev/engines/online/google.html#module-searx.engines.google_videos">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.lemmy
+
+ <ul>
+ <li><a href="dev/engines/online/lemmy.html#module-searx.engines.lemmy">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.loc
+
+ <ul>
+ <li><a href="dev/engines/online/loc.html#module-searx.engines.loc">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.mastodon
+
+ <ul>
+ <li><a href="dev/engines/online/mastodon.html#module-searx.engines.mastodon">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.mediawiki
+
+ <ul>
+ <li><a href="dev/engines/mediawiki.html#module-searx.engines.mediawiki">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.meilisearch
+
+ <ul>
+ <li><a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.meilisearch">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.mongodb
+
+ <ul>
+ <li><a href="dev/engines/offline/nosql-engines.html#module-searx.engines.mongodb">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.moviepilot
+
+ <ul>
+ <li><a href="dev/engines/online/moviepilot.html#module-searx.engines.moviepilot">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.mrs
+
+ <ul>
+ <li><a href="dev/engines/online/mrs.html#module-searx.engines.mrs">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.mullvad_leta
+
+ <ul>
+ <li><a href="dev/engines/online/mullvad_leta.html#module-searx.engines.mullvad_leta">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.mwmbl
+
+ <ul>
+ <li><a href="dev/engines/online/mwmbl.html#module-searx.engines.mwmbl">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.mysql_server
+
+ <ul>
+ <li><a href="dev/engines/offline/sql-engines.html#module-searx.engines.mysql_server">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.odysee
+
+ <ul>
+ <li><a href="dev/engines/online/odysee.html#module-searx.engines.odysee">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.peertube
+
+ <ul>
+ <li><a href="dev/engines/online/peertube.html#module-searx.engines.peertube">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.piped
+
+ <ul>
+ <li><a href="dev/engines/online/piped.html#module-searx.engines.piped">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.postgresql
+
+ <ul>
+ <li><a href="dev/engines/offline/sql-engines.html#module-searx.engines.postgresql">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.presearch
+
+ <ul>
+ <li><a href="dev/engines/online/presearch.html#module-searx.engines.presearch">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.qwant
+
+ <ul>
+ <li><a href="dev/engines/online/qwant.html#module-searx.engines.qwant">module</a>
+</li>
+ </ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li>
+ searx.engines.radio_browser
+
+ <ul>
+ <li><a href="dev/engines/online/radio_browser.html#module-searx.engines.radio_browser">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.recoll
+
+ <ul>
+ <li><a href="dev/engines/online/recoll.html#module-searx.engines.recoll">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.redis_server
+
+ <ul>
+ <li><a href="dev/engines/offline/nosql-engines.html#module-searx.engines.redis_server">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.seekr
+
+ <ul>
+ <li><a href="dev/engines/online/seekr.html#module-searx.engines.seekr">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.sepiasearch
+
+ <ul>
+ <li><a href="dev/engines/online/peertube.html#module-searx.engines.sepiasearch">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.solr
+
+ <ul>
+ <li><a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.solr">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.sqlite
+
+ <ul>
+ <li><a href="dev/engines/offline/sql-engines.html#module-searx.engines.sqlite">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.startpage
+
+ <ul>
+ <li><a href="dev/engines/online/startpage.html#module-searx.engines.startpage">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.tagesschau
+
+ <ul>
+ <li><a href="dev/engines/online/tagesschau.html#module-searx.engines.tagesschau">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.tineye
+
+ <ul>
+ <li><a href="dev/engines/online_url_search/tineye.html#module-searx.engines.tineye">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.torznab
+
+ <ul>
+ <li><a href="dev/engines/online/torznab.html#module-searx.engines.torznab">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.voidlinux
+
+ <ul>
+ <li><a href="dev/engines/online/void.html#module-searx.engines.voidlinux">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.wallhaven
+
+ <ul>
+ <li><a href="dev/engines/online/wallhaven.html#module-searx.engines.wallhaven">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.wikidata
+
+ <ul>
+ <li><a href="dev/engines/online/wikipedia.html#module-searx.engines.wikidata">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.wikipedia
+
+ <ul>
+ <li><a href="dev/engines/online/wikipedia.html#module-searx.engines.wikipedia">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.xpath
+
+ <ul>
+ <li><a href="dev/engines/xpath.html#module-searx.engines.xpath">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.yacy
+
+ <ul>
+ <li><a href="dev/engines/online/yacy.html#module-searx.engines.yacy">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.yahoo
+
+ <ul>
+ <li><a href="dev/engines/online/yahoo.html#module-searx.engines.yahoo">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.engines.zlibrary
+
+ <ul>
+ <li><a href="dev/engines/online/zlibrary.html#module-searx.engines.zlibrary">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.exceptions
+
+ <ul>
+ <li><a href="src/searx.exceptions.html#module-searx.exceptions">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.infopage
+
+ <ul>
+ <li><a href="src/searx.infopage.html#module-searx.infopage">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.limiter
+
+ <ul>
+ <li><a href="admin/searx.limiter.html#module-searx.limiter">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.locales
+
+ <ul>
+ <li><a href="src/searx.locales.html#module-searx.locales">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.plugins.tor_check
+
+ <ul>
+ <li><a href="src/searx.plugins.tor_check.html#module-searx.plugins.tor_check">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.plugins.unit_converter
+
+ <ul>
+ <li><a href="src/searx.plugins.unit_converter.html#module-searx.plugins.unit_converter">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.redisdb
+
+ <ul>
+ <li><a href="src/searx.redisdb.html#module-searx.redisdb">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.redislib
+
+ <ul>
+ <li><a href="src/searx.redislib.html#module-searx.redislib">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.search.processors.abstract
+
+ <ul>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.abstract">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.search.processors.offline
+
+ <ul>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.offline">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.search.processors.online
+
+ <ul>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.search.processors.online_currency
+
+ <ul>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online_currency">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.search.processors.online_dictionary
+
+ <ul>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online_dictionary">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.search.processors.online_url_search
+
+ <ul>
+ <li><a href="src/searx.search.processors.html#module-searx.search.processors.online_url_search">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.sxng_locales
+
+ <ul>
+ <li><a href="src/searx.locales.html#module-searx.sxng_locales">module</a>
+</li>
+ </ul></li>
+ <li>
+ searx.utils
+
+ <ul>
+ <li><a href="src/searx.utils.html#module-searx.utils">module</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.utils.html#searx.utils.searx_useragent">searx_useragent() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineAccessDeniedException">SearxEngineAccessDeniedException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineAPIException">SearxEngineAPIException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineCaptchaException">SearxEngineCaptchaException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineException">SearxEngineException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineResponseException">SearxEngineResponseException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineTooManyRequestsException">SearxEngineTooManyRequestsException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineXPathException">SearxEngineXPathException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxException">SearxException</a>
+</li>
+ <li>
+ searxng_extra.standalone_searx
+
+ <ul>
+ <li><a href="dev/searxng_extra/standalone_searx.py.html#module-searxng_extra.standalone_searx">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_ahmia_blacklist
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_ahmia_blacklist">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_currencies
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_currencies">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_engine_descriptions
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_engine_descriptions">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_engine_traits
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_engine_traits">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_external_bangs
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_external_bangs">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_firefox_version
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_firefox_version">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_locales
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_locales">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_osm_keys_tags
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_osm_keys_tags">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_pygments
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_pygments">module</a>
+</li>
+ </ul></li>
+ <li>
+ searxng_extra.update.update_wikidata_units
+
+ <ul>
+ <li><a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_wikidata_units">module</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_lists.SEARXNG_ORG">SEARXNG_ORG (in module searx.botdetection.ip_lists)</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxParameterException">SearxParameterException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxSettingsException">SearxSettingsException</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxXPathSyntaxException">SearxXPathSyntaxException</a>
+</li>
+ <li><a href="src/searx.redislib.html#searx.redislib.secret_hash">secret_hash() (in module searx.redislib)</a>
+</li>
+ <li><a href="dev/engines/online/seekr.html#searx.engines.seekr.seekr_category">seekr_category (in module searx.engines.seekr)</a>
+</li>
+ <li><a href="dev/engines/online/duckduckgo.html#searx.engines.duckduckgo.send_accept_language_header">send_accept_language_header (in module searx.engines.duckduckgo)</a>
+
+ <ul>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.send_accept_language_header">(in module searx.engines.startpage)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.send_accept_language_header">(in module searx.engines.wikipedia)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.send_accept_language_header">(searx.enginelib.Engine attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config.set">set() (searx.botdetection.config.Config method)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraits.set_traits">set_traits() (searx.enginelib.traits.EngineTraits method)</a>
+
+ <ul>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.traits.EngineTraitsMap.set_traits">(searx.enginelib.traits.EngineTraitsMap method)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.shortcut">shortcut (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.soft_max_redirects">soft_max_redirects (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/offline/sql-engines.html#searx.engines.sqlite.sqlite_cursor">sqlite_cursor() (in module searx.engines.sqlite)</a>
+</li>
+ <li><a href="dev/engines/mediawiki.html#searx.engines.mediawiki.srenablerewrites">srenablerewrites (in module searx.engines.mediawiki)</a>
+</li>
+ <li><a href="dev/engines/mediawiki.html#searx.engines.mediawiki.srprop">srprop (in module searx.engines.mediawiki)</a>
+</li>
+ <li><a href="dev/engines/mediawiki.html#searx.engines.mediawiki.srsort">srsort (in module searx.engines.mediawiki)</a>
+</li>
+ <li><a href="dev/engines/online/startpage.html#searx.engines.startpage.startpage_categ">startpage_categ (in module searx.engines.startpage)</a>
+</li>
+ <li><a href="dev/engines/online/radio_browser.html#searx.engines.radio_browser.station_filters">station_filters (in module searx.engines.radio_browser)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.suggestion_xpath">suggestion_xpath (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineAccessDeniedException.SUSPEND_TIME_SETTING">SUSPEND_TIME_SETTING (searx.exceptions.SearxEngineAccessDeniedException attribute)</a>
+
+ <ul>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineCaptchaException.SUSPEND_TIME_SETTING">(searx.exceptions.SearxEngineCaptchaException attribute)</a>
+</li>
+ <li><a href="src/searx.exceptions.html#searx.exceptions.SearxEngineTooManyRequestsException.SUSPEND_TIME_SETTING">(searx.exceptions.SearxEngineTooManyRequestsException attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="src/searx.search.processors.html#searx.search.processors.abstract.SuspendedStatus">SuspendedStatus (class in searx.search.processors.abstract)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.SUSPICIOUS_IP_MAX">SUSPICIOUS_IP_MAX (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW">SUSPICIOUS_IP_WINDOW (in module searx.botdetection.ip_limit)</a>
+</li>
+ <li><a href="src/searx.locales.html#searx.sxng_locales.sxng_locales">sxng_locales (in module searx.sxng_locales)</a>
+</li>
+ <li><a href="src/searx.plugins.unit_converter.html#searx.plugins.unit_converter.symbol_to_si">symbol_to_si() (in module searx.plugins.unit_converter)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="T">T</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.thumbnail_xpath">thumbnail_xpath (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/online/bing.html#searx.engines.bing_news.time_map">time_map (in module searx.engines.bing_news)</a>
+</li>
+ <li><a href="dev/engines/online/google.html#searx.engines.google_scholar.time_range_args">time_range_args() (in module searx.engines.google_scholar)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.time_range_map">time_range_map (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/online/brave.html#searx.engines.brave.time_range_support">time_range_support (in module searx.engines.brave)</a>
+
+ <ul>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.time_range_support">(in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.time_range_support">(searx.enginelib.Engine attribute)</a>
+</li>
+ </ul></li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.time_range_url">time_range_url (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.timeout">timeout (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/mediawiki.html#searx.engines.mediawiki.timestamp_format">timestamp_format (in module searx.engines.mediawiki)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPage.title">title (searx.infopage.InfoPage property)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.title_xpath">title_xpath (in module searx.engines.xpath)</a>
+</li>
+ <li><a href="dev/searxng_extra/standalone_searx.py.html#searxng_extra.standalone_searx.to_dict">to_dict() (in module searxng_extra.standalone_searx)</a>
+</li>
+ <li><a href="src/searx.utils.html#searx.utils.to_string">to_string() (in module searx.utils)</a>
+</li>
+ <li><a href="src/searx.infopage.html#searx.infopage.InfoPageSet.toc">toc (searx.infopage.InfoPageSet attribute)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.TOKEN_KEY">TOKEN_KEY (in module searx.botdetection.link_token)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.link_token.TOKEN_LIVE_TIME">TOKEN_LIVE_TIME (in module searx.botdetection.link_token)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.tokens">tokens (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.too_many_requests">too_many_requests() (in module searx.botdetection)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.traits">traits (searx.enginelib.Engine attribute)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="U">U</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/google.html#searx.engines.google.UI_ASYNC">UI_ASYNC (in module searx.engines.google)</a>
+</li>
+ <li><a href="dev/searxng_extra/update.html#searxng_extra.update.update_engine_traits.UnicodeEscape">UnicodeEscape (class in searxng_extra.update.update_engine_traits)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config.update">update() (searx.botdetection.config.Config method)</a>
+</li>
+ <li><a href="dev/engines/xpath.html#searx.engines.xpath.url_xpath">url_xpath (in module searx.engines.xpath)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/tagesschau.html#searx.engines.tagesschau.use_source_url">use_source_url (in module searx.engines.tagesschau)</a>
+</li>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.http_user_agent.USER_AGENT">USER_AGENT (in module searx.botdetection.http_user_agent)</a>
+</li>
+ <li><a href="dev/engines/enginelib.html#searx.enginelib.Engine.using_tor_proxy">using_tor_proxy (searx.enginelib.Engine attribute)</a>
+</li>
+ <li><a href="dev/engines/engines.html#searx.engines.using_tor_proxy">using_tor_proxy() (in module searx.engines)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="V">V</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="src/searx.botdetection.html#searx.botdetection.config.Config.validate">validate() (searx.botdetection.config.Config method)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/peertube.html#searx.engines.peertube.video_response">video_response() (in module searx.engines.peertube)</a>
+</li>
+ <li><a href="dev/engines/online/void.html#searx.engines.voidlinux.void_arch">void_arch (in module searx.engines.voidlinux)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="W">W</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/qwant.html#searx.engines.qwant.web_lite_url">web_lite_url (in module searx.engines.qwant)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.wiki_lc_locale_variants">wiki_lc_locale_variants (in module searx.engines.wikipedia)</a>
+</li>
+ <li><a href="dev/engines/online/wikipedia.html#searx.engines.wikipedia.wikipedia_article_depth">wikipedia_article_depth (in module searx.engines.wikipedia)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+<h2 id="Z">Z</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/zlibrary.html#searx.engines.zlibrary.zlib_ext">zlib_ext (in module searx.engines.zlibrary)</a>
+</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="dev/engines/online/zlibrary.html#searx.engines.zlibrary.zlib_year_from">zlib_year_from (in module searx.engines.zlibrary)</a>
+</li>
+ <li><a href="dev/engines/online/zlibrary.html#searx.engines.zlibrary.zlib_year_to">zlib_year_to (in module searx.engines.zlibrary)</a>
+</li>
+ </ul></td>
+</tr></table>
+
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="index.html">
+ <img class="logo" src="_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="index.html">Overview</a>
+
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..c726ad73f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,224 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Welcome to SearXNG &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=a5c4661c" />
+ <script src="_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="_static/doctools.js?v=9a2dae69"></script>
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="genindex.html" />
+ <link rel="search" title="Search" href="search.html" />
+ <link rel="next" title="User information" href="user/index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="user/index.html" title="User information"
+ accesskey="N">next</a> |</li>
+ <li class="nav-item nav-item-0"><a href="#">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Welcome to SearXNG</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="welcome-to-searxng">
+<h1>Welcome to SearXNG<a class="headerlink" href="#welcome-to-searxng" title="Link to this heading">¶</a></h1>
+<blockquote>
+<div><p><em>Search without being tracked.</em></p>
+</div></blockquote>
+<p>SearXNG is a free internet metasearch engine which aggregates results from more
+than 70 search services. Users are neither tracked nor profiled. Additionally,
+SearXNG can be used over Tor for online anonymity.</p>
+<p>Get started with SearXNG by using one of the instances listed at <a class="reference external" href="https://searx.space">searx.space</a>.
+If you don’t trust anyone, you can set up your own, see <a class="reference internal" href="admin/installation.html#installation"><span class="std std-ref">Installation</span></a>.</p>
+<aside class="sidebar">
+<p class="sidebar-title">features</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="admin/installation.html#installation"><span class="std std-ref">self hosted</span></a></p></li>
+<li><p><a class="reference internal" href="own-instance.html#searxng-protect-privacy"><span class="std std-ref">no user tracking / no profiling</span></a></p></li>
+<li><p>script &amp; cookies are optional</p></li>
+<li><p>secure, encrypted connections</p></li>
+<li><p><a class="reference internal" href="user/configured_engines.html#configured-engines"><span class="std std-ref">about 130 search engines</span></a></p></li>
+<li><p><a class="reference external" href="https://translate.codeberg.org/projects/searxng/searxng/">about 60 translations</a></p></li>
+<li><p>about 100 <a class="reference external" href="https://uptime.searxng.org/">well maintained</a> instances on <a class="reference external" href="https://searx.space">searx.space</a></p></li>
+<li><p><a class="reference internal" href="dev/engines/demo/demo_online.html#demo-online-engine"><span class="std std-ref">easy integration of search engines</span></a></p></li>
+<li><p>professional development: <a class="reference external" href="https://github.com/searxng/searxng/actions">CI</a>,
+<a class="reference external" href="https://dev.searxng.org/">quality assurance</a> &amp;
+<a class="reference external" href="https://dev.searxng.org/screenshots.html">automated tested UI</a></p></li>
+</ul>
+</aside>
+<aside class="sidebar">
+<p class="sidebar-title">be a part</p>
+<p>SearXNG is driven by an open community, come join us! Don’t hesitate, no
+need to be an <em>expert</em>, everyone can contribute:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://translate.codeberg.org/projects/searxng/searxng/">help to improve translations</a></p></li>
+<li><p><a class="reference external" href="https://matrix.to/#/#searxng:matrix.org">discuss with the community</a></p></li>
+<li><p>report bugs &amp; suggestions</p></li>
+<li><p>…</p></li>
+</ul>
+</aside>
+<aside class="sidebar">
+<p class="sidebar-title">the origin</p>
+<p>SearXNG development has been started in the middle of 2021 as a fork of the
+searx project.</p>
+</aside>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="user/index.html">User information</a><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><ul>
+<li class="toctree-l2"><a class="reference internal" href="own-instance.html#how-does-searxng-protect-privacy">How does SearXNG protect privacy?</a></li>
+<li class="toctree-l2"><a class="reference internal" href="own-instance.html#conclusion">Conclusion</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="admin/index.html">Administrator documentation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="admin/settings/index.html">Settings</a></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">Docker 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-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 server’s IP</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">Plugins builtin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="admin/buildhosts.html">Buildhosts</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="dev/index.html">Developer documentation</a><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/rtm_asdf.html">Runtime 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/engines/index.html">Engine Implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="dev/search_api.html">Search API</a></li>
+<li class="toctree-l2"><a class="reference internal" href="dev/plugins.html">Plugins</a></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/lxcdev.html">Developing in Linux Containers</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"><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></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="utils/index.html">DevOps tooling box</a><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>
+<li class="toctree-l2"><a class="reference internal" href="utils/lxc.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="utils/index.html#common-command-environments">Common command environments</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="src/index.html">Source-Code</a><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.exceptions.html">SearXNG Exceptions</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.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="src/searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="src/searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="src/searx.redislib.html">Redis Library</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.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="#">
+ <img class="logo" src="_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="#">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="#">Overview</a>
+ <ul>
+
+ <li>Next: <a href="user/index.html" title="next chapter">User information</a>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/objects.inv b/objects.inv
new file mode 100644
index 000000000..ed98e776e
--- /dev/null
+++ b/objects.inv
Binary files differ
diff --git a/own-instance.html b/own-instance.html
new file mode 100644
index 000000000..46a05a88e
--- /dev/null
+++ b/own-instance.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Why use a private instance? &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=a5c4661c" />
+ <script src="_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="_static/doctools.js?v=9a2dae69"></script>
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="genindex.html" />
+ <link rel="search" title="Search" href="search.html" />
+ <link rel="next" title="Administrator documentation" href="admin/index.html" />
+ <link rel="prev" title="About SearXNG" href="user/about.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="admin/index.html" title="Administrator documentation"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="user/about.html" title="About SearXNG"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Why use a private instance?</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="why-use-a-private-instance">
+<h1>Why use a private instance?<a class="headerlink" href="#why-use-a-private-instance" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Is it worth to run my own instance?</p>
+<p>.. is a common question among SearXNG users. Before answering this
+question, see what options a SearXNG user has.</p>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#how-does-searxng-protect-privacy" id="id1">How does SearXNG protect privacy?</a></p>
+<ul>
+<li><p><a class="reference internal" href="#what-are-the-consequences-of-using-public-instances" id="id2">What are the consequences of using public instances?</a></p></li>
+<li><p><a class="reference internal" href="#i-see-what-about-private-instances" id="id3">I see. What about private instances?</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#conclusion" id="id4">Conclusion</a></p></li>
+</ul>
+</nav>
+<p>Public instances are open to everyone who has access to its URL. Usually, these
+are operated by unknown parties (from the users’ point of view). Private
+instances can be used by a select group of people. It is for example a SearXNG of
+group of friends or a company which can be accessed through VPN. Also it can be
+single user one which runs on the user’s laptop.</p>
+<p>To gain more insight on how these instances work let’s dive into how SearXNG
+protects its users.</p>
+<section id="how-does-searxng-protect-privacy">
+<span id="searxng-protect-privacy"></span><h2><a class="toc-backref" href="#id1" role="doc-backlink">How does SearXNG protect privacy?</a><a class="headerlink" href="#how-does-searxng-protect-privacy" title="Link to this heading">¶</a></h2>
+<p>SearXNG protects the privacy of its users in multiple ways regardless of the type
+of the instance (private, public). Removal of private data from search requests
+comes in three forms:</p>
+<blockquote>
+<div><ol class="arabic simple">
+<li><p>removal of private data from requests going to search services</p></li>
+<li><p>not forwarding anything from a third party services through search services
+(e.g. advertisement)</p></li>
+<li><p>removal of private data from requests going to the result pages</p></li>
+</ol>
+</div></blockquote>
+<p>Removing private data means not sending cookies to external search engines and
+generating a random browser profile for every request. Thus, it does not matter
+if a public or private instance handles the request, because it is anonymized in
+both cases. IP addresses will be the IP of the instance. But SearXNG can be
+configured to use proxy or Tor. <a class="reference external" href="https://github.com/asciimoo/morty">Result proxy</a> is supported, too.</p>
+<p>SearXNG does not serve ads or tracking content unlike most search services. So
+private data is not forwarded to third parties who might monetize it. Besides
+protecting users from search services, both referring page and search query are
+hidden from visited result pages.</p>
+<section id="what-are-the-consequences-of-using-public-instances">
+<h3><a class="toc-backref" href="#id2" role="doc-backlink">What are the consequences of using public instances?</a><a class="headerlink" href="#what-are-the-consequences-of-using-public-instances" title="Link to this heading">¶</a></h3>
+<p>If someone uses a public instance, they have to trust the administrator of that
+instance. This means that the user of the public instance does not know whether
+their requests are logged, aggregated and sent or sold to a third party.</p>
+<p>Also, public instances without proper protection are more vulnerable to abusing
+the search service, In this case the external service in exchange returns
+CAPTCHAs or bans the IP of the instance. Thus, search requests return less
+results.</p>
+</section>
+<section id="i-see-what-about-private-instances">
+<h3><a class="toc-backref" href="#id3" role="doc-backlink">I see. What about private instances?</a><a class="headerlink" href="#i-see-what-about-private-instances" title="Link to this heading">¶</a></h3>
+<p>If users run their <a class="reference internal" href="admin/installation.html#installation"><span class="std std-ref">own instances</span></a>, everything is in their
+control: the source code, logging settings and private data. Unknown instance
+administrators do not have to be trusted.</p>
+<p>Furthermore, as the default settings of their instance is editable, there is no
+need to use cookies to tailor SearXNG to their needs. So preferences will not be
+reset to defaults when clearing browser cookies. As settings are stored on
+their computer, it will not be accessible to others as long as their computer is
+not compromised.</p>
+</section>
+</section>
+<section id="conclusion">
+<h2><a class="toc-backref" href="#id4" role="doc-backlink">Conclusion</a><a class="headerlink" href="#conclusion" title="Link to this heading">¶</a></h2>
+<p>Always use an instance which is operated by people you trust. The privacy
+features of SearXNG are available to users no matter what kind of instance they
+use.</p>
+<p>If someone is on the go or just wants to try SearXNG for the first time public
+instances are the best choices. Additionally, public instance are making a
+world a better place, because those who cannot or do not want to run an
+instance, have access to a privacy respecting search service.</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="index.html">
+ <img class="logo" src="_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="user/index.html">User information</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Why use a private instance?</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="#how-does-searxng-protect-privacy">How does SearXNG protect privacy?</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#what-are-the-consequences-of-using-public-instances">What are the consequences of using public instances?</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#i-see-what-about-private-instances">I see. What about private instances?</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="#conclusion">Conclusion</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="index.html">Overview</a>
+ <ul>
+ <li>Previous: <a href="user/about.html" title="previous chapter">About SearXNG</a>
+ <li>Next: <a href="admin/index.html" title="next chapter">Administrator documentation</a>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/own-instance.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/py-modindex.html b/py-modindex.html
new file mode 100644
index 000000000..070c6f8e3
--- /dev/null
+++ b/py-modindex.html
@@ -0,0 +1,627 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Python Module Index &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=a5c4661c" />
+ <script src="_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="_static/doctools.js?v=9a2dae69"></script>
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="_static/tabs.js?v=3030b3cb"></script>
+ <link rel="index" title="Index" href="genindex.html" />
+ <link rel="search" title="Search" href="search.html" />
+
+
+
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="#" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Python Module Index</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+
+ <h1>Python Module Index</h1>
+
+ <div class="modindex-jumpbox">
+ <a href="#cap-s"><strong>s</strong></a>
+ </div>
+
+ <table class="indextable modindextable">
+ <tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
+ <tr class="cap" id="cap-s"><td></td><td>
+ <strong>s</strong></td><td></td></tr>
+ <tr>
+ <td><img src="_static/minus.png" class="toggler"
+ id="toggle-1" style="display: none" alt="-" /></td>
+ <td>
+ <code class="xref">searx</code></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.babel_extract.html#module-searx.babel_extract"><code class="xref">searx.babel_extract</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection"><code class="xref">searx.botdetection</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.config"><code class="xref">searx.botdetection.config</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.http_accept"><code class="xref">searx.botdetection.http_accept</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.http_accept_encoding"><code class="xref">searx.botdetection.http_accept_encoding</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.http_accept_language"><code class="xref">searx.botdetection.http_accept_language</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.http_connection"><code class="xref">searx.botdetection.http_connection</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.http_user_agent"><code class="xref">searx.botdetection.http_user_agent</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.ip_limit"><code class="xref">searx.botdetection.ip_limit</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.ip_lists"><code class="xref">searx.botdetection.ip_lists</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.botdetection.html#module-searx.botdetection.link_token"><code class="xref">searx.botdetection.link_token</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/enginelib.html#module-searx.enginelib"><code class="xref">searx.enginelib</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/enginelib.html#module-searx.enginelib.traits"><code class="xref">searx.enginelib.traits</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/engines.html#module-searx.engines"><code class="xref">searx.engines</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/annas_archive.html#module-searx.engines.annas_archive"><code class="xref">searx.engines.annas_archive</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/archlinux.html#module-searx.engines.archlinux"><code class="xref">searx.engines.archlinux</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/bing.html#module-searx.engines.bing"><code class="xref">searx.engines.bing</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/bing.html#module-searx.engines.bing_images"><code class="xref">searx.engines.bing_images</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/bing.html#module-searx.engines.bing_news"><code class="xref">searx.engines.bing_news</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/bing.html#module-searx.engines.bing_videos"><code class="xref">searx.engines.bing_videos</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/bpb.html#module-searx.engines.bpb"><code class="xref">searx.engines.bpb</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/brave.html#module-searx.engines.brave"><code class="xref">searx.engines.brave</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/bt4g.html#module-searx.engines.bt4g"><code class="xref">searx.engines.bt4g</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/command-line-engines.html#module-searx.engines.command"><code class="xref">searx.engines.command</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/dailymotion.html#module-searx.engines.dailymotion"><code class="xref">searx.engines.dailymotion</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/demo/demo_offline.html#module-searx.engines.demo_offline"><code class="xref">searx.engines.demo_offline</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/demo/demo_online.html#module-searx.engines.demo_online"><code class="xref">searx.engines.demo_online</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo"><code class="xref">searx.engines.duckduckgo</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_definitions"><code class="xref">searx.engines.duckduckgo_definitions</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_extra"><code class="xref">searx.engines.duckduckgo_extra</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_weather"><code class="xref">searx.engines.duckduckgo_weather</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.elasticsearch"><code class="xref">searx.engines.elasticsearch</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/google.html#module-searx.engines.google"><code class="xref">searx.engines.google</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/google.html#module-searx.engines.google_images"><code class="xref">searx.engines.google_images</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/google.html#module-searx.engines.google_news"><code class="xref">searx.engines.google_news</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/google.html#module-searx.engines.google_scholar"><code class="xref">searx.engines.google_scholar</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/google.html#module-searx.engines.google_videos"><code class="xref">searx.engines.google_videos</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/lemmy.html#module-searx.engines.lemmy"><code class="xref">searx.engines.lemmy</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/loc.html#module-searx.engines.loc"><code class="xref">searx.engines.loc</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/mastodon.html#module-searx.engines.mastodon"><code class="xref">searx.engines.mastodon</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/mediawiki.html#module-searx.engines.mediawiki"><code class="xref">searx.engines.mediawiki</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.meilisearch"><code class="xref">searx.engines.meilisearch</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/nosql-engines.html#module-searx.engines.mongodb"><code class="xref">searx.engines.mongodb</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/moviepilot.html#module-searx.engines.moviepilot"><code class="xref">searx.engines.moviepilot</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/mrs.html#module-searx.engines.mrs"><code class="xref">searx.engines.mrs</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/mullvad_leta.html#module-searx.engines.mullvad_leta"><code class="xref">searx.engines.mullvad_leta</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/mwmbl.html#module-searx.engines.mwmbl"><code class="xref">searx.engines.mwmbl</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/sql-engines.html#module-searx.engines.mysql_server"><code class="xref">searx.engines.mysql_server</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/odysee.html#module-searx.engines.odysee"><code class="xref">searx.engines.odysee</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/peertube.html#module-searx.engines.peertube"><code class="xref">searx.engines.peertube</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/piped.html#module-searx.engines.piped"><code class="xref">searx.engines.piped</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/sql-engines.html#module-searx.engines.postgresql"><code class="xref">searx.engines.postgresql</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/presearch.html#module-searx.engines.presearch"><code class="xref">searx.engines.presearch</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/qwant.html#module-searx.engines.qwant"><code class="xref">searx.engines.qwant</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/radio_browser.html#module-searx.engines.radio_browser"><code class="xref">searx.engines.radio_browser</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/recoll.html#module-searx.engines.recoll"><code class="xref">searx.engines.recoll</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/nosql-engines.html#module-searx.engines.redis_server"><code class="xref">searx.engines.redis_server</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/seekr.html#module-searx.engines.seekr"><code class="xref">searx.engines.seekr</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/peertube.html#module-searx.engines.sepiasearch"><code class="xref">searx.engines.sepiasearch</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/search-indexer-engines.html#module-searx.engines.solr"><code class="xref">searx.engines.solr</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/offline/sql-engines.html#module-searx.engines.sqlite"><code class="xref">searx.engines.sqlite</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/startpage.html#module-searx.engines.startpage"><code class="xref">searx.engines.startpage</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/tagesschau.html#module-searx.engines.tagesschau"><code class="xref">searx.engines.tagesschau</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online_url_search/tineye.html#module-searx.engines.tineye"><code class="xref">searx.engines.tineye</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/torznab.html#module-searx.engines.torznab"><code class="xref">searx.engines.torznab</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/void.html#module-searx.engines.voidlinux"><code class="xref">searx.engines.voidlinux</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/wallhaven.html#module-searx.engines.wallhaven"><code class="xref">searx.engines.wallhaven</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/wikipedia.html#module-searx.engines.wikidata"><code class="xref">searx.engines.wikidata</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/wikipedia.html#module-searx.engines.wikipedia"><code class="xref">searx.engines.wikipedia</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/xpath.html#module-searx.engines.xpath"><code class="xref">searx.engines.xpath</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/yacy.html#module-searx.engines.yacy"><code class="xref">searx.engines.yacy</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/yahoo.html#module-searx.engines.yahoo"><code class="xref">searx.engines.yahoo</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/engines/online/zlibrary.html#module-searx.engines.zlibrary"><code class="xref">searx.engines.zlibrary</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.exceptions.html#module-searx.exceptions"><code class="xref">searx.exceptions</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.infopage.html#module-searx.infopage"><code class="xref">searx.infopage</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="admin/searx.limiter.html#module-searx.limiter"><code class="xref">searx.limiter</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.locales.html#module-searx.locales"><code class="xref">searx.locales</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.plugins.tor_check.html#module-searx.plugins.tor_check"><code class="xref">searx.plugins.tor_check</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.plugins.unit_converter.html#module-searx.plugins.unit_converter"><code class="xref">searx.plugins.unit_converter</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.redisdb.html#module-searx.redisdb"><code class="xref">searx.redisdb</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.redislib.html#module-searx.redislib"><code class="xref">searx.redislib</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.search.processors.html#module-searx.search.processors.abstract"><code class="xref">searx.search.processors.abstract</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.search.processors.html#module-searx.search.processors.offline"><code class="xref">searx.search.processors.offline</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.search.processors.html#module-searx.search.processors.online"><code class="xref">searx.search.processors.online</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.search.processors.html#module-searx.search.processors.online_currency"><code class="xref">searx.search.processors.online_currency</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.search.processors.html#module-searx.search.processors.online_dictionary"><code class="xref">searx.search.processors.online_dictionary</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.search.processors.html#module-searx.search.processors.online_url_search"><code class="xref">searx.search.processors.online_url_search</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.locales.html#module-searx.sxng_locales"><code class="xref">searx.sxng_locales</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="src/searx.utils.html#module-searx.utils"><code class="xref">searx.utils</code></a></td><td>
+ <em></em></td></tr>
+ <tr>
+ <td><img src="_static/minus.png" class="toggler"
+ id="toggle-2" style="display: none" alt="-" /></td>
+ <td>
+ <code class="xref">searxng_extra</code></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/standalone_searx.py.html#module-searxng_extra.standalone_searx"><code class="xref">searxng_extra.standalone_searx</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_ahmia_blacklist"><code class="xref">searxng_extra.update.update_ahmia_blacklist</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_currencies"><code class="xref">searxng_extra.update.update_currencies</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_engine_descriptions"><code class="xref">searxng_extra.update.update_engine_descriptions</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_engine_traits"><code class="xref">searxng_extra.update.update_engine_traits</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_external_bangs"><code class="xref">searxng_extra.update.update_external_bangs</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_firefox_version"><code class="xref">searxng_extra.update.update_firefox_version</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_locales"><code class="xref">searxng_extra.update.update_locales</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_osm_keys_tags"><code class="xref">searxng_extra.update.update_osm_keys_tags</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_pygments"><code class="xref">searxng_extra.update.update_pygments</code></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-2">
+ <td></td>
+ <td>&#160;&#160;&#160;
+ <a href="dev/searxng_extra/update.html#module-searxng_extra.update.update_wikidata_units"><code class="xref">searxng_extra.update.update_wikidata_units</code></a></td><td>
+ <em></em></td></tr>
+ </table>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="index.html">
+ <img class="logo" src="_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="index.html">Overview</a>
+
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/search.html b/search.html
new file mode 100644
index 000000000..84e067f60
--- /dev/null
+++ b/search.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Search &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=a5c4661c" />
+
+ <script src="_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="_static/doctools.js?v=9a2dae69"></script>
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="_static/tabs.js?v=3030b3cb"></script>
+ <script src="_static/searchtools.js"></script>
+ <script src="_static/language_data.js"></script>
+ <link rel="index" title="Index" href="genindex.html" />
+ <link rel="search" title="Search" href="#" />
+ <script src="searchindex.js" defer="defer"></script>
+ <meta name="robots" content="noindex" />
+
+
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="nav-item nav-item-0"><a href="index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Search</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <h1 id="search-documentation">Search</h1>
+
+ <noscript>
+ <div class="admonition warning">
+ <p>
+ Please activate JavaScript to enable the search
+ functionality.
+ </p>
+ </div>
+ </noscript>
+
+
+ <p>
+ Searching for multiple words only shows matches that contain
+ all words.
+ </p>
+
+
+ <form action="" method="get">
+ <input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="search" />
+ <span id="search-progress" style="padding-left: 10px"></span>
+ </form>
+
+
+ <div id="search-results"></div>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="index.html">
+ <img class="logo" src="_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="index.html">Table of Contents</a></h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="index.html">Overview</a>
+
+ </li>
+</ul>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/searchindex.js b/searchindex.js
new file mode 100644
index 000000000..cb1d077b4
--- /dev/null
+++ b/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"alltitles": {"! select engine and category": [[104, "select-engine-and-category"]], "!! automatic redirect": [[104, "automatic-redirect"]], "!!<bang> external bangs": [[104, "bang-external-bangs"]], "./manage go.help": [[76, "manage-go-help"]], "./manage redis.help": [[76, "manage-redis-help"]], ": select language": [[104, "select-language"]], "::": [[79, "rest-literal"]], ":ref: role": [[79, null]], "ASCII grid table": [[79, null]], "About LaTeX": [[79, null]], "About SearXNG": [[101, "about-searxng"]], "Abstract processor class": [[99, "module-searx.search.processors.abstract"]], "Administration API": [[1, "administration-api"]], "Administrator documentation": [[4, "administrator-documentation"]], "Admonitions": [[79, "admonitions"]], "Anchors": [[79, "anchors"]], "Anchors & Links": [[79, "anchors-links"]], "Anna\u2019s Archive": [[39, "anna-s-archive"]], "Answer CAPTCHA from server\u2019s IP": [[0, "answer-captcha-from-server-s-ip"]], "Apache": [[6, "apache"]], "Apache modules": [[6, "apache-modules"]], "Apache sites": [[6, "apache-sites"]], "Apache\u2019s SearXNG site": [[6, "apache-s-searxng-site"]], "Arch Linux": [[40, "arch-linux"]], "Arch Linux Wiki": [[40, "arch-linux-wiki"]], "Architecture": [[2, "architecture"]], "Audience": [[75, null]], "BT4G": [[44, "bt4g"]], "Bashism": [[7, null]], "Basic article structure": [[79, "basic-article-structure"]], "Basic inline markup": [[79, "basic-inline-markup"]], "Bing Engines": [[41, "bing-engines"]], "Bing Images": [[41, "module-searx.engines.bing_images"]], "Bing News": [[41, "module-searx.engines.bing_news"]], "Bing Videos": [[41, "module-searx.engines.bing_videos"]], "Bing WEB": [[41, "module-searx.engines.bing"]], "Bot Detection": [[90, "bot-detection"]], "Bpb": [[42, "bpb"]], "Brave Engines": [[43, "brave-engines"]], "Brave Goggles": [[43, "brave-goggles"]], "Brave languages": [[43, "brave-languages"]], "Brave regions": [[43, "brave-regions"]], "Build and Development tools": [[3, "build-and-development-tools"]], "Build docs": [[3, "build-docs"]], "Build environment": [[79, null]], "Build the image": [[7, "build-the-image"]], "Buildhosts": [[3, "buildhosts"]], "Bullet list": [[79, "bullet-list"]], "CSV table": [[79, "csv-table"], [79, null]], "CSV table example": [[79, "id14"]], "Check": [[10, "check"]], "Check after Installation": [[25, "check-after-installation"]], "Clean up": [[106, "clean-up"]], "Code": [[26, "code"]], "Code block": [[79, null]], "Command Help": [[106, "command-help"], [107, "command-help"]], "Command Line Engines": [[34, "command-line-engines"]], "Command line": [[7, "command-line"]], "Common command environments": [[105, "common-command-environments"]], "Common options in the engine module": [[29, "id3"]], "Common options in the engine setup (settings.yml)": [[29, "id4"]], "Conclusion": [[87, "conclusion"]], "Config": [[90, "module-searx.botdetection.config"]], "Configuration": [[10, "configuration"], [33, "configuration"], [34, "configuration"], [35, "configuration"], [35, "id3"], [39, "configuration"], [44, "configuration"], [48, "configuration"], [52, "configuration"], [57, "configuration"], [59, "configuration"], [61, "configuration"], [62, "configuration"], [65, "configuration"], [69, "configuration"], [71, "configuration"], [73, "configuration"]], "Configure Limiter": [[13, "configure-limiter"]], "Configure the engines": [[35, "configure-the-engines"], [37, "configure-the-engines"]], "Configured Engines": [[102, "configured-engines"]], "Content matters": [[79, null]], "Content-Security-Policy (CSP)": [[47, null]], "Contents": [[43, "contents"], [44, "contents"], [48, "contents"], [52, "contents"], [57, "contents"], [59, "contents"], [62, "contents"], [69, "contents"], [71, "contents"]], "Create good commits!": [[26, null]], "Create user": [[10, "create-user"]], "Custom message extractor (i18n)": [[89, "module-searx.babel_extract"]], "DOT files (aka Graphviz)": [[79, "dot-files-aka-graphviz"]], "Dailymotion": [[45, "dailymotion"]], "Dailymotion (Videos)": [[45, "dailymotion-videos"]], "Debian\u2019s Apache layout": [[6, "debian-s-apache-layout"]], "Debian\u2019s uWSGI layout": [[11, "debian-s-uwsgi-layout"]], "Definition list": [[79, "definition-list"]], "Demo Offline Engine": [[27, "demo-offline-engine"]], "Demo Online Engine": [[28, "demo-online-engine"]], "DevOps tooling box": [[105, "devops-tooling-box"]], "Developer documentation": [[74, "developer-documentation"]], "Developing in Linux Containers": [[75, "developing-in-linux-containers"]], "Development Quickstart": [[78, "development-quickstart"]], "Disable logs": [[8, "disable-logs"]], "Distributors": [[11, "distributors"]], "Docker Container": [[7, "docker-container"]], "Documentation": [[26, "documentation"]], "DuckDuckGo Engines": [[46, "duckduckgo-engines"]], "DuckDuckGo Extra (images, videos, news)": [[46, "duckduckgo-extra-images-videos-news"]], "DuckDuckGo Instant Answer API": [[46, "duckduckgo-instant-answer-api"]], "DuckDuckGo Lite": [[46, "duckduckgo-lite"]], "DuckDuckGo Weather": [[46, "duckduckgo-weather"]], "Elasticsearch": [[36, "module-searx.engines.elasticsearch"]], "Embed search bar": [[1, "embed-search-bar"]], "Enable Limiter": [[13, "enable-limiter"]], "Engine File": [[29, "engine-file"]], "Engine Implementations": [[32, "engine-implementations"]], "Engine Library": [[30, "engine-library"]], "Engine Overview": [[29, "engine-overview"]], "Engine Types": [[32, "engine-types"]], "Engine settings.yml": [[29, "engine-settings-yml"]], "Engine traits": [[30, "module-searx.enginelib.traits"]], "Example": [[34, "example"], [35, "example"], [35, "id4"], [36, "example"], [36, "id3"], [36, "id5"], [37, "example"], [37, "id4"], [37, "id7"], [61, "example"], [73, "example"]], "Example plugin": [[77, "example-plugin"]], "Example: Multilingual Search": [[18, "example-multilingual-search"]], "External plugins": [[77, "external-plugins"]], "Extra Dependencies": [[35, "extra-dependencies"], [37, "extra-dependencies"], [38, "extra-dependencies"]], "Field List": [[79, null]], "Field Lists": [[79, "field-lists"]], "Figures & Images": [[79, "figures-images"]], "Framework Components": [[32, null]], "Fully functional SearXNG suite": [[75, null]], "Further list blocks": [[79, "further-list-blocks"]], "Further reading": [[2, null], [79, null], [79, null]], "Further reading ..": [[12, null], [14, null], [15, null], [18, null], [29, null], [77, null], [81, null], [102, null]], "General Engine Configuration": [[29, "general-engine-configuration"]], "Generic admonition": [[79, "generic-admonition"]], "Gentlemen, start your engines!": [[75, "gentlemen-start-your-engines"]], "Get Docker": [[7, "get-docker"]], "Get configuration data": [[1, "get-configuration-data"]], "Get started": [[80, "get-started"]], "Good to know": [[106, "good-to-know"]], "Google API": [[47, "google-api"]], "Google Autocomplete": [[47, "google-autocomplete"]], "Google Engines": [[47, "google-engines"]], "Google Images": [[47, "module-searx.engines.google_images"]], "Google News": [[47, "module-searx.engines.google_news"]], "Google Scholar": [[47, "module-searx.engines.google_scholar"]], "Google Videos": [[47, "module-searx.engines.google_videos"]], "Google WEB": [[47, "module-searx.engines.google"]], "Grid tables": [[79, "grid-tables"]], "HTTP headers": [[6, null]], "Headings": [[79, "headings"]], "Horizontal list": [[79, "horizontal-list"]], "How can I make it my own?": [[101, "how-can-i-make-it-my-own"]], "How do I set it as the default search engine?": [[101, "how-do-i-set-it-as-the-default-search-engine"]], "How does SearXNG protect privacy?": [[87, "how-does-searxng-protect-privacy"]], "How does it work?": [[101, "how-does-it-work"]], "How to contribute": [[26, "how-to-contribute"]], "How to inspect & debug": [[25, "how-to-inspect-debug"]], "How to update": [[25, "how-to-update"]], "I see. What about private instances?": [[87, "i-see-what-about-private-instances"]], "IP lists": [[90, "module-searx.botdetection.ip_lists"]], "If the engine_type is online": [[29, "id6"]], "If the engine_type is online_currency,\n in addition to the online arguments:": [[29, "id8"]], "If the engine_type is online_dictionary,\n in addition to the online arguments:": [[29, "id7"]], "If the engine_type is online_url_search,\n in addition to the online arguments:": [[29, "id9"]], "Image processing": [[79, null]], "Implementation": [[13, "implementation"], [52, "implementation"]], "Implementations": [[33, "implementations"], [34, "implementations"], [35, "implementations"], [35, "id5"], [37, "implementations"], [37, "id5"], [37, "id8"], [39, "implementations"], [43, "implementations"], [44, "implementations"], [48, "implementations"], [57, "implementations"], [58, "implementations"], [59, "implementations"], [61, "implementations"], [62, "implementations"], [65, "implementations"], [69, "implementations"], [71, "implementations"], [73, "implementations"]], "In containers, work as usual": [[75, "in-containers-work-as-usual"]], "Inline markup": [[79, null]], "Install": [[107, "install"]], "Install LXD": [[106, "install-lxd"]], "Install SearXNG & dependencies": [[10, "install-searxng-dependencies"]], "Install packages": [[10, "install-packages"]], "Install suite": [[106, "install-suite"]], "Installation": [[5, "installation"]], "Installation Script": [[9, "installation-script"]], "Internet Connectivity & Docker": [[106, "internet-connectivity-docker"]], "Introduce asdf": [[80, "introduce-asdf"]], "Is it worth to run my own instance?": [[87, null]], "KISS and readability": [[79, null]], "Known Quirks": [[57, "known-quirks"], [62, "known-quirks"]], "LaTeX math equation": [[79, null]], "Languages & Regions": [[58, "languages-regions"]], "Lemmy": [[48, "lemmy"]], "Library of Congress": [[49, "library-of-congress"]], "Limiter": [[13, "limiter"]], "Line spacing": [[79, null]], "Link ordinary URL": [[79, "link-ordinary-url"]], "Lint shell scripts": [[3, "lint-shell-scripts"]], "List markups": [[79, "list-markups"]], "List table": [[79, null]], "List tables": [[79, null]], "Literal block": [[79, null]], "Literal blocks": [[79, "literal-blocks"]], "Local Search APIs": [[36, "local-search-apis"]], "Locales": [[93, "locales"]], "Makefile & ./manage": [[76, "makefile-manage"]], "Making a Request": [[29, "making-a-request"]], "Manage Versions": [[80, "manage-versions"]], "Mastodon": [[50, "mastodon"]], "Math equations": [[79, "math-equations"]], "Matrix Rooms Search (MRS)": [[52, "matrix-rooms-search-mrs"]], "MediaWiki Engine": [[33, "mediawiki-engine"]], "MeiliSearch": [[36, "module-searx.engines.meilisearch"]], "Method http_accept": [[90, "method-http-accept"]], "Method http_accept_encoding": [[90, "method-http-accept-encoding"]], "Method http_accept_language": [[90, "method-http-accept-language"]], "Method http_connection": [[90, "method-http-connection"]], "Method http_user_agent": [[90, "method-http-user-agent"]], "Method ip_limit": [[90, "method-ip-limit"]], "Method ip_lists": [[90, "method-ip-lists"]], "Method link_token": [[90, "method-link-token"]], "Migrate and stay tuned!": [[25, "migrate-and-stay-tuned"]], "MongoDB": [[35, "engine-mongodb"]], "Motivation": [[75, "motivation"]], "Moviepilot": [[51, "moviepilot"]], "Mullvad-Leta": [[53, "mullvad-leta"]], "Mwmbl Autocomplete": [[54, "mwmbl-autocomplete"]], "Mwmbl Engine": [[54, "mwmbl-engine"]], "Mwmbl WEB": [[54, "module-searx.engines.mwmbl"]], "MySQL": [[37, "engine-mysql-server"]], "NGINX": [[8, "nginx"]], "NGINX\u2019s SearXNG site": [[8, "nginx-s-searxng-site"]], "NVM make nvm.install nvm.status": [[76, "nvm-make-nvm-install-nvm-status"]], "Named hyperlink": [[79, null]], "Nested tables": [[79, null]], "NoSQL databases": [[35, "nosql-databases"]], "Node.js environment (make node.env)": [[76, "node-js-environment-make-node-env"]], "Note ..": [[79, null]], "Odysee": [[55, "odysee"]], "Offline Concept": [[38, "offline-concept"]], "Offline Engines": [[32, "offline-engines"]], "Offline processor": [[99, "module-searx.search.processors.offline"]], "Online /info": [[92, "module-searx.infopage"]], "Online Currency": [[32, "online-currency"]], "Online Dictionary": [[32, "online-dictionary"]], "Online Engines": [[32, "online-engines"]], "Online URL Search": [[32, "online-url-search"]], "Online URL search processor": [[99, "module-searx.search.processors.online_url_search"]], "Online currency processor": [[99, "module-searx.search.processors.online_currency"]], "Online dictionary processor": [[99, "module-searx.search.processors.online_dictionary"]], "Online processor": [[99, "module-searx.search.processors.online"]], "Origin uWSGI": [[11, "origin-uwsgi"]], "Overrides": [[29, "overrides"]], "Parameter of the default media type:": [[29, "id10"]], "Parameter of the images media type": [[29, "id11"]], "Parameter of the map media type:": [[29, "id14"]], "Parameter of the packages media type": [[29, "id16"]], "Parameter of the paper media type /\n see BibTeX field types and BibTeX format": [[29, "id15"]], "Parameter of the torrent media type:": [[29, "id13"]], "Parameter of the videos media type:": [[29, "id12"]], "Parameters": [[81, "parameters"]], "Passed Arguments (request)": [[29, "passed-arguments-request"]], "Peertube Engines": [[56, "peertube-engines"]], "Peertube Video": [[56, "module-searx.engines.peertube"]], "Piped": [[57, "piped"]], "Pitfalls of the Tyrant mode": [[11, "pitfalls-of-the-tyrant-mode"]], "Plugin entry points": [[77, "plugin-entry-points"]], "Plugins": [[77, "plugins"]], "Plugins builtin": [[12, "plugins-builtin"]], "Plugins configured at built time (defaults)": [[12, "id1"]], "PostgreSQL": [[37, "engine-postgresql"]], "Presearch Engine": [[58, "presearch-engine"]], "Prime directives: Privacy, Hackability": [[26, "prime-directives-privacy-hackability"]], "Privacy-by-design": [[26, "privacy-by-design"]], "Private Engines (tokens)": [[18, "private-engines-tokens"]], "Private engines (Security)": [[38, "private-engines-security"]], "Probe HTTP headers": [[90, "module-searx.botdetection.http_accept"]], "Programming Interface": [[38, "programming-interface"]], "Python environment (make install)": [[76, "python-environment-make-install"]], "Quoted paragraph and line block": [[79, null]], "Quoted paragraphs": [[79, "quoted-paragraphs"]], "Qwant": [[59, "qwant"]], "RadioBrowser": [[60, "radiobrowser"]], "Rate limit": [[90, "module-searx.botdetection.ip_limit"]], "Recoll Engine": [[61, "recoll-engine"]], "Redis DB": [[96, "redis-db"]], "Redis Developer Notes": [[21, "redis-developer-notes"]], "Redis Library": [[97, "module-searx.redislib"]], "Redis Server": [[35, "redis-server"]], "Result Types (template)": [[29, "result-types-template"]], "Roles": [[79, "roles"]], "Running commands": [[106, "running-commands"]], "Runtime Management": [[80, "runtime-management"]], "SQL Engines": [[37, "sql-engines"]], "SQLite": [[37, "engine-sqlite"]], "Sample response": [[1, "sample-response"]], "SearXNG Exceptions": [[91, "module-searx.exceptions"]], "SearXNG LXC suite": [[106, "searxng-lxc-suite"]], "SearXNG maintenance": [[25, "searxng-maintenance"]], "SearXNG suite config": [[106, "searxng-suite-config"]], "SearXNG\u2019s engines loader": [[31, "module-searx.engines"]], "SearXNG\u2019s locale codes": [[93, "module-searx.sxng_locales"]], "SearXNG\u2019s locale data": [[93, "searxngs-locale-data"]], "SearXNG\u2019s locale implementations": [[93, "searxngs-locale-implementations"]], "Search": [[98, "search"]], "Search API": [[81, "search-api"]], "Search processors": [[99, "search-processors"]], "Search syntax": [[104, "search-syntax"]], "Search type video": [[58, "search-type-video"]], "Seekr Engines": [[62, "seekr-engines"]], "SepiaSearch": [[56, "module-searx.engines.sepiasearch"]], "Settings": [[14, "settings"]], "Setup SearXNG buildhost": [[106, "setup-searxng-buildhost"]], "Sidebar": [[79, "sidebar"]], "Simple ASCII table": [[79, null]], "Simple tables": [[79, "simple-tables"]], "Smart refs": [[79, "smart-refs"]], "Soft skills": [[79, "soft-skills"]], "Solr": [[36, "module-searx.engines.solr"]], "Source-Code": [[88, "source-code"]], "Special Queries": [[104, "special-queries"]], "Specific admonitions": [[79, "specific-admonitions"]], "Specify Request": [[29, "specify-request"]], "Sphinx build needs": [[3, null]], "Startpage Engines": [[63, "startpage-engines"]], "Startpage categories": [[63, "startpage-categories"]], "Startpage languages": [[63, "startpage-languages"]], "Startpage regions": [[63, "startpage-regions"]], "Step by step installation": [[10, "step-by-step-installation"]], "Summary": [[75, "summary"]], "Syntax highlighting": [[79, null]], "Tabbed views": [[79, "tabbed-views"]], "Tables": [[79, "tables"]], "Tagesschau API": [[64, "tagesschau-api"]], "Templating": [[79, "templating"]], "The Apache HTTP server": [[6, "the-apache-http-server"]], "The naming of overrides is arbitrary / recommended overrides are:": [[29, "id5"]], "The nginx HTTP server": [[8, "the-nginx-http-server"]], "The reST sources": [[26, null]], "The searxng-archlinux container": [[75, null]], "Tineye": [[72, "tineye"]], "Tooling box searxng_extra": [[82, "tooling-box-searxng-extra"]], "Tor check plugin": [[94, "tor-check-plugin"]], "Torznab WebAPI": [[65, "torznab-webapi"]], "Translation": [[26, "translation"], [85, "translation"]], "Unicode": [[79, null]], "Unicode substitution": [[79, "unicode-substitution"]], "Unit converter plugin": [[95, "unit-converter-plugin"]], "Update the OS first!": [[9, null]], "User information": [[103, "user-information"]], "Utility functions for the engines": [[100, "module-searx.utils"]], "Void Linux binary packages": [[66, "void-linux-binary-packages"]], "Wallhaven": [[67, "wallhaven"]], "Warning": [[7, null]], "Welcome to SearXNG": [[86, "welcome-to-searxng"]], "What are the consequences of using public instances?": [[87, "what-are-the-consequences-of-using-public-instances"]], "Why use a private instance?": [[87, "why-use-a-private-instance"]], "Why use it?": [[101, "why-use-it"]], "Wikidata": [[68, "module-searx.engines.wikidata"]], "Wikimedia": [[68, "wikimedia"]], "Wikipedia": [[68, "module-searx.engines.wikipedia"]], "Wrap production into developer suite": [[75, "wrap-production-into-developer-suite"]], "XPath Engine": [[73, "xpath-engine"]], "Yacy": [[69, "yacy"]], "Yahoo Engine": [[70, "yahoo-engine"]], "Z-Library": [[71, "z-library"]], "activate environment": [[76, null]], "basic inline markup": [[79, "id4"]], "be a part": [[86, null]], "bibliographic fields": [[79, null]], "brand:": [[16, "brand"]], "build environment": [[76, null]], "bullet list": [[79, null]], "categories_as_tabs:": [[17, "categories-as-tabs"]], "code-block": [[79, "code-block"]], "default": [[29, "default"]], "definition list": [[79, null]], "deploy on github.io": [[26, "deploy-on-github-io"]], "disable logs": [[6, "disable-logs"]], "docker run": [[7, null], [7, null]], "docs.clean": [[26, null]], "drop environment": [[76, null]], "engine:": [[18, "engine"]], "features": [[86, null]], "flask.Request.remote_addr": [[90, null]], "flat-table": [[79, "flat-table"]], "flat-table example": [[79, "id13"]], "foo gate truth table": [[79, "id11"]], "further read": [[6, null], [9, null], [9, null], [9, null], [25, null], [35, null], [36, null], [37, null], [75, null], [76, null], [76, null], [78, null], [78, null], [78, null], [106, null], [106, null]], "further reading": [[8, null], [11, null], [106, null], [107, null]], "general:": [[19, "general"]], "generic admonition title": [[79, null]], "grid table example": [[79, "id12"]], "group !apps": [[102, "group-apps"]], "group !lyrics": [[102, "group-lyrics"]], "group !packages": [[102, "group-packages"]], "group !q&a": [[102, "group-q-a"]], "group !radio": [[102, "group-radio"]], "group !repos": [[102, "group-repos"]], "group !scientific_publications": [[102, "group-scientific-publications"]], "group !software_wikis": [[102, "group-software-wikis"]], "group !translate": [[102, "group-translate"]], "group !web": [[102, "group-web"], [102, "id2"], [102, "id4"], [102, "id6"]], "group !wikimedia": [[102, "group-wikimedia"], [102, "id7"], [102, "id14"]], "hello.dot": [[79, null]], "hint": [[7, null], [106, null]], "hlist": [[79, null]], "images": [[29, "images"]], "info": [[7, null], [13, null], [18, null], [25, null], [32, null], [32, null], [32, null], [32, null], [32, null], [34, null], [34, null], [35, null], [35, null], [35, null], [36, null], [36, null], [36, null], [36, null], [37, null], [37, null], [37, null], [37, null], [61, "module-searx.engines.recoll"]], "kernel-render DOT": [[79, "kernel-render-dot"], [79, null]], "kernel-render SVG": [[79, "kernel-render-svg"], [79, null]], "limiter.toml": [[13, "limiter-toml"]], "live build": [[26, "live-build"]], "make clean": [[76, "make-clean"]], "make docs": [[76, "make-docs"]], "make docs.clean docs.live": [[76, "make-docs-clean-docs-live"]], "make docs.gh-pages": [[76, "make-docs-gh-pages"]], "make format.python": [[76, "make-format-python"]], "make nvm.nodejs": [[76, "make-nvm-nodejs"]], "make run": [[76, "make-run"]], "make search.checker.{engine name}": [[76, "make-search-checker-engine-name"]], "make static.build.*": [[76, "make-static-build"]], "make test": [[76, "make-test"]], "make test.pylint": [[76, "make-test-pylint"]], "make test.shell": [[76, "make-test-shell"]], "make themes.*": [[76, "make-themes"]], "map": [[29, "map"]], "offline engines": [[38, null]], "outgoing:": [[20, "outgoing"]], "packages": [[29, "packages"]], "paper": [[29, "paper"]], "reST primer": [[79, "rest-primer"]], "reST template": [[79, "rest-template"]], "redis:": [[21, "redis"]], "remove obsolete services": [[25, "remove-obsolete-services"]], "search:": [[22, "search"]], "searxng/searxng": [[7, "searxng-searxng"]], "searxng_extra/standalone_searx.py": [[83, "module-searxng_extra.standalone_searx"]], "searxng_extra/update/": [[84, "searxng-extra-update"]], "server:": [[23, "server"]], "settings.yml": [[15, "settings-yml"]], "settings.yml location": [[15, "settings-yml-location"]], "shell inside container": [[7, "shell-inside-container"]], "smart refs with sphinx.ext.extlinks and intersphinx": [[79, "id5"], [79, "id6"]], "ssh manual:": [[0, null]], "tab !files": [[102, "tab-files"]], "tab !general": [[102, "tab-general"]], "tab !images": [[102, "tab-images"]], "tab !it": [[102, "tab-it"]], "tab !map": [[102, "tab-map"]], "tab !music": [[102, "tab-music"]], "tab !news": [[102, "tab-news"]], "tab !science": [[102, "tab-science"]], "tab !social_media": [[102, "tab-social-media"]], "tab !videos": [[102, "tab-videos"]], "the origin": [[86, null]], "torrent": [[29, "torrent"]], "translated": [[85, null]], "uWSGI": [[6, null], [11, "uwsgi"]], "uWSGI Setup": [[2, "uwsgi-setup"]], "uWSGI maintenance": [[11, "uwsgi-maintenance"]], "uWSGI setup": [[11, "uwsgi-setup"]], "ui:": [[24, "ui"]], "update_ahmia_blacklist.py": [[84, "update-ahmia-blacklist-py"]], "update_currencies.py": [[84, "update-currencies-py"]], "update_engine_descriptions.py": [[84, "update-engine-descriptions-py"]], "update_engine_traits.py": [[84, "update-engine-traits-py"]], "update_external_bangs.py": [[84, "update-external-bangs-py"]], "update_firefox_version.py": [[84, "update-firefox-version-py"]], "update_locales.py": [[84, "update-locales-py"]], "update_osm_keys_tags.py": [[84, "update-osm-keys-tags-py"]], "update_pygments.py": [[84, "update-pygments-py"]], "update_wikidata_units.py": [[84, "update-wikidata-units-py"]], "use_default_settings": [[15, "use-default-settings"]], "use_default_settings: True": [[10, null]], "use_default_settings: true": [[15, null]], "utils/lxc.sh": [[106, "utils-lxc-sh"]], "utils/searxng.sh": [[107, "utils-searxng-sh"]], "videos": [[29, "videos"]], "without further subgrouping": [[102, "without-further-subgrouping"], [102, "id3"], [102, "id5"], [102, "id8"], [102, "id10"], [102, "id13"], [102, "id16"], [102, "id17"]], "wlc": [[85, "id2"]]}, "docnames": ["admin/answer-captcha", "admin/api", "admin/architecture", "admin/buildhosts", "admin/index", "admin/installation", "admin/installation-apache", "admin/installation-docker", "admin/installation-nginx", "admin/installation-scripts", "admin/installation-searxng", "admin/installation-uwsgi", "admin/plugins", "admin/searx.limiter", "admin/settings/index", "admin/settings/settings", "admin/settings/settings_brand", "admin/settings/settings_categories_as_tabs", "admin/settings/settings_engine", "admin/settings/settings_general", "admin/settings/settings_outgoing", "admin/settings/settings_redis", "admin/settings/settings_search", "admin/settings/settings_server", "admin/settings/settings_ui", "admin/update-searxng", "dev/contribution_guide", "dev/engines/demo/demo_offline", "dev/engines/demo/demo_online", "dev/engines/engine_overview", "dev/engines/enginelib", "dev/engines/engines", "dev/engines/index", "dev/engines/mediawiki", "dev/engines/offline/command-line-engines", "dev/engines/offline/nosql-engines", "dev/engines/offline/search-indexer-engines", "dev/engines/offline/sql-engines", "dev/engines/offline_concept", "dev/engines/online/annas_archive", "dev/engines/online/archlinux", "dev/engines/online/bing", "dev/engines/online/bpb", "dev/engines/online/brave", "dev/engines/online/bt4g", "dev/engines/online/dailymotion", "dev/engines/online/duckduckgo", "dev/engines/online/google", "dev/engines/online/lemmy", "dev/engines/online/loc", "dev/engines/online/mastodon", "dev/engines/online/moviepilot", "dev/engines/online/mrs", "dev/engines/online/mullvad_leta", "dev/engines/online/mwmbl", "dev/engines/online/odysee", "dev/engines/online/peertube", "dev/engines/online/piped", "dev/engines/online/presearch", "dev/engines/online/qwant", "dev/engines/online/radio_browser", "dev/engines/online/recoll", "dev/engines/online/seekr", "dev/engines/online/startpage", "dev/engines/online/tagesschau", "dev/engines/online/torznab", "dev/engines/online/void", "dev/engines/online/wallhaven", "dev/engines/online/wikipedia", "dev/engines/online/yacy", "dev/engines/online/yahoo", "dev/engines/online/zlibrary", "dev/engines/online_url_search/tineye", "dev/engines/xpath", "dev/index", "dev/lxcdev", "dev/makefile", "dev/plugins", "dev/quickstart", "dev/reST", "dev/rtm_asdf", "dev/search_api", "dev/searxng_extra/index", "dev/searxng_extra/standalone_searx.py", "dev/searxng_extra/update", "dev/translation", "index", "own-instance", "src/index", "src/searx.babel_extract", "src/searx.botdetection", "src/searx.exceptions", "src/searx.infopage", "src/searx.locales", "src/searx.plugins.tor_check", "src/searx.plugins.unit_converter", "src/searx.redisdb", "src/searx.redislib", "src/searx.search", "src/searx.search.processors", "src/searx.utils", "user/about", "user/configured_engines", "user/index", "user/search-syntax", "utils/index", "utils/lxc.sh", "utils/searxng.sh"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1}, "filenames": ["admin/answer-captcha.rst", "admin/api.rst", "admin/architecture.rst", "admin/buildhosts.rst", "admin/index.rst", "admin/installation.rst", "admin/installation-apache.rst", "admin/installation-docker.rst", "admin/installation-nginx.rst", "admin/installation-scripts.rst", "admin/installation-searxng.rst", "admin/installation-uwsgi.rst", "admin/plugins.rst", "admin/searx.limiter.rst", "admin/settings/index.rst", "admin/settings/settings.rst", "admin/settings/settings_brand.rst", "admin/settings/settings_categories_as_tabs.rst", "admin/settings/settings_engine.rst", "admin/settings/settings_general.rst", "admin/settings/settings_outgoing.rst", "admin/settings/settings_redis.rst", "admin/settings/settings_search.rst", "admin/settings/settings_server.rst", "admin/settings/settings_ui.rst", "admin/update-searxng.rst", "dev/contribution_guide.rst", "dev/engines/demo/demo_offline.rst", "dev/engines/demo/demo_online.rst", "dev/engines/engine_overview.rst", "dev/engines/enginelib.rst", "dev/engines/engines.rst", "dev/engines/index.rst", "dev/engines/mediawiki.rst", "dev/engines/offline/command-line-engines.rst", "dev/engines/offline/nosql-engines.rst", "dev/engines/offline/search-indexer-engines.rst", "dev/engines/offline/sql-engines.rst", "dev/engines/offline_concept.rst", "dev/engines/online/annas_archive.rst", "dev/engines/online/archlinux.rst", "dev/engines/online/bing.rst", "dev/engines/online/bpb.rst", "dev/engines/online/brave.rst", "dev/engines/online/bt4g.rst", "dev/engines/online/dailymotion.rst", "dev/engines/online/duckduckgo.rst", "dev/engines/online/google.rst", "dev/engines/online/lemmy.rst", "dev/engines/online/loc.rst", "dev/engines/online/mastodon.rst", "dev/engines/online/moviepilot.rst", "dev/engines/online/mrs.rst", "dev/engines/online/mullvad_leta.rst", "dev/engines/online/mwmbl.rst", "dev/engines/online/odysee.rst", "dev/engines/online/peertube.rst", "dev/engines/online/piped.rst", "dev/engines/online/presearch.rst", "dev/engines/online/qwant.rst", "dev/engines/online/radio_browser.rst", "dev/engines/online/recoll.rst", "dev/engines/online/seekr.rst", "dev/engines/online/startpage.rst", "dev/engines/online/tagesschau.rst", "dev/engines/online/torznab.rst", "dev/engines/online/void.rst", "dev/engines/online/wallhaven.rst", "dev/engines/online/wikipedia.rst", "dev/engines/online/yacy.rst", "dev/engines/online/yahoo.rst", "dev/engines/online/zlibrary.rst", "dev/engines/online_url_search/tineye.rst", "dev/engines/xpath.rst", "dev/index.rst", "dev/lxcdev.rst", "dev/makefile.rst", "dev/plugins.rst", "dev/quickstart.rst", "dev/reST.rst", "dev/rtm_asdf.rst", "dev/search_api.rst", "dev/searxng_extra/index.rst", "dev/searxng_extra/standalone_searx.py.rst", "dev/searxng_extra/update.rst", "dev/translation.rst", "index.rst", "own-instance.rst", "src/index.rst", "src/searx.babel_extract.rst", "src/searx.botdetection.rst", "src/searx.exceptions.rst", "src/searx.infopage.rst", "src/searx.locales.rst", "src/searx.plugins.tor_check.rst", "src/searx.plugins.unit_converter.rst", "src/searx.redisdb.rst", "src/searx.redislib.rst", "src/searx.search.rst", "src/searx.search.processors.rst", "src/searx.utils.rst", "user/about.rst", "user/configured_engines.rst", "user/index.rst", "user/search-syntax.rst", "utils/index.rst", "utils/lxc.sh.rst", "utils/searxng.sh.rst"], "indexentries": {"aa_content (in module searx.engines.annas_archive)": [[39, "searx.engines.annas_archive.aa_content", false]], "aa_ext (in module searx.engines.annas_archive)": [[39, "searx.engines.annas_archive.aa_ext", false]], "aa_sort (in module searx.engines.annas_archive)": [[39, "searx.engines.annas_archive.aa_sort", false]], "about (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.about", false]], "additional_translations (in module searx.locales)": [[93, "searx.locales.ADDITIONAL_TRANSLATIONS", false]], "additional_units (in module searx.plugins.unit_converter)": [[95, "searx.plugins.unit_converter.ADDITIONAL_UNITS", false]], "alias_symbols (in module searx.plugins.unit_converter)": [[95, "searx.plugins.unit_converter.ALIAS_SYMBOLS", false]], "all_locale (searx.enginelib.traits.enginetraits attribute)": [[30, "searx.enginelib.traits.EngineTraits.all_locale", false]], "api_key (in module searx.engines.seekr)": [[62, "searx.engines.seekr.api_key", false]], "api_key (in module searx.engines.wallhaven)": [[67, "searx.engines.wallhaven.api_key", false]], "api_max (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.API_MAX", false]], "api_url (in module searx.engines.qwant)": [[59, "searx.engines.qwant.api_url", false]], "api_wondow (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.API_WONDOW", false]], "arch_re (in module searx.engines.voidlinux)": [[66, "searx.engines.voidlinux.ARCH_RE", false]], "area_to_str() (in module searx.engines.duckduckgo_definitions)": [[46, "searx.engines.duckduckgo_definitions.area_to_str", false]], "assign_headers() (in module searx.engines.mullvad_leta)": [[53, "searx.engines.mullvad_leta.assign_headers", false]], "backend_url (in module searx.engines.piped)": [[57, "searx.engines.piped.backend_url", false]], "bangs_url (in module searxng_extra.update.update_external_bangs)": [[84, "searxng_extra.update.update_external_bangs.BANGS_URL", false]], "base_url (in module searx.engines.bing)": [[41, "searx.engines.bing.base_url", false]], "base_url (in module searx.engines.bing_images)": [[41, "searx.engines.bing_images.base_url", false]], "base_url (in module searx.engines.bing_news)": [[41, "searx.engines.bing_news.base_url", false]], "base_url (in module searx.engines.bing_videos)": [[41, "searx.engines.bing_videos.base_url", false]], "base_url (in module searx.engines.lemmy)": [[48, "searx.engines.lemmy.base_url", false]], "base_url (in module searx.engines.mediawiki)": [[33, "searx.engines.mediawiki.base_url", false]], "base_url (in module searx.engines.peertube)": [[56, "searx.engines.peertube.base_url", false]], "base_url (in module searx.engines.yacy)": [[69, "searx.engines.yacy.base_url", false]], "block_ip() (in module searx.botdetection.ip_lists)": [[90, "searx.botdetection.ip_lists.block_ip", false]], "brave_spellcheck (in module searx.engines.brave)": [[43, "searx.engines.brave.brave_spellcheck", false]], "bt4g_category (in module searx.engines.bt4g)": [[44, "searx.engines.bt4g.bt4g_category", false]], "bt4g_order_by (in module searx.engines.bt4g)": [[44, "searx.engines.bt4g.bt4g_order_by", false]], "build_engine_locales() (in module searx.locales)": [[93, "searx.locales.build_engine_locales", false]], "build_result() (in module searx.engines.torznab)": [[65, "searx.engines.torznab.build_result", false]], "built-in function": [[77, "on_result", false], [77, "post_search", false], [77, "pre_search", false]], "burst_max (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.BURST_MAX", false]], "burst_max_suspicious (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.BURST_MAX_SUSPICIOUS", false]], "burst_window (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.BURST_WINDOW", false]], "cache_vqd() (in module searx.engines.duckduckgo)": [[46, "searx.engines.duckduckgo.cache_vqd", false]], "categories (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.categories", false]], "ceid_list (in module searx.engines.google_news)": [[47, "searx.engines.google_news.ceid_list", false]], "check_parsing_options() (in module searx.engines.command)": [[34, "searx.engines.command.check_parsing_options", false]], "config (class in searx.botdetection.config)": [[90, "searx.botdetection.config.Config", false]], "content (searx.infopage.infopage property)": [[92, "searx.infopage.InfoPage.content", false]], "content_xpath (in module searx.engines.xpath)": [[73, "searx.engines.xpath.content_xpath", false]], "convert_str_to_int() (in module searx.utils)": [[100, "searx.utils.convert_str_to_int", false]], "cookies (in module searx.engines.xpath)": [[73, "searx.engines.xpath.cookies", false]], "copy() (searx.enginelib.traits.enginetraits method)": [[30, "searx.enginelib.traits.EngineTraits.copy", false]], "custom (searx.enginelib.traits.enginetraits attribute)": [[30, "searx.enginelib.traits.EngineTraits.custom", false]], "data_type (searx.enginelib.traits.enginetraits attribute)": [[30, "searx.enginelib.traits.EngineTraits.data_type", false]], "ddg_category (in module searx.engines.duckduckgo_extra)": [[46, "searx.engines.duckduckgo_extra.ddg_category", false]], "default() (searx.botdetection.config.config method)": [[90, "searx.botdetection.config.Config.default", false]], "default() (searx.enginelib.traits.enginetraitsencoder method)": [[30, "searx.enginelib.traits.EngineTraitsEncoder.default", false]], "default_request_params() (in module searx.search.processors.online)": [[99, "searx.search.processors.online.default_request_params", false]], "description (in module searx.plugins.tor_check)": [[94, "searx.plugins.tor_check.description", false]], "detect_google_captcha() (in module searx.engines.google_scholar)": [[47, "searx.engines.google_scholar.detect_google_captcha", false]], "detect_language() (in module searx.utils)": [[100, "searx.utils.detect_language", false]], "dict_subset() (in module searx.utils)": [[100, "searx.utils.dict_subset", false]], "disabled (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.disabled", false]], "display_error_messages (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.display_error_messages", false]], "display_type (in module searx.engines.wikidata)": [[68, "searx.engines.wikidata.display_type", false]], "display_type (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.display_type", false]], "download_error (in module searx.engines.tineye)": [[72, "searx.engines.tineye.DOWNLOAD_ERROR", false]], "drop_counter() (in module searx.redislib)": [[97, "searx.redislib.drop_counter", false]], "ecma_unescape() (in module searx.utils)": [[100, "searx.utils.ecma_unescape", false]], "enable_http (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.enable_http", false]], "engine (class in searx.enginelib)": [[30, "searx.enginelib.Engine", false]], "engine (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.engine", false]], "engine_shortcuts (in module searx.engines)": [[31, "searx.engines.engine_shortcuts", false]], "engine_traits_file (searx.enginelib.traits.enginetraitsmap attribute)": [[30, "searx.enginelib.traits.EngineTraitsMap.ENGINE_TRAITS_FILE", false]], "engine_type (in module searx.engines.tineye)": [[72, "searx.engines.tineye.engine_type", false]], "engine_type (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.engine_type", false]], "engineprocessor (class in searx.search.processors.abstract)": [[99, "searx.search.processors.abstract.EngineProcessor", false]], "engineref (class in searx.search)": [[98, "searx.search.EngineRef", false]], "enginetraits (class in searx.enginelib.traits)": [[30, "searx.enginelib.traits.EngineTraits", false]], "enginetraitsencoder (class in searx.enginelib.traits)": [[30, "searx.enginelib.traits.EngineTraitsEncoder", false]], "enginetraitsmap (class in searx.enginelib.traits)": [[30, "searx.enginelib.traits.EngineTraitsMap", false]], "eval_xpath() (in module searx.utils)": [[100, "searx.utils.eval_xpath", false]], "eval_xpath_getindex() (in module searx.utils)": [[100, "searx.utils.eval_xpath_getindex", false]], "eval_xpath_list() (in module searx.utils)": [[100, "searx.utils.eval_xpath_list", false]], "extract() (in module searx.babel_extract)": [[89, "searx.babel_extract.extract", false]], "extract_text() (in module searx.utils)": [[100, "searx.utils.extract_text", false]], "extract_url() (in module searx.utils)": [[100, "searx.utils.extract_url", false]], "family_filter_map (in module searx.engines.dailymotion)": [[45, "searx.engines.dailymotion.family_filter_map", false]], "fetch_traits (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.fetch_traits", false]], "fetch_traits() (in module searx.engines.annas_archive)": [[39, "searx.engines.annas_archive.fetch_traits", false]], "fetch_traits() (in module searx.engines.archlinux)": [[40, "searx.engines.archlinux.fetch_traits", false]], "fetch_traits() (in module searx.engines.bing)": [[41, "searx.engines.bing.fetch_traits", false]], "fetch_traits() (in module searx.engines.bing_news)": [[41, "searx.engines.bing_news.fetch_traits", false]], "fetch_traits() (in module searx.engines.brave)": [[43, "searx.engines.brave.fetch_traits", false]], "fetch_traits() (in module searx.engines.dailymotion)": [[45, "searx.engines.dailymotion.fetch_traits", false]], "fetch_traits() (in module searx.engines.duckduckgo)": [[46, "searx.engines.duckduckgo.fetch_traits", false]], "fetch_traits() (in module searx.engines.google)": [[47, "searx.engines.google.fetch_traits", false]], "fetch_traits() (in module searx.engines.mullvad_leta)": [[53, "searx.engines.mullvad_leta.fetch_traits", false]], "fetch_traits() (in module searx.engines.odysee)": [[55, "searx.engines.odysee.fetch_traits", false]], "fetch_traits() (in module searx.engines.peertube)": [[56, "searx.engines.peertube.fetch_traits", false]], "fetch_traits() (in module searx.engines.radio_browser)": [[60, "searx.engines.radio_browser.fetch_traits", false]], "fetch_traits() (in module searx.engines.startpage)": [[63, "searx.engines.startpage.fetch_traits", false]], "fetch_traits() (in module searx.engines.wikidata)": [[68, "searx.engines.wikidata.fetch_traits", false]], "fetch_traits() (in module searx.engines.yahoo)": [[70, "searx.engines.yahoo.fetch_traits", false]], "fetch_traits() (in module searx.engines.zlibrary)": [[71, "searx.engines.zlibrary.fetch_traits", false]], "fetch_traits() (searx.enginelib.traits.enginetraits class method)": [[30, "searx.enginelib.traits.EngineTraits.fetch_traits", false]], "fetch_traits_map() (in module searxng_extra.update.update_engine_traits)": [[84, "searxng_extra.update.update_engine_traits.fetch_traits_map", false]], "fetch_wikimedia_traits() (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.fetch_wikimedia_traits", false]], "filter_locales() (in module searxng_extra.update.update_engine_traits)": [[84, "searxng_extra.update.update_engine_traits.filter_locales", false]], "first_page_num (in module searx.engines.xpath)": [[73, "searx.engines.xpath.first_page_num", false]], "folder (searx.infopage.infopageset attribute)": [[92, "searx.infopage.InfoPageSet.folder", false]], "format_not_supported (in module searx.engines.tineye)": [[72, "searx.engines.tineye.FORMAT_NOT_SUPPORTED", false]], "formatter (class in searxng_extra.update.update_pygments)": [[84, "searxng_extra.update.update_pygments.Formatter", false]], "from_data() (searx.enginelib.traits.enginetraitsmap class method)": [[30, "searx.enginelib.traits.EngineTraitsMap.from_data", false]], "frontend_url (in module searx.engines.piped)": [[57, "searx.engines.piped.frontend_url", false]], "gen_useragent() (in module searx.utils)": [[100, "searx.utils.gen_useragent", false]], "get() (searx.botdetection.config.config method)": [[90, "searx.botdetection.config.Config.get", false]], "get_attribute() (in module searx.engines.torznab)": [[65, "searx.engines.torznab.get_attribute", false]], "get_ctx() (searx.infopage.infopage method)": [[92, "searx.infopage.InfoPage.get_ctx", false]], "get_ddg_lang() (in module searx.engines.duckduckgo)": [[46, "searx.engines.duckduckgo.get_ddg_lang", false]], "get_engine_from_settings() (in module searx.utils)": [[100, "searx.utils.get_engine_from_settings", false]], "get_engine_locale() (in module searx.locales)": [[93, "searx.locales.get_engine_locale", false]], "get_google_info() (in module searx.engines.google)": [[47, "searx.engines.google.get_google_info", false]], "get_language() (searx.enginelib.traits.enginetraits method)": [[30, "searx.enginelib.traits.EngineTraits.get_language", false]], "get_locale() (in module searx.locales)": [[93, "searx.locales.get_locale", false]], "get_locale_descr() (in module searxng_extra.update.update_locales)": [[84, "searxng_extra.update.update_locales.get_locale_descr", false]], "get_network() (in module searx.botdetection)": [[90, "searx.botdetection.get_network", false]], "get_official_locales() (in module searx.locales)": [[93, "searx.locales.get_official_locales", false]], "get_output() (in module searxng_extra.update.update_engine_descriptions)": [[84, "searxng_extra.update.update_engine_descriptions.get_output", false]], "get_page() (searx.infopage.infopageset method)": [[92, "searx.infopage.InfoPageSet.get_page", false]], "get_params() (searx.search.processors.abstract.engineprocessor method)": [[99, "searx.search.processors.abstract.EngineProcessor.get_params", false]], "get_params() (searx.search.processors.online.onlineprocessor method)": [[99, "searx.search.processors.online.OnlineProcessor.get_params", false]], "get_params() (searx.search.processors.online_currency.onlinecurrencyprocessor method)": [[99, "searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params", false]], "get_params() (searx.search.processors.online_dictionary.onlinedictionaryprocessor method)": [[99, "searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params", false]], "get_params() (searx.search.processors.online_url_search.onlineurlsearchprocessor method)": [[99, "searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params", false]], "get_ping_key() (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.get_ping_key", false]], "get_real_ip() (in module searx.botdetection)": [[90, "searx.botdetection.get_real_ip", false]], "get_region() (searx.enginelib.traits.enginetraits method)": [[30, "searx.enginelib.traits.EngineTraits.get_region", false]], "get_sc_code() (in module searx.engines.startpage)": [[63, "searx.engines.startpage.get_sc_code", false]], "get_search_query() (in module searxng_extra.standalone_searx)": [[83, "searxng_extra.standalone_searx.get_search_query", false]], "get_thumbnail() (in module searx.engines.wikidata)": [[68, "searx.engines.wikidata.get_thumbnail", false]], "get_token() (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.get_token", false]], "get_torrent_size() (in module searx.utils)": [[100, "searx.utils.get_torrent_size", false]], "get_torznab_attribute() (in module searx.engines.torznab)": [[65, "searx.engines.torznab.get_torznab_attribute", false]], "get_translation_locales() (in module searx.locales)": [[93, "searx.locales.get_translation_locales", false]], "get_translations() (in module searx.locales)": [[93, "searx.locales.get_translations", false]], "get_unicode_flag() (in module searxng_extra.update.update_engine_traits)": [[84, "searxng_extra.update.update_engine_traits.get_unicode_flag", false]], "get_vqd() (in module searx.engines.duckduckgo)": [[46, "searx.engines.duckduckgo.get_vqd", false]], "get_wiki_params() (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.get_wiki_params", false]], "get_xpath() (in module searx.utils)": [[100, "searx.utils.get_xpath", false]], "goggles (in module searx.engines.brave)": [[43, "searx.engines.brave.Goggles", false]], "google_complete() (in module searx.autocomplete)": [[47, "searx.autocomplete.google_complete", false]], "headers (in module searx.engines.xpath)": [[73, "searx.engines.xpath.headers", false]], "html (searx.infopage.infopage property)": [[92, "searx.infopage.InfoPage.html", false]], "html_to_text() (in module searx.utils)": [[100, "searx.utils.html_to_text", false]], "http_digest_auth_pass (in module searx.engines.yacy)": [[69, "searx.engines.yacy.http_digest_auth_pass", false]], "http_digest_auth_user (in module searx.engines.yacy)": [[69, "searx.engines.yacy.http_digest_auth_user", false]], "humanize_bytes() (in module searx.utils)": [[100, "searx.utils.humanize_bytes", false]], "iframe_src (in module searx.engines.dailymotion)": [[45, "searx.engines.dailymotion.iframe_src", false]], "inactive (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.inactive", false]], "incr_counter() (in module searx.redislib)": [[97, "searx.redislib.incr_counter", false]], "incr_sliding_window() (in module searx.redislib)": [[97, "searx.redislib.incr_sliding_window", false]], "infopage (class in searx.infopage)": [[92, "searx.infopage.InfoPage", false]], "infopageset (class in searx.infopage)": [[92, "searx.infopage.InfoPageSet", false]], "init() (in module searx.engines.annas_archive)": [[39, "searx.engines.annas_archive.init", false]], "init() (in module searx.engines.demo_offline)": [[27, "searx.engines.demo_offline.init", false]], "init() (in module searx.engines.demo_online)": [[28, "searx.engines.demo_online.init", false]], "init() (in module searx.engines.mrs)": [[52, "searx.engines.mrs.init", false]], "init() (in module searx.engines.torznab)": [[65, "searx.engines.torznab.init", false]], "init() (in module searx.engines.zlibrary)": [[71, "searx.engines.zlibrary.init", false]], "initialize() (in module searx.limiter)": [[13, "searx.limiter.initialize", false]], "int_or_zero() (in module searx.utils)": [[100, "searx.utils.int_or_zero", false]], "is_broken_text() (in module searx.engines.duckduckgo_definitions)": [[46, "searx.engines.duckduckgo_definitions.is_broken_text", false]], "is_installed() (in module searx.limiter)": [[13, "searx.limiter.is_installed", false]], "is_locale_supported() (searx.enginelib.traits.enginetraits method)": [[30, "searx.enginelib.traits.EngineTraits.is_locale_supported", false]], "is_missing_required_attributes() (in module searx.engines)": [[31, "searx.engines.is_missing_required_attributes", false]], "is_suspicious() (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.is_suspicious", false]], "is_valid_lang() (in module searx.utils)": [[100, "searx.utils.is_valid_lang", false]], "is_vpn_connected() (in module searx.engines.mullvad_leta)": [[53, "searx.engines.mullvad_leta.is_vpn_connected", false]], "iter_pages() (searx.infopage.infopageset method)": [[92, "searx.infopage.InfoPageSet.iter_pages", false]], "js_variable_to_python() (in module searx.utils)": [[100, "searx.utils.js_variable_to_python", false]], "json_serial() (in module searxng_extra.standalone_searx)": [[83, "searxng_extra.standalone_searx.json_serial", false]], "lang2domain (in module searx.engines.yahoo)": [[70, "searx.engines.yahoo.lang2domain", false]], "lang_all (in module searx.engines.xpath)": [[73, "searx.engines.xpath.lang_all", false]], "language (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.language", false]], "language_support (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.language_support", false]], "language_tag() (in module searx.locales)": [[93, "searx.locales.language_tag", false]], "languages (searx.enginelib.traits.enginetraits attribute)": [[30, "searx.enginelib.traits.EngineTraits.languages", false]], "lemmy_type (in module searx.engines.lemmy)": [[48, "searx.engines.lemmy.lemmy_type", false]], "limiter_cfg (in module searx.limiter)": [[13, "searx.limiter.LIMITER_CFG", false]], "limiter_cfg_schema (in module searx.limiter)": [[13, "searx.limiter.LIMITER_CFG_SCHEMA", false]], "list_of_wikipedias (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.list_of_wikipedias", false]], "load_engine() (in module searx.engines)": [[31, "searx.engines.load_engine", false]], "load_engines() (in module searx.engines)": [[31, "searx.engines.load_engines", false]], "locale_best_match (in module searx.locales)": [[93, "searx.locales.LOCALE_BEST_MATCH", false]], "locale_default (searx.infopage.infopageset attribute)": [[92, "searx.infopage.InfoPageSet.locale_default", false]], "locale_names (in module searx.locales)": [[93, "searx.locales.LOCALE_NAMES", false]], "locales (searx.infopage.infopageset attribute)": [[92, "searx.infopage.InfoPageSet.locales", false]], "locales_initialize() (in module searx.locales)": [[93, "searx.locales.locales_initialize", false]], "long_max (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.LONG_MAX", false]], "long_max_suspicious (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.LONG_MAX_SUSPICIOUS", false]], "long_window (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.LONG_WINDOW", false]], "lua_script_storage (in module searx.redislib)": [[97, "searx.redislib.LUA_SCRIPT_STORAGE", false]], "lua_script_storage() (in module searx.redislib)": [[97, "searx.redislib.lua_script_storage", false]], "markdown_to_text() (in module searx.utils)": [[100, "searx.utils.markdown_to_text", false]], "match_locale() (in module searx.locales)": [[93, "searx.locales.match_locale", false]], "max_page (in module searx.engines.bing)": [[41, "searx.engines.bing.max_page", false]], "max_page (in module searx.engines.brave)": [[43, "searx.engines.brave.max_page", false]], "max_page (in module searx.engines.qwant)": [[59, "searx.engines.qwant.max_page", false]], "max_page (in module searx.engines.startpage)": [[63, "searx.engines.startpage.max_page", false]], "merge_when_no_leaf() (in module searxng_extra.update.update_external_bangs)": [[84, "searxng_extra.update.update_external_bangs.merge_when_no_leaf", false]], "module": [[13, "module-searx.limiter", false], [27, "module-searx.engines.demo_offline", false], [28, "module-searx.engines.demo_online", false], [30, "module-searx.enginelib", false], [30, "module-searx.enginelib.traits", false], [31, "module-searx.engines", false], [33, "module-searx.engines.mediawiki", false], [34, "module-searx.engines.command", false], [35, "module-searx.engines.mongodb", false], [35, "module-searx.engines.redis_server", false], [36, "module-searx.engines.elasticsearch", false], [36, "module-searx.engines.meilisearch", false], [36, "module-searx.engines.solr", false], [37, "module-searx.engines.mysql_server", false], [37, "module-searx.engines.postgresql", false], [37, "module-searx.engines.sqlite", false], [39, "module-searx.engines.annas_archive", false], [40, "module-searx.engines.archlinux", false], [41, "module-searx.engines.bing", false], [41, "module-searx.engines.bing_images", false], [41, "module-searx.engines.bing_news", false], [41, "module-searx.engines.bing_videos", false], [42, "module-searx.engines.bpb", false], [43, "module-searx.engines.brave", false], [44, "module-searx.engines.bt4g", false], [45, "module-searx.engines.dailymotion", false], [46, "module-searx.engines.duckduckgo", false], [46, "module-searx.engines.duckduckgo_definitions", false], [46, "module-searx.engines.duckduckgo_extra", false], [46, "module-searx.engines.duckduckgo_weather", false], [47, "module-searx.engines.google", false], [47, "module-searx.engines.google_images", false], [47, "module-searx.engines.google_news", false], [47, "module-searx.engines.google_scholar", false], [47, "module-searx.engines.google_videos", false], [48, "module-searx.engines.lemmy", false], [49, "module-searx.engines.loc", false], [50, "module-searx.engines.mastodon", false], [51, "module-searx.engines.moviepilot", false], [52, "module-searx.engines.mrs", false], [53, "module-searx.engines.mullvad_leta", false], [54, "module-searx.engines.mwmbl", false], [55, "module-searx.engines.odysee", false], [56, "module-searx.engines.peertube", false], [56, "module-searx.engines.sepiasearch", false], [57, "module-searx.engines.piped", false], [58, "module-searx.engines.presearch", false], [59, "module-searx.engines.qwant", false], [60, "module-searx.engines.radio_browser", false], [61, "module-searx.engines.recoll", false], [62, "module-searx.engines.seekr", false], [63, "module-searx.engines.startpage", false], [64, "module-searx.engines.tagesschau", false], [65, "module-searx.engines.torznab", false], [66, "module-searx.engines.voidlinux", false], [67, "module-searx.engines.wallhaven", false], [68, "module-searx.engines.wikidata", false], [68, "module-searx.engines.wikipedia", false], [69, "module-searx.engines.yacy", false], [70, "module-searx.engines.yahoo", false], [71, "module-searx.engines.zlibrary", false], [72, "module-searx.engines.tineye", false], [73, "module-searx.engines.xpath", false], [83, "module-searxng_extra.standalone_searx", false], [84, "module-searxng_extra.update.update_ahmia_blacklist", false], [84, "module-searxng_extra.update.update_currencies", false], [84, "module-searxng_extra.update.update_engine_descriptions", false], [84, "module-searxng_extra.update.update_engine_traits", false], [84, "module-searxng_extra.update.update_external_bangs", false], [84, "module-searxng_extra.update.update_firefox_version", false], [84, "module-searxng_extra.update.update_locales", false], [84, "module-searxng_extra.update.update_osm_keys_tags", false], [84, "module-searxng_extra.update.update_pygments", false], [84, "module-searxng_extra.update.update_wikidata_units", false], [89, "module-searx.babel_extract", false], [90, "module-searx.botdetection", false], [90, "module-searx.botdetection.config", false], [90, "module-searx.botdetection.http_accept", false], [90, "module-searx.botdetection.http_accept_encoding", false], [90, "module-searx.botdetection.http_accept_language", false], [90, "module-searx.botdetection.http_connection", false], [90, "module-searx.botdetection.http_user_agent", false], [90, "module-searx.botdetection.ip_limit", false], [90, "module-searx.botdetection.ip_lists", false], [90, "module-searx.botdetection.link_token", false], [91, "module-searx.exceptions", false], [92, "module-searx.infopage", false], [93, "module-searx.locales", false], [93, "module-searx.sxng_locales", false], [94, "module-searx.plugins.tor_check", false], [95, "module-searx.plugins.unit_converter", false], [96, "module-searx.redisdb", false], [97, "module-searx.redislib", false], [99, "module-searx.search.processors.abstract", false], [99, "module-searx.search.processors.offline", false], [99, "module-searx.search.processors.online", false], [99, "module-searx.search.processors.online_currency", false], [99, "module-searx.search.processors.online_dictionary", false], [99, "module-searx.search.processors.online_url_search", false], [100, "module-searx.utils", false]], "mwmbl() (in module searx.autocomplete)": [[54, "searx.autocomplete.mwmbl", false]], "name (in module searx.plugins.tor_check)": [[94, "searx.plugins.tor_check.name", false]], "name (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.name", false]], "no_parsed_url() (in module searxng_extra.standalone_searx)": [[83, "searxng_extra.standalone_searx.no_parsed_url", false]], "no_result_for_http_status (in module searx.engines.xpath)": [[73, "searx.engines.xpath.no_result_for_http_status", false]], "no_signature_error (in module searx.engines.tineye)": [[72, "searx.engines.tineye.NO_SIGNATURE_ERROR", false]], "normalize_url() (in module searx.utils)": [[100, "searx.utils.normalize_url", false]], "offlineprocessor (class in searx.search.processors.offline)": [[99, "searx.search.processors.offline.OfflineProcessor", false]], "old_redis_url_default_url (in module searx.redisdb)": [[96, "searx.redisdb.OLD_REDIS_URL_DEFAULT_URL", false]], "on_result()": [[77, "on_result", false]], "onlinecurrencyprocessor (class in searx.search.processors.online_currency)": [[99, "searx.search.processors.online_currency.OnlineCurrencyProcessor", false]], "onlinedictionaryprocessor (class in searx.search.processors.online_dictionary)": [[99, "searx.search.processors.online_dictionary.OnlineDictionaryProcessor", false]], "onlineprocessor (class in searx.search.processors.online)": [[99, "searx.search.processors.online.OnlineProcessor", false]], "onlineurlsearchprocessor (class in searx.search.processors.online_url_search)": [[99, "searx.search.processors.online_url_search.OnlineUrlSearchProcessor", false]], "ordered_plugin_list (searx.search.searchwithplugins attribute)": [[98, "searx.search.SearchWithPlugins.ordered_plugin_list", false]], "page_size (in module searx.engines.xpath)": [[73, "searx.engines.xpath.page_size", false]], "paging (in module searx.engines.bing_news)": [[41, "searx.engines.bing_news.paging", false]], "paging (in module searx.engines.brave)": [[43, "searx.engines.brave.paging", false]], "paging (in module searx.engines.xpath)": [[73, "searx.engines.xpath.paging", false]], "paging (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.paging", false]], "parse_argument() (in module searxng_extra.standalone_searx)": [[83, "searxng_extra.standalone_searx.parse_argument", false]], "parse_gs_a() (in module searx.engines.google_scholar)": [[47, "searx.engines.google_scholar.parse_gs_a", false]], "parse_tineye_match() (in module searx.engines.tineye)": [[72, "searx.engines.tineye.parse_tineye_match", false]], "parse_url() (in module searx.engines.yahoo)": [[70, "searx.engines.yahoo.parse_url", false]], "parse_web_api() (in module searx.engines.qwant)": [[59, "searx.engines.qwant.parse_web_api", false]], "parse_web_lite() (in module searx.engines.qwant)": [[59, "searx.engines.qwant.parse_web_lite", false]], "pass_ip() (in module searx.botdetection.ip_lists)": [[90, "searx.botdetection.ip_lists.pass_ip", false]], "path() (searx.botdetection.config.config method)": [[90, "searx.botdetection.config.Config.path", false]], "pep 8": [[79, "index-1", false]], "ping() (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.ping", false]], "ping_key (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.PING_KEY", false]], "ping_live_time (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.PING_LIVE_TIME", false]], "piped_filter (in module searx.engines.piped)": [[57, "searx.engines.piped.piped_filter", false]], "post_search()": [[77, "post_search", false]], "pre_request() (in module searx.limiter)": [[13, "searx.limiter.pre_request", false]], "pre_search()": [[77, "pre_search", false]], "preference_section (in module searx.plugins.tor_check)": [[94, "searx.plugins.tor_check.preference_section", false]], "proxies (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.proxies", false]], "purge_by_prefix() (in module searx.redislib)": [[97, "searx.redislib.purge_by_prefix", false]], "pyobj() (searx.botdetection.config.config method)": [[90, "searx.botdetection.config.Config.pyobj", false]], "python enhancement proposals": [[79, "index-1", false]], "query_examples (in module searx.plugins.tor_check)": [[94, "searx.plugins.tor_check.query_examples", false]], "query_keywords (in module searx.plugins.tor_check)": [[94, "searx.plugins.tor_check.query_keywords", false]], "qwant_categ (in module searx.engines.qwant)": [[59, "searx.engines.qwant.qwant_categ", false]], "raw_content (searx.infopage.infopage property)": [[92, "searx.infopage.InfoPage.raw_content", false]], "region (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.region", false]], "region_tag() (in module searx.locales)": [[93, "searx.locales.region_tag", false]], "regions (searx.enginelib.traits.enginetraits attribute)": [[30, "searx.enginelib.traits.EngineTraits.regions", false]], "request (searx.search.searchwithplugins attribute)": [[98, "searx.search.SearchWithPlugins.request", false]], "request() (in module searx.engines.bing)": [[41, "searx.engines.bing.request", false]], "request() (in module searx.engines.bing_images)": [[41, "searx.engines.bing_images.request", false]], "request() (in module searx.engines.bing_news)": [[41, "searx.engines.bing_news.request", false]], "request() (in module searx.engines.bing_videos)": [[41, "searx.engines.bing_videos.request", false]], "request() (in module searx.engines.demo_online)": [[28, "searx.engines.demo_online.request", false]], "request() (in module searx.engines.google)": [[47, "searx.engines.google.request", false]], "request() (in module searx.engines.google_images)": [[47, "searx.engines.google_images.request", false]], "request() (in module searx.engines.google_news)": [[47, "searx.engines.google_news.request", false]], "request() (in module searx.engines.google_scholar)": [[47, "searx.engines.google_scholar.request", false]], "request() (in module searx.engines.google_videos)": [[47, "searx.engines.google_videos.request", false]], "request() (in module searx.engines.peertube)": [[56, "searx.engines.peertube.request", false]], "request() (in module searx.engines.qwant)": [[59, "searx.engines.qwant.request", false]], "request() (in module searx.engines.sepiasearch)": [[56, "searx.engines.sepiasearch.request", false]], "request() (in module searx.engines.startpage)": [[63, "searx.engines.startpage.request", false]], "request() (in module searx.engines.tineye)": [[72, "searx.engines.tineye.request", false]], "request() (in module searx.engines.torznab)": [[65, "searx.engines.torznab.request", false]], "request() (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.request", false]], "request() (in module searx.engines.xpath)": [[73, "searx.engines.xpath.request", false]], "request() (in module searx.engines.yahoo)": [[70, "searx.engines.yahoo.request", false]], "response() (in module searx.engines.bing_images)": [[41, "searx.engines.bing_images.response", false]], "response() (in module searx.engines.bing_news)": [[41, "searx.engines.bing_news.response", false]], "response() (in module searx.engines.bing_videos)": [[41, "searx.engines.bing_videos.response", false]], "response() (in module searx.engines.demo_online)": [[28, "searx.engines.demo_online.response", false]], "response() (in module searx.engines.google)": [[47, "searx.engines.google.response", false]], "response() (in module searx.engines.google_images)": [[47, "searx.engines.google_images.response", false]], "response() (in module searx.engines.google_news)": [[47, "searx.engines.google_news.response", false]], "response() (in module searx.engines.google_scholar)": [[47, "searx.engines.google_scholar.response", false]], "response() (in module searx.engines.google_videos)": [[47, "searx.engines.google_videos.response", false]], "response() (in module searx.engines.mullvad_leta)": [[53, "searx.engines.mullvad_leta.response", false]], "response() (in module searx.engines.tineye)": [[72, "searx.engines.tineye.response", false]], "response() (in module searx.engines.torznab)": [[65, "searx.engines.torznab.response", false]], "response() (in module searx.engines.voidlinux)": [[66, "searx.engines.voidlinux.response", false]], "response() (in module searx.engines.xpath)": [[73, "searx.engines.xpath.response", false]], "response() (in module searx.engines.yahoo)": [[70, "searx.engines.yahoo.response", false]], "rest_v1_summary_url (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.rest_v1_summary_url", false]], "result_container (searx.search.search attribute)": [[98, "searx.search.Search.result_container", false]], "result_container (searx.search.searchwithplugins attribute)": [[98, "searx.search.SearchWithPlugins.result_container", false]], "result_fields (in module searx.engines.dailymotion)": [[45, "searx.engines.dailymotion.result_fields", false]], "results_xpath (in module searx.engines.xpath)": [[73, "searx.engines.xpath.results_xpath", false]], "rfc": [[79, "index-0", false]], "rfc 822": [[79, "index-0", false]], "rtl_locales (in module searx.locales)": [[93, "searx.locales.RTL_LOCALES", false]], "safe_search_map (in module searx.engines.xpath)": [[73, "searx.engines.xpath.safe_search_map", false]], "safe_search_support (in module searx.engines.xpath)": [[73, "searx.engines.xpath.safe_search_support", false]], "safesearch (in module searx.engines.bing)": [[41, "searx.engines.bing.safesearch", false]], "safesearch (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.safesearch", false]], "safesearch_map (in module searx.engines.wallhaven)": [[67, "searx.engines.wallhaven.safesearch_map", false]], "safesearch_params (in module searx.engines.dailymotion)": [[45, "searx.engines.dailymotion.safesearch_params", false]], "save_data() (searx.enginelib.traits.enginetraitsmap method)": [[30, "searx.enginelib.traits.EngineTraitsMap.save_data", false]], "sc_code_cache_sec (in module searx.engines.startpage)": [[63, "searx.engines.startpage.sc_code_cache_sec", false]], "schemaissue": [[90, "searx.botdetection.config.SchemaIssue", false]], "search (class in searx.search)": [[98, "searx.search.Search", false]], "search() (in module searx.engines.demo_offline)": [[27, "searx.engines.demo_offline.search", false]], "search() (searx.search.search method)": [[98, "searx.search.Search.search", false]], "search() (searx.search.searchwithplugins method)": [[98, "searx.search.SearchWithPlugins.search", false]], "search_form_xpath (in module searx.engines.startpage)": [[63, "searx.engines.startpage.search_form_xpath", false]], "search_language_codes (in module searx.utils)": [[100, "searx.utils.SEARCH_LANGUAGE_CODES", false]], "search_mode (in module searx.engines.yacy)": [[69, "searx.engines.yacy.search_mode", false]], "search_query (searx.search.search attribute)": [[98, "searx.search.Search.search_query", false]], "search_query (searx.search.searchwithplugins attribute)": [[98, "searx.search.SearchWithPlugins.search_query", false]], "search_type (in module searx.engines.mediawiki)": [[33, "searx.engines.mediawiki.search_type", false]], "search_type (in module searx.engines.presearch)": [[58, "searx.engines.presearch.search_type", false]], "search_type (in module searx.engines.yacy)": [[69, "searx.engines.yacy.search_type", false]], "search_url (in module searx.engines.dailymotion)": [[45, "searx.engines.dailymotion.search_url", false]], "search_url (in module searx.engines.xpath)": [[73, "searx.engines.xpath.search_url", false]], "searchquery (class in searx.search)": [[98, "searx.search.SearchQuery", false]], "searchwithplugins (class in searx.search)": [[98, "searx.search.SearchWithPlugins", false]], "searx.babel_extract": [[89, "module-searx.babel_extract", false]], "searx.botdetection": [[90, "module-searx.botdetection", false]], "searx.botdetection.config": [[90, "module-searx.botdetection.config", false]], "searx.botdetection.http_accept": [[90, "module-searx.botdetection.http_accept", false]], "searx.botdetection.http_accept_encoding": [[90, "module-searx.botdetection.http_accept_encoding", false]], "searx.botdetection.http_accept_language": [[90, "module-searx.botdetection.http_accept_language", false]], "searx.botdetection.http_connection": [[90, "module-searx.botdetection.http_connection", false]], "searx.botdetection.http_user_agent": [[90, "module-searx.botdetection.http_user_agent", false]], "searx.botdetection.ip_limit": [[90, "module-searx.botdetection.ip_limit", false]], "searx.botdetection.ip_lists": [[90, "module-searx.botdetection.ip_lists", false]], "searx.botdetection.link_token": [[90, "module-searx.botdetection.link_token", false]], "searx.enginelib": [[30, "module-searx.enginelib", false]], "searx.enginelib.traits": [[30, "module-searx.enginelib.traits", false]], "searx.engines": [[31, "module-searx.engines", false]], "searx.engines.annas_archive": [[39, "module-searx.engines.annas_archive", false]], "searx.engines.archlinux": [[40, "module-searx.engines.archlinux", false]], "searx.engines.bing": [[41, "module-searx.engines.bing", false]], "searx.engines.bing_images": [[41, "module-searx.engines.bing_images", false]], "searx.engines.bing_news": [[41, "module-searx.engines.bing_news", false]], "searx.engines.bing_videos": [[41, "module-searx.engines.bing_videos", false]], "searx.engines.bpb": [[42, "module-searx.engines.bpb", false]], "searx.engines.brave": [[43, "module-searx.engines.brave", false]], "searx.engines.bt4g": [[44, "module-searx.engines.bt4g", false]], "searx.engines.command": [[34, "module-searx.engines.command", false]], "searx.engines.dailymotion": [[45, "module-searx.engines.dailymotion", false]], "searx.engines.demo_offline": [[27, "module-searx.engines.demo_offline", false]], "searx.engines.demo_online": [[28, "module-searx.engines.demo_online", false]], "searx.engines.duckduckgo": [[46, "module-searx.engines.duckduckgo", false]], "searx.engines.duckduckgo_definitions": [[46, "module-searx.engines.duckduckgo_definitions", false]], "searx.engines.duckduckgo_extra": [[46, "module-searx.engines.duckduckgo_extra", false]], "searx.engines.duckduckgo_weather": [[46, "module-searx.engines.duckduckgo_weather", false]], "searx.engines.elasticsearch": [[36, "module-searx.engines.elasticsearch", false]], "searx.engines.google": [[47, "module-searx.engines.google", false]], "searx.engines.google_images": [[47, "module-searx.engines.google_images", false]], "searx.engines.google_news": [[47, "module-searx.engines.google_news", false]], "searx.engines.google_scholar": [[47, "module-searx.engines.google_scholar", false]], "searx.engines.google_videos": [[47, "module-searx.engines.google_videos", false]], "searx.engines.lemmy": [[48, "module-searx.engines.lemmy", false]], "searx.engines.loc": [[49, "module-searx.engines.loc", false]], "searx.engines.mastodon": [[50, "module-searx.engines.mastodon", false]], "searx.engines.mediawiki": [[33, "module-searx.engines.mediawiki", false]], "searx.engines.meilisearch": [[36, "module-searx.engines.meilisearch", false]], "searx.engines.mongodb": [[35, "module-searx.engines.mongodb", false]], "searx.engines.moviepilot": [[51, "module-searx.engines.moviepilot", false]], "searx.engines.mrs": [[52, "module-searx.engines.mrs", false]], "searx.engines.mullvad_leta": [[53, "module-searx.engines.mullvad_leta", false]], "searx.engines.mwmbl": [[54, "module-searx.engines.mwmbl", false]], "searx.engines.mysql_server": [[37, "module-searx.engines.mysql_server", false]], "searx.engines.odysee": [[55, "module-searx.engines.odysee", false]], "searx.engines.peertube": [[56, "module-searx.engines.peertube", false]], "searx.engines.piped": [[57, "module-searx.engines.piped", false]], "searx.engines.postgresql": [[37, "module-searx.engines.postgresql", false]], "searx.engines.presearch": [[58, "module-searx.engines.presearch", false]], "searx.engines.qwant": [[59, "module-searx.engines.qwant", false]], "searx.engines.radio_browser": [[60, "module-searx.engines.radio_browser", false]], "searx.engines.recoll": [[61, "module-searx.engines.recoll", false]], "searx.engines.redis_server": [[35, "module-searx.engines.redis_server", false]], "searx.engines.seekr": [[62, "module-searx.engines.seekr", false]], "searx.engines.sepiasearch": [[56, "module-searx.engines.sepiasearch", false]], "searx.engines.solr": [[36, "module-searx.engines.solr", false]], "searx.engines.sqlite": [[37, "module-searx.engines.sqlite", false]], "searx.engines.startpage": [[63, "module-searx.engines.startpage", false]], "searx.engines.tagesschau": [[64, "module-searx.engines.tagesschau", false]], "searx.engines.tineye": [[72, "module-searx.engines.tineye", false]], "searx.engines.torznab": [[65, "module-searx.engines.torznab", false]], "searx.engines.voidlinux": [[66, "module-searx.engines.voidlinux", false]], "searx.engines.wallhaven": [[67, "module-searx.engines.wallhaven", false]], "searx.engines.wikidata": [[68, "module-searx.engines.wikidata", false]], "searx.engines.wikipedia": [[68, "module-searx.engines.wikipedia", false]], "searx.engines.xpath": [[73, "module-searx.engines.xpath", false]], "searx.engines.yacy": [[69, "module-searx.engines.yacy", false]], "searx.engines.yahoo": [[70, "module-searx.engines.yahoo", false]], "searx.engines.zlibrary": [[71, "module-searx.engines.zlibrary", false]], "searx.exceptions": [[91, "module-searx.exceptions", false]], "searx.infopage": [[92, "module-searx.infopage", false]], "searx.limiter": [[13, "module-searx.limiter", false]], "searx.locales": [[93, "module-searx.locales", false]], "searx.plugins.tor_check": [[94, "module-searx.plugins.tor_check", false]], "searx.plugins.unit_converter": [[95, "module-searx.plugins.unit_converter", false]], "searx.redisdb": [[96, "module-searx.redisdb", false]], "searx.redislib": [[97, "module-searx.redislib", false]], "searx.search.processors.abstract": [[99, "module-searx.search.processors.abstract", false]], "searx.search.processors.offline": [[99, "module-searx.search.processors.offline", false]], "searx.search.processors.online": [[99, "module-searx.search.processors.online", false]], "searx.search.processors.online_currency": [[99, "module-searx.search.processors.online_currency", false]], "searx.search.processors.online_dictionary": [[99, "module-searx.search.processors.online_dictionary", false]], "searx.search.processors.online_url_search": [[99, "module-searx.search.processors.online_url_search", false]], "searx.sxng_locales": [[93, "module-searx.sxng_locales", false]], "searx.utils": [[100, "module-searx.utils", false]], "searx_useragent() (in module searx.utils)": [[100, "searx.utils.searx_useragent", false]], "searxengineaccessdeniedexception": [[91, "searx.exceptions.SearxEngineAccessDeniedException", false]], "searxengineapiexception": [[91, "searx.exceptions.SearxEngineAPIException", false]], "searxenginecaptchaexception": [[91, "searx.exceptions.SearxEngineCaptchaException", false]], "searxengineexception": [[91, "searx.exceptions.SearxEngineException", false]], "searxengineresponseexception": [[91, "searx.exceptions.SearxEngineResponseException", false]], "searxenginetoomanyrequestsexception": [[91, "searx.exceptions.SearxEngineTooManyRequestsException", false]], "searxenginexpathexception": [[91, "searx.exceptions.SearxEngineXPathException", false]], "searxexception": [[91, "searx.exceptions.SearxException", false]], "searxng_extra.standalone_searx": [[83, "module-searxng_extra.standalone_searx", false]], "searxng_extra.update.update_ahmia_blacklist": [[84, "module-searxng_extra.update.update_ahmia_blacklist", false]], "searxng_extra.update.update_currencies": [[84, "module-searxng_extra.update.update_currencies", false]], "searxng_extra.update.update_engine_descriptions": [[84, "module-searxng_extra.update.update_engine_descriptions", false]], "searxng_extra.update.update_engine_traits": [[84, "module-searxng_extra.update.update_engine_traits", false]], "searxng_extra.update.update_external_bangs": [[84, "module-searxng_extra.update.update_external_bangs", false]], "searxng_extra.update.update_firefox_version": [[84, "module-searxng_extra.update.update_firefox_version", false]], "searxng_extra.update.update_locales": [[84, "module-searxng_extra.update.update_locales", false]], "searxng_extra.update.update_osm_keys_tags": [[84, "module-searxng_extra.update.update_osm_keys_tags", false]], "searxng_extra.update.update_pygments": [[84, "module-searxng_extra.update.update_pygments", false]], "searxng_extra.update.update_wikidata_units": [[84, "module-searxng_extra.update.update_wikidata_units", false]], "searxng_org (in module searx.botdetection.ip_lists)": [[90, "searx.botdetection.ip_lists.SEARXNG_ORG", false]], "searxparameterexception": [[91, "searx.exceptions.SearxParameterException", false]], "searxsettingsexception": [[91, "searx.exceptions.SearxSettingsException", false]], "searxxpathsyntaxexception": [[91, "searx.exceptions.SearxXPathSyntaxException", false]], "secret_hash() (in module searx.redislib)": [[97, "searx.redislib.secret_hash", false]], "seekr_category (in module searx.engines.seekr)": [[62, "searx.engines.seekr.seekr_category", false]], "send_accept_language_header (in module searx.engines.duckduckgo)": [[46, "searx.engines.duckduckgo.send_accept_language_header", false]], "send_accept_language_header (in module searx.engines.startpage)": [[63, "searx.engines.startpage.send_accept_language_header", false]], "send_accept_language_header (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.send_accept_language_header", false]], "send_accept_language_header (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.send_accept_language_header", false]], "set() (searx.botdetection.config.config method)": [[90, "searx.botdetection.config.Config.set", false]], "set_traits() (searx.enginelib.traits.enginetraits method)": [[30, "searx.enginelib.traits.EngineTraits.set_traits", false]], "set_traits() (searx.enginelib.traits.enginetraitsmap method)": [[30, "searx.enginelib.traits.EngineTraitsMap.set_traits", false]], "shortcut (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.shortcut", false]], "soft_max_redirects (in module searx.engines.xpath)": [[73, "searx.engines.xpath.soft_max_redirects", false]], "sqlite_cursor() (in module searx.engines.sqlite)": [[37, "searx.engines.sqlite.sqlite_cursor", false]], "srenablerewrites (in module searx.engines.mediawiki)": [[33, "searx.engines.mediawiki.srenablerewrites", false]], "srprop (in module searx.engines.mediawiki)": [[33, "searx.engines.mediawiki.srprop", false]], "srsort (in module searx.engines.mediawiki)": [[33, "searx.engines.mediawiki.srsort", false]], "startpage_categ (in module searx.engines.startpage)": [[63, "searx.engines.startpage.startpage_categ", false]], "station_filters (in module searx.engines.radio_browser)": [[60, "searx.engines.radio_browser.station_filters", false]], "suggestion_xpath (in module searx.engines.xpath)": [[73, "searx.engines.xpath.suggestion_xpath", false]], "suspend_time_setting (searx.exceptions.searxengineaccessdeniedexception attribute)": [[91, "searx.exceptions.SearxEngineAccessDeniedException.SUSPEND_TIME_SETTING", false]], "suspend_time_setting (searx.exceptions.searxenginecaptchaexception attribute)": [[91, "searx.exceptions.SearxEngineCaptchaException.SUSPEND_TIME_SETTING", false]], "suspend_time_setting (searx.exceptions.searxenginetoomanyrequestsexception attribute)": [[91, "searx.exceptions.SearxEngineTooManyRequestsException.SUSPEND_TIME_SETTING", false]], "suspendedstatus (class in searx.search.processors.abstract)": [[99, "searx.search.processors.abstract.SuspendedStatus", false]], "suspicious_ip_max (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.SUSPICIOUS_IP_MAX", false]], "suspicious_ip_window (in module searx.botdetection.ip_limit)": [[90, "searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW", false]], "sxng_locales (in module searx.sxng_locales)": [[93, "searx.sxng_locales.sxng_locales", false]], "symbol_to_si() (in module searx.plugins.unit_converter)": [[95, "searx.plugins.unit_converter.symbol_to_si", false]], "thumbnail_xpath (in module searx.engines.xpath)": [[73, "searx.engines.xpath.thumbnail_xpath", false]], "time_map (in module searx.engines.bing_news)": [[41, "searx.engines.bing_news.time_map", false]], "time_range_args() (in module searx.engines.google_scholar)": [[47, "searx.engines.google_scholar.time_range_args", false]], "time_range_map (in module searx.engines.xpath)": [[73, "searx.engines.xpath.time_range_map", false]], "time_range_support (in module searx.engines.brave)": [[43, "searx.engines.brave.time_range_support", false]], "time_range_support (in module searx.engines.xpath)": [[73, "searx.engines.xpath.time_range_support", false]], "time_range_support (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.time_range_support", false]], "time_range_url (in module searx.engines.xpath)": [[73, "searx.engines.xpath.time_range_url", false]], "timeout (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.timeout", false]], "timestamp_format (in module searx.engines.mediawiki)": [[33, "searx.engines.mediawiki.timestamp_format", false]], "title (searx.infopage.infopage property)": [[92, "searx.infopage.InfoPage.title", false]], "title_xpath (in module searx.engines.xpath)": [[73, "searx.engines.xpath.title_xpath", false]], "to_dict() (in module searxng_extra.standalone_searx)": [[83, "searxng_extra.standalone_searx.to_dict", false]], "to_string() (in module searx.utils)": [[100, "searx.utils.to_string", false]], "toc (searx.infopage.infopageset attribute)": [[92, "searx.infopage.InfoPageSet.toc", false]], "token_key (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.TOKEN_KEY", false]], "token_live_time (in module searx.botdetection.link_token)": [[90, "searx.botdetection.link_token.TOKEN_LIVE_TIME", false]], "tokens (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.tokens", false]], "too_many_requests() (in module searx.botdetection)": [[90, "searx.botdetection.too_many_requests", false]], "traits (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.traits", false]], "ui_async (in module searx.engines.google)": [[47, "searx.engines.google.UI_ASYNC", false]], "unicodeescape (class in searxng_extra.update.update_engine_traits)": [[84, "searxng_extra.update.update_engine_traits.UnicodeEscape", false]], "update() (searx.botdetection.config.config method)": [[90, "searx.botdetection.config.Config.update", false]], "url_xpath (in module searx.engines.xpath)": [[73, "searx.engines.xpath.url_xpath", false]], "use_source_url (in module searx.engines.tagesschau)": [[64, "searx.engines.tagesschau.use_source_url", false]], "user_agent (in module searx.botdetection.http_user_agent)": [[90, "searx.botdetection.http_user_agent.USER_AGENT", false]], "using_tor_proxy (searx.enginelib.engine attribute)": [[30, "searx.enginelib.Engine.using_tor_proxy", false]], "using_tor_proxy() (in module searx.engines)": [[31, "searx.engines.using_tor_proxy", false]], "validate() (searx.botdetection.config.config method)": [[90, "searx.botdetection.config.Config.validate", false]], "video_response() (in module searx.engines.peertube)": [[56, "searx.engines.peertube.video_response", false]], "void_arch (in module searx.engines.voidlinux)": [[66, "searx.engines.voidlinux.void_arch", false]], "web_lite_url (in module searx.engines.qwant)": [[59, "searx.engines.qwant.web_lite_url", false]], "wiki_lc_locale_variants (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.wiki_lc_locale_variants", false]], "wikipedia_article_depth (in module searx.engines.wikipedia)": [[68, "searx.engines.wikipedia.wikipedia_article_depth", false]], "zlib_ext (in module searx.engines.zlibrary)": [[71, "searx.engines.zlibrary.zlib_ext", false]], "zlib_year_from (in module searx.engines.zlibrary)": [[71, "searx.engines.zlibrary.zlib_year_from", false]], "zlib_year_to (in module searx.engines.zlibrary)": [[71, "searx.engines.zlibrary.zlib_year_to", false]]}, "objects": {"": [[77, 0, 1, "", "on_result"], [77, 0, 1, "", "post_search"], [77, 0, 1, "", "pre_search"]], "searx": [[89, 1, 0, "-", "babel_extract"], [90, 1, 0, "-", "botdetection"], [30, 1, 0, "-", "enginelib"], [31, 1, 0, "-", "engines"], [91, 1, 0, "-", "exceptions"], [92, 1, 0, "-", "infopage"], [13, 1, 0, "-", "limiter"], [93, 1, 0, "-", "locales"], [96, 1, 0, "-", "redisdb"], [97, 1, 0, "-", "redislib"], [93, 1, 0, "-", "sxng_locales"], [100, 1, 0, "-", "utils"]], "searx.autocomplete": [[47, 0, 1, "", "google_complete"], [54, 0, 1, "", "mwmbl"]], "searx.babel_extract": [[89, 0, 1, "", "extract"]], "searx.botdetection": [[90, 1, 0, "-", "config"], [90, 0, 1, "", "get_network"], [90, 0, 1, "", "get_real_ip"], [90, 1, 0, "-", "http_accept"], [90, 1, 0, "-", "http_accept_encoding"], [90, 1, 0, "-", "http_accept_language"], [90, 1, 0, "-", "http_connection"], [90, 1, 0, "-", "http_user_agent"], [90, 1, 0, "-", "ip_limit"], [90, 1, 0, "-", "ip_lists"], [90, 1, 0, "-", "link_token"], [90, 0, 1, "", "too_many_requests"]], "searx.botdetection.config": [[90, 2, 1, "", "Config"], [90, 4, 1, "", "SchemaIssue"]], "searx.botdetection.config.Config": [[90, 3, 1, "", "default"], [90, 3, 1, "", "get"], [90, 3, 1, "", "path"], [90, 3, 1, "", "pyobj"], [90, 3, 1, "", "set"], [90, 3, 1, "", "update"], [90, 3, 1, "", "validate"]], "searx.botdetection.http_user_agent": [[90, 5, 1, "", "USER_AGENT"]], "searx.botdetection.ip_limit": [[90, 5, 1, "", "API_MAX"], [90, 5, 1, "", "API_WONDOW"], [90, 5, 1, "", "BURST_MAX"], [90, 5, 1, "", "BURST_MAX_SUSPICIOUS"], [90, 5, 1, "", "BURST_WINDOW"], [90, 5, 1, "", "LONG_MAX"], [90, 5, 1, "", "LONG_MAX_SUSPICIOUS"], [90, 5, 1, "", "LONG_WINDOW"], [90, 5, 1, "", "SUSPICIOUS_IP_MAX"], [90, 5, 1, "", "SUSPICIOUS_IP_WINDOW"]], "searx.botdetection.ip_lists": [[90, 5, 1, "", "SEARXNG_ORG"], [90, 0, 1, "", "block_ip"], [90, 0, 1, "", "pass_ip"]], "searx.botdetection.link_token": [[90, 5, 1, "", "PING_KEY"], [90, 5, 1, "", "PING_LIVE_TIME"], [90, 5, 1, "", "TOKEN_KEY"], [90, 5, 1, "", "TOKEN_LIVE_TIME"], [90, 0, 1, "", "get_ping_key"], [90, 0, 1, "", "get_token"], [90, 0, 1, "", "is_suspicious"], [90, 0, 1, "", "ping"]], "searx.enginelib": [[30, 2, 1, "", "Engine"], [30, 1, 0, "-", "traits"]], "searx.enginelib.Engine": [[30, 6, 1, "", "about"], [30, 6, 1, "", "categories"], [30, 6, 1, "", "disabled"], [30, 6, 1, "", "display_error_messages"], [30, 6, 1, "", "enable_http"], [30, 6, 1, "", "engine"], [30, 6, 1, "", "engine_type"], [30, 6, 1, "", "fetch_traits"], [30, 6, 1, "", "inactive"], [30, 6, 1, "", "language"], [30, 6, 1, "", "language_support"], [30, 6, 1, "", "name"], [30, 6, 1, "", "paging"], [30, 6, 1, "", "proxies"], [30, 6, 1, "", "region"], [30, 6, 1, "", "safesearch"], [30, 6, 1, "", "send_accept_language_header"], [30, 6, 1, "", "shortcut"], [30, 6, 1, "", "time_range_support"], [30, 6, 1, "", "timeout"], [30, 6, 1, "", "tokens"], [30, 6, 1, "", "traits"], [30, 6, 1, "", "using_tor_proxy"]], "searx.enginelib.traits": [[30, 2, 1, "", "EngineTraits"], [30, 2, 1, "", "EngineTraitsEncoder"], [30, 2, 1, "", "EngineTraitsMap"]], "searx.enginelib.traits.EngineTraits": [[30, 6, 1, "", "all_locale"], [30, 3, 1, "", "copy"], [30, 6, 1, "", "custom"], [30, 6, 1, "", "data_type"], [30, 3, 1, "", "fetch_traits"], [30, 3, 1, "", "get_language"], [30, 3, 1, "", "get_region"], [30, 3, 1, "", "is_locale_supported"], [30, 6, 1, "", "languages"], [30, 6, 1, "", "regions"], [30, 3, 1, "", "set_traits"]], "searx.enginelib.traits.EngineTraitsEncoder": [[30, 3, 1, "", "default"]], "searx.enginelib.traits.EngineTraitsMap": [[30, 6, 1, "", "ENGINE_TRAITS_FILE"], [30, 3, 1, "", "from_data"], [30, 3, 1, "", "save_data"], [30, 3, 1, "", "set_traits"]], "searx.engines": [[39, 1, 0, "-", "annas_archive"], [40, 1, 0, "-", "archlinux"], [41, 1, 0, "-", "bing"], [41, 1, 0, "-", "bing_images"], [41, 1, 0, "-", "bing_news"], [41, 1, 0, "-", "bing_videos"], [42, 1, 0, "-", "bpb"], [43, 1, 0, "-", "brave"], [44, 1, 0, "-", "bt4g"], [34, 1, 0, "-", "command"], [45, 1, 0, "-", "dailymotion"], [27, 1, 0, "-", "demo_offline"], [28, 1, 0, "-", "demo_online"], [46, 1, 0, "-", "duckduckgo"], [46, 1, 0, "-", "duckduckgo_definitions"], [46, 1, 0, "-", "duckduckgo_extra"], [46, 1, 0, "-", "duckduckgo_weather"], [36, 1, 0, "-", "elasticsearch"], [31, 5, 1, "", "engine_shortcuts"], [47, 1, 0, "-", "google"], [47, 1, 0, "-", "google_images"], [47, 1, 0, "-", "google_news"], [47, 1, 0, "-", "google_scholar"], [47, 1, 0, "-", "google_videos"], [31, 0, 1, "", "is_missing_required_attributes"], [48, 1, 0, "-", "lemmy"], [31, 0, 1, "", "load_engine"], [31, 0, 1, "", "load_engines"], [49, 1, 0, "-", "loc"], [50, 1, 0, "-", "mastodon"], [33, 1, 0, "-", "mediawiki"], [36, 1, 0, "-", "meilisearch"], [35, 1, 0, "-", "mongodb"], [51, 1, 0, "-", "moviepilot"], [52, 1, 0, "-", "mrs"], [53, 1, 0, "-", "mullvad_leta"], [54, 1, 0, "-", "mwmbl"], [37, 1, 0, "-", "mysql_server"], [55, 1, 0, "-", "odysee"], [56, 1, 0, "-", "peertube"], [57, 1, 0, "-", "piped"], [37, 1, 0, "-", "postgresql"], [58, 1, 0, "-", "presearch"], [59, 1, 0, "-", "qwant"], [60, 1, 0, "-", "radio_browser"], [61, 1, 0, "-", "recoll"], [35, 1, 0, "-", "redis_server"], [62, 1, 0, "-", "seekr"], [56, 1, 0, "-", "sepiasearch"], [36, 1, 0, "-", "solr"], [37, 1, 0, "-", "sqlite"], [63, 1, 0, "-", "startpage"], [64, 1, 0, "-", "tagesschau"], [72, 1, 0, "-", "tineye"], [65, 1, 0, "-", "torznab"], [31, 0, 1, "", "using_tor_proxy"], [66, 1, 0, "-", "voidlinux"], [67, 1, 0, "-", "wallhaven"], [68, 1, 0, "-", "wikidata"], [68, 1, 0, "-", "wikipedia"], [73, 1, 0, "-", "xpath"], [69, 1, 0, "-", "yacy"], [70, 1, 0, "-", "yahoo"], [71, 1, 0, "-", "zlibrary"]], "searx.engines.annas_archive": [[39, 5, 1, "", "aa_content"], [39, 5, 1, "", "aa_ext"], [39, 5, 1, "", "aa_sort"], [39, 0, 1, "", "fetch_traits"], [39, 0, 1, "", "init"]], "searx.engines.archlinux": [[40, 0, 1, "", "fetch_traits"]], "searx.engines.bing": [[41, 5, 1, "", "base_url"], [41, 0, 1, "", "fetch_traits"], [41, 5, 1, "", "max_page"], [41, 0, 1, "", "request"], [41, 5, 1, "", "safesearch"]], "searx.engines.bing_images": [[41, 5, 1, "", "base_url"], [41, 0, 1, "", "request"], [41, 0, 1, "", "response"]], "searx.engines.bing_news": [[41, 5, 1, "", "base_url"], [41, 0, 1, "", "fetch_traits"], [41, 5, 1, "", "paging"], [41, 0, 1, "", "request"], [41, 0, 1, "", "response"], [41, 5, 1, "", "time_map"]], "searx.engines.bing_videos": [[41, 5, 1, "", "base_url"], [41, 0, 1, "", "request"], [41, 0, 1, "", "response"]], "searx.engines.brave": [[43, 5, 1, "", "Goggles"], [43, 5, 1, "", "brave_spellcheck"], [43, 0, 1, "", "fetch_traits"], [43, 5, 1, "", "max_page"], [43, 5, 1, "", "paging"], [43, 5, 1, "", "time_range_support"]], "searx.engines.bt4g": [[44, 5, 1, "", "bt4g_category"], [44, 5, 1, "", "bt4g_order_by"]], "searx.engines.command": [[34, 0, 1, "", "check_parsing_options"]], "searx.engines.dailymotion": [[45, 5, 1, "", "family_filter_map"], [45, 0, 1, "", "fetch_traits"], [45, 5, 1, "", "iframe_src"], [45, 5, 1, "", "result_fields"], [45, 5, 1, "", "safesearch_params"], [45, 5, 1, "", "search_url"]], "searx.engines.demo_offline": [[27, 0, 1, "", "init"], [27, 0, 1, "", "search"]], "searx.engines.demo_online": [[28, 0, 1, "", "init"], [28, 0, 1, "", "request"], [28, 0, 1, "", "response"]], "searx.engines.duckduckgo": [[46, 0, 1, "", "cache_vqd"], [46, 0, 1, "", "fetch_traits"], [46, 0, 1, "", "get_ddg_lang"], [46, 0, 1, "", "get_vqd"], [46, 5, 1, "", "send_accept_language_header"]], "searx.engines.duckduckgo_definitions": [[46, 0, 1, "", "area_to_str"], [46, 0, 1, "", "is_broken_text"]], "searx.engines.duckduckgo_extra": [[46, 5, 1, "", "ddg_category"]], "searx.engines.google": [[47, 5, 1, "", "UI_ASYNC"], [47, 0, 1, "", "fetch_traits"], [47, 0, 1, "", "get_google_info"], [47, 0, 1, "", "request"], [47, 0, 1, "", "response"]], "searx.engines.google_images": [[47, 0, 1, "", "request"], [47, 0, 1, "", "response"]], "searx.engines.google_news": [[47, 5, 1, "", "ceid_list"], [47, 0, 1, "", "request"], [47, 0, 1, "", "response"]], "searx.engines.google_scholar": [[47, 0, 1, "", "detect_google_captcha"], [47, 0, 1, "", "parse_gs_a"], [47, 0, 1, "", "request"], [47, 0, 1, "", "response"], [47, 0, 1, "", "time_range_args"]], "searx.engines.google_videos": [[47, 0, 1, "", "request"], [47, 0, 1, "", "response"]], "searx.engines.lemmy": [[48, 5, 1, "", "base_url"], [48, 5, 1, "", "lemmy_type"]], "searx.engines.mediawiki": [[33, 5, 1, "", "base_url"], [33, 5, 1, "", "search_type"], [33, 5, 1, "", "srenablerewrites"], [33, 5, 1, "", "srprop"], [33, 5, 1, "", "srsort"], [33, 5, 1, "", "timestamp_format"]], "searx.engines.mrs": [[52, 0, 1, "", "init"]], "searx.engines.mullvad_leta": [[53, 0, 1, "", "assign_headers"], [53, 0, 1, "", "fetch_traits"], [53, 0, 1, "", "is_vpn_connected"], [53, 0, 1, "", "response"]], "searx.engines.odysee": [[55, 0, 1, "", "fetch_traits"]], "searx.engines.peertube": [[56, 5, 1, "", "base_url"], [56, 0, 1, "", "fetch_traits"], [56, 0, 1, "", "request"], [56, 0, 1, "", "video_response"]], "searx.engines.piped": [[57, 5, 1, "", "backend_url"], [57, 5, 1, "", "frontend_url"], [57, 5, 1, "", "piped_filter"]], "searx.engines.presearch": [[58, 5, 1, "", "search_type"]], "searx.engines.qwant": [[59, 5, 1, "", "api_url"], [59, 5, 1, "", "max_page"], [59, 0, 1, "", "parse_web_api"], [59, 0, 1, "", "parse_web_lite"], [59, 5, 1, "", "qwant_categ"], [59, 0, 1, "", "request"], [59, 5, 1, "", "web_lite_url"]], "searx.engines.radio_browser": [[60, 0, 1, "", "fetch_traits"], [60, 5, 1, "", "station_filters"]], "searx.engines.seekr": [[62, 5, 1, "", "api_key"], [62, 5, 1, "", "seekr_category"]], "searx.engines.sepiasearch": [[56, 0, 1, "", "request"]], "searx.engines.sqlite": [[37, 0, 1, "", "sqlite_cursor"]], "searx.engines.startpage": [[63, 0, 1, "", "fetch_traits"], [63, 0, 1, "", "get_sc_code"], [63, 5, 1, "", "max_page"], [63, 0, 1, "", "request"], [63, 5, 1, "", "sc_code_cache_sec"], [63, 5, 1, "", "search_form_xpath"], [63, 5, 1, "", "send_accept_language_header"], [63, 5, 1, "", "startpage_categ"]], "searx.engines.tagesschau": [[64, 5, 1, "", "use_source_url"]], "searx.engines.tineye": [[72, 5, 1, "", "DOWNLOAD_ERROR"], [72, 5, 1, "", "FORMAT_NOT_SUPPORTED"], [72, 5, 1, "", "NO_SIGNATURE_ERROR"], [72, 5, 1, "", "engine_type"], [72, 0, 1, "", "parse_tineye_match"], [72, 0, 1, "", "request"], [72, 0, 1, "", "response"]], "searx.engines.torznab": [[65, 0, 1, "", "build_result"], [65, 0, 1, "", "get_attribute"], [65, 0, 1, "", "get_torznab_attribute"], [65, 0, 1, "", "init"], [65, 0, 1, "", "request"], [65, 0, 1, "", "response"]], "searx.engines.voidlinux": [[66, 5, 1, "", "ARCH_RE"], [66, 0, 1, "", "response"], [66, 5, 1, "", "void_arch"]], "searx.engines.wallhaven": [[67, 5, 1, "", "api_key"], [67, 5, 1, "", "safesearch_map"]], "searx.engines.wikidata": [[68, 5, 1, "", "display_type"], [68, 0, 1, "", "fetch_traits"], [68, 0, 1, "", "get_thumbnail"]], "searx.engines.wikipedia": [[68, 5, 1, "", "display_type"], [68, 0, 1, "", "fetch_wikimedia_traits"], [68, 0, 1, "", "get_wiki_params"], [68, 5, 1, "", "list_of_wikipedias"], [68, 0, 1, "", "request"], [68, 5, 1, "", "rest_v1_summary_url"], [68, 5, 1, "", "send_accept_language_header"], [68, 5, 1, "", "wiki_lc_locale_variants"], [68, 5, 1, "", "wikipedia_article_depth"]], "searx.engines.xpath": [[73, 5, 1, "", "content_xpath"], [73, 5, 1, "", "cookies"], [73, 5, 1, "", "first_page_num"], [73, 5, 1, "", "headers"], [73, 5, 1, "", "lang_all"], [73, 5, 1, "", "no_result_for_http_status"], [73, 5, 1, "", "page_size"], [73, 5, 1, "", "paging"], [73, 0, 1, "", "request"], [73, 0, 1, "", "response"], [73, 5, 1, "", "results_xpath"], [73, 5, 1, "", "safe_search_map"], [73, 5, 1, "", "safe_search_support"], [73, 5, 1, "", "search_url"], [73, 5, 1, "", "soft_max_redirects"], [73, 5, 1, "", "suggestion_xpath"], [73, 5, 1, "", "thumbnail_xpath"], [73, 5, 1, "", "time_range_map"], [73, 5, 1, "", "time_range_support"], [73, 5, 1, "", "time_range_url"], [73, 5, 1, "", "title_xpath"], [73, 5, 1, "", "url_xpath"]], "searx.engines.yacy": [[69, 5, 1, "", "base_url"], [69, 5, 1, "", "http_digest_auth_pass"], [69, 5, 1, "", "http_digest_auth_user"], [69, 5, 1, "", "search_mode"], [69, 5, 1, "", "search_type"]], "searx.engines.yahoo": [[70, 0, 1, "", "fetch_traits"], [70, 5, 1, "", "lang2domain"], [70, 0, 1, "", "parse_url"], [70, 0, 1, "", "request"], [70, 0, 1, "", "response"]], "searx.engines.zlibrary": [[71, 0, 1, "", "fetch_traits"], [71, 0, 1, "", "init"], [71, 5, 1, "", "zlib_ext"], [71, 5, 1, "", "zlib_year_from"], [71, 5, 1, "", "zlib_year_to"]], "searx.exceptions": [[91, 4, 1, "", "SearxEngineAPIException"], [91, 4, 1, "", "SearxEngineAccessDeniedException"], [91, 4, 1, "", "SearxEngineCaptchaException"], [91, 4, 1, "", "SearxEngineException"], [91, 4, 1, "", "SearxEngineResponseException"], [91, 4, 1, "", "SearxEngineTooManyRequestsException"], [91, 4, 1, "", "SearxEngineXPathException"], [91, 4, 1, "", "SearxException"], [91, 4, 1, "", "SearxParameterException"], [91, 4, 1, "", "SearxSettingsException"], [91, 4, 1, "", "SearxXPathSyntaxException"]], "searx.exceptions.SearxEngineAccessDeniedException": [[91, 6, 1, "", "SUSPEND_TIME_SETTING"]], "searx.exceptions.SearxEngineCaptchaException": [[91, 6, 1, "", "SUSPEND_TIME_SETTING"]], "searx.exceptions.SearxEngineTooManyRequestsException": [[91, 6, 1, "", "SUSPEND_TIME_SETTING"]], "searx.infopage": [[92, 2, 1, "", "InfoPage"], [92, 2, 1, "", "InfoPageSet"]], "searx.infopage.InfoPage": [[92, 7, 1, "", "content"], [92, 3, 1, "", "get_ctx"], [92, 7, 1, "", "html"], [92, 7, 1, "", "raw_content"], [92, 7, 1, "", "title"]], "searx.infopage.InfoPageSet": [[92, 6, 1, "", "folder"], [92, 3, 1, "", "get_page"], [92, 3, 1, "", "iter_pages"], [92, 6, 1, "", "locale_default"], [92, 6, 1, "", "locales"], [92, 6, 1, "", "toc"]], "searx.limiter": [[13, 5, 1, "", "LIMITER_CFG"], [13, 5, 1, "", "LIMITER_CFG_SCHEMA"], [13, 0, 1, "", "initialize"], [13, 0, 1, "", "is_installed"], [13, 0, 1, "", "pre_request"]], "searx.locales": [[93, 5, 1, "", "ADDITIONAL_TRANSLATIONS"], [93, 5, 1, "", "LOCALE_BEST_MATCH"], [93, 5, 1, "", "LOCALE_NAMES"], [93, 5, 1, "", "RTL_LOCALES"], [93, 0, 1, "", "build_engine_locales"], [93, 0, 1, "", "get_engine_locale"], [93, 0, 1, "", "get_locale"], [93, 0, 1, "", "get_official_locales"], [93, 0, 1, "", "get_translation_locales"], [93, 0, 1, "", "get_translations"], [93, 0, 1, "", "language_tag"], [93, 0, 1, "", "locales_initialize"], [93, 0, 1, "", "match_locale"], [93, 0, 1, "", "region_tag"]], "searx.plugins": [[94, 1, 0, "-", "tor_check"], [95, 1, 0, "-", "unit_converter"]], "searx.plugins.tor_check": [[94, 5, 1, "", "description"], [94, 5, 1, "", "name"], [94, 5, 1, "", "preference_section"], [94, 5, 1, "", "query_examples"], [94, 5, 1, "", "query_keywords"]], "searx.plugins.unit_converter": [[95, 5, 1, "", "ADDITIONAL_UNITS"], [95, 5, 1, "", "ALIAS_SYMBOLS"], [95, 0, 1, "", "symbol_to_si"]], "searx.redisdb": [[96, 5, 1, "", "OLD_REDIS_URL_DEFAULT_URL"]], "searx.redislib": [[97, 5, 1, "", "LUA_SCRIPT_STORAGE"], [97, 0, 1, "", "drop_counter"], [97, 0, 1, "", "incr_counter"], [97, 0, 1, "", "incr_sliding_window"], [97, 0, 1, "", "lua_script_storage"], [97, 0, 1, "", "purge_by_prefix"], [97, 0, 1, "", "secret_hash"]], "searx.search": [[98, 2, 1, "", "EngineRef"], [98, 2, 1, "", "Search"], [98, 2, 1, "", "SearchQuery"], [98, 2, 1, "", "SearchWithPlugins"]], "searx.search.Search": [[98, 6, 1, "", "result_container"], [98, 3, 1, "", "search"], [98, 6, 1, "", "search_query"]], "searx.search.SearchWithPlugins": [[98, 6, 1, "", "ordered_plugin_list"], [98, 6, 1, "", "request"], [98, 6, 1, "", "result_container"], [98, 3, 1, "", "search"], [98, 6, 1, "", "search_query"]], "searx.search.processors": [[99, 1, 0, "-", "abstract"], [99, 1, 0, "-", "offline"], [99, 1, 0, "-", "online"], [99, 1, 0, "-", "online_currency"], [99, 1, 0, "-", "online_dictionary"], [99, 1, 0, "-", "online_url_search"]], "searx.search.processors.abstract": [[99, 2, 1, "", "EngineProcessor"], [99, 2, 1, "", "SuspendedStatus"]], "searx.search.processors.abstract.EngineProcessor": [[99, 3, 1, "", "get_params"]], "searx.search.processors.offline": [[99, 2, 1, "", "OfflineProcessor"]], "searx.search.processors.online": [[99, 2, 1, "", "OnlineProcessor"], [99, 0, 1, "", "default_request_params"]], "searx.search.processors.online.OnlineProcessor": [[99, 3, 1, "", "get_params"]], "searx.search.processors.online_currency": [[99, 2, 1, "", "OnlineCurrencyProcessor"]], "searx.search.processors.online_currency.OnlineCurrencyProcessor": [[99, 3, 1, "", "get_params"]], "searx.search.processors.online_dictionary": [[99, 2, 1, "", "OnlineDictionaryProcessor"]], "searx.search.processors.online_dictionary.OnlineDictionaryProcessor": [[99, 3, 1, "", "get_params"]], "searx.search.processors.online_url_search": [[99, 2, 1, "", "OnlineUrlSearchProcessor"]], "searx.search.processors.online_url_search.OnlineUrlSearchProcessor": [[99, 3, 1, "", "get_params"]], "searx.sxng_locales": [[93, 5, 1, "", "sxng_locales"]], "searx.utils": [[100, 5, 1, "", "SEARCH_LANGUAGE_CODES"], [100, 0, 1, "", "convert_str_to_int"], [100, 0, 1, "", "detect_language"], [100, 0, 1, "", "dict_subset"], [100, 0, 1, "", "ecma_unescape"], [100, 0, 1, "", "eval_xpath"], [100, 0, 1, "", "eval_xpath_getindex"], [100, 0, 1, "", "eval_xpath_list"], [100, 0, 1, "", "extract_text"], [100, 0, 1, "", "extract_url"], [100, 0, 1, "", "gen_useragent"], [100, 0, 1, "", "get_engine_from_settings"], [100, 0, 1, "", "get_torrent_size"], [100, 0, 1, "", "get_xpath"], [100, 0, 1, "", "html_to_text"], [100, 0, 1, "", "humanize_bytes"], [100, 0, 1, "", "int_or_zero"], [100, 0, 1, "", "is_valid_lang"], [100, 0, 1, "", "js_variable_to_python"], [100, 0, 1, "", "markdown_to_text"], [100, 0, 1, "", "normalize_url"], [100, 0, 1, "", "searx_useragent"], [100, 0, 1, "", "to_string"]], "searxng_extra": [[83, 1, 0, "-", "standalone_searx"]], "searxng_extra.standalone_searx": [[83, 0, 1, "", "get_search_query"], [83, 0, 1, "", "json_serial"], [83, 0, 1, "", "no_parsed_url"], [83, 0, 1, "", "parse_argument"], [83, 0, 1, "", "to_dict"]], "searxng_extra.update": [[84, 1, 0, "-", "update_ahmia_blacklist"], [84, 1, 0, "-", "update_currencies"], [84, 1, 0, "-", "update_engine_descriptions"], [84, 1, 0, "-", "update_engine_traits"], [84, 1, 0, "-", "update_external_bangs"], [84, 1, 0, "-", "update_firefox_version"], [84, 1, 0, "-", "update_locales"], [84, 1, 0, "-", "update_osm_keys_tags"], [84, 1, 0, "-", "update_pygments"], [84, 1, 0, "-", "update_wikidata_units"]], "searxng_extra.update.update_engine_descriptions": [[84, 0, 1, "", "get_output"]], "searxng_extra.update.update_engine_traits": [[84, 2, 1, "", "UnicodeEscape"], [84, 0, 1, "", "fetch_traits_map"], [84, 0, 1, "", "filter_locales"], [84, 0, 1, "", "get_unicode_flag"]], "searxng_extra.update.update_external_bangs": [[84, 5, 1, "", "BANGS_URL"], [84, 0, 1, "", "merge_when_no_leaf"]], "searxng_extra.update.update_locales": [[84, 0, 1, "", "get_locale_descr"]], "searxng_extra.update.update_pygments": [[84, 2, 1, "", "Formatter"]]}, "objnames": {"0": ["py", "function", "Python function"], "1": ["py", "module", "Python module"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "exception", "Python exception"], "5": ["py", "data", "Python data"], "6": ["py", "attribute", "Python attribute"], "7": ["py", "property", "Python property"]}, "objtypes": {"0": "py:function", "1": "py:module", "2": "py:class", "3": "py:method", "4": "py:exception", "5": "py:data", "6": "py:attribute", "7": "py:property"}, "terms": {"": [3, 4, 5, 7, 10, 18, 24, 25, 26, 29, 30, 32, 35, 37, 38, 43, 44, 45, 46, 47, 50, 51, 55, 56, 57, 58, 59, 62, 63, 68, 71, 73, 74, 75, 76, 78, 79, 84, 85, 86, 87, 88, 89, 90, 94, 97, 100, 101, 106, 107], "0": [0, 1, 2, 6, 7, 8, 10, 11, 13, 15, 18, 20, 21, 22, 23, 25, 26, 29, 35, 45, 51, 63, 67, 72, 73, 75, 76, 79, 80, 81, 83, 90, 96, 97, 98, 100, 102, 105, 106, 107], "00": [11, 106], "000": 6, "01": 11, "018": 29, "04": [76, 104, 106], "04f8": 90, "07848": 29, "0pointer": 11, "0xa9": 79, "1": [0, 1, 3, 6, 7, 8, 10, 11, 13, 18, 20, 21, 22, 23, 33, 35, 45, 63, 67, 73, 75, 76, 79, 80, 81, 83, 90, 91, 93, 95, 97, 98, 99, 100, 102, 106, 107], "10": [6, 10, 13, 18, 20, 29, 36, 43, 63, 79, 90, 102], "100": [10, 18, 20, 67, 72, 86, 101, 102], "100m": 95, "100mi": 95, "1024": [29, 100], "1024b": 100, "1038": 29, "1080": [18, 29], "11": [80, 106], "110": 67, "111": 67, "12": [11, 76, 80], "120": [10, 22, 26], "123": 104, "126": [10, 20], "127": [0, 6, 8, 10, 23, 35, 75, 107], "128": 11, "1296000": [10, 22], "13": [7, 11, 76, 106], "130": 86, "1332": 25, "1337x": 102, "135": 79, "14": [3, 76, 100], "140": [75, 106], "1476": 29, "15": [90, 95, 102, 106], "150": [47, 90, 106], "158": 90, "1595": 25, "15px": 79, "16": [6, 10, 13, 45, 63, 76, 90], "160": 106, "1609": 95, "167": 90, "168": [6, 13, 20, 73, 90], "1691": 20, "170": 106, "1744": 75, "18": 63, "180": 79, "184": [13, 90], "186": 11, "19": [76, 106], "192": [6, 13, 20, 90], "1920": 29, "199": 102, "1991": 41, "1c1c": 90, "1h": 46, "1kb": 100, "1m": 95, "1mi": 95, "1x": 102, "2": [2, 10, 11, 20, 22, 29, 45, 60, 63, 67, 72, 73, 76, 78, 79, 80, 81, 83, 90, 97, 100, 102, 104], "20": [10, 35, 46, 63, 76, 90, 100, 106], "200": [10, 41, 76], "2000": 79, "200331": 106, "2005": 63, "2010": 71, "2013": 11, "2014": 11, "2020": 71, "2020er": 51, "2021": [47, 86], "2022": [47, 62], "2023": 76, "2025": 106, "2027": 106, "209": 7, "2099": 11, "2122": 79, "216": [13, 75, 90], "22": [76, 106], "22fb": 62, "23": 76, "235": 90, "24": [73, 104], "2425uwsgi": 11, "25": 79, "251": 90, "2554": 68, "257": [13, 90], "2592000": 90, "262": 100, "27017": 35, "273": 95, "2923": 106, "296": 106, "2a01": 90, "2af9": 75, "2f998": 7, "2f998d725993": 7, "3": [7, 10, 18, 37, 57, 76, 79, 80, 84, 90, 97, 100, 102, 106], "30": [20, 63, 73, 102], "300": 29, "3000": 10, "302": 76, "308": 6, "308mb": 7, "3140000": 100, "32": 13, "33691240": 68, "34": [13, 90], "344": 95, "35": 106, "3600": [10, 22, 90], "365": 73, "3660": 91, "370": 79, "39": 76, "3abuild": 84, "3aen": 76, "3apay": 84, "3dbungalow": 84, "3dhous": 84, "3eff": 75, "3xx": 76, "4": [10, 11, 29, 41, 76, 79, 90, 97, 102], "400": [18, 79], "402": [10, 22], "403": [10, 18, 22], "404": 18, "40px": 79, "419": 47, "42": [100, 106], "4217": 29, "429": [10, 18, 22, 90], "43": 11, "44": 11, "443": 76, "456": 25, "4687": 29, "471efef6c73558e391c3adb35f4": 76, "47712402": 106, "48": 13, "49586c016434": 7, "5": [7, 10, 18, 20, 22, 37, 59, 63, 79, 84, 90, 97, 100, 102], "50": [72, 79], "500": 79, "50593": 26, "52": 106, "525": 79, "5368709120": 100, "539": 107, "548": 104, "555b": 75, "585": 79, "599": 18, "6": [76, 79, 80, 97, 100, 102], "60": 86, "600": 90, "604800": [10, 22], "60a2": 20, "61mb": 7, "6379": [21, 35], "639": [33, 63, 73, 100], "64": [90, 97], "666": 11, "68": 10, "6cea6eb6def9e14a18bf32f8a3": 76, "6dbb9cc54074": 7, "7": [7, 10, 41, 73, 76, 102], "70": 86, "700": 79, "7000": 45, "7048": 106, "70px": 79, "720": 73, "752": 11, "755": 23, "7700": 36, "7851230": 106, "8": [6, 10, 11, 43, 76, 79, 80, 106], "80": 8, "8000": 26, "8080": [0, 7, 10, 18, 20, 75, 106], "8192": 11, "822": 79, "833067": 11, "86": 102, "86400": [10, 11, 22, 91], "8760": 73, "8888": [6, 8, 10, 23, 75, 107], "8983": 36, "8ed5c729": 56, "8fbf8ab": 76, "8fc2": 90, "8k": 8, "9": [41, 43, 76, 80, 102], "92": 11, "9200": 36, "93": [11, 13, 90], "9780201896831": 29, "99": 46, "993": 11, "9c823800": 7, "9g": 102, "9gag": 102, "A": [7, 13, 17, 18, 20, 21, 25, 26, 29, 30, 34, 41, 46, 47, 51, 56, 60, 68, 77, 79, 84, 89, 92, 93, 94, 95, 96, 97, 99, 100, 106], "AND": 90, "AS": 37, "AT": 47, "And": [6, 75, 79, 90], "As": [11, 13, 15, 18, 25, 46, 63, 87, 90, 106], "At": [10, 36, 37, 47, 54, 66, 79, 106], "BE": [10, 22, 30, 47, 93], "BY": 37, "Be": [6, 11, 18, 65, 83], "But": [18, 36, 77, 87, 106], "By": [11, 18, 20, 23, 35, 37, 45, 46, 48, 51, 58, 60, 61, 69, 90, 91, 93, 100, 105, 106], "For": [3, 6, 8, 9, 10, 11, 13, 18, 22, 26, 29, 30, 33, 35, 37, 39, 44, 46, 47, 51, 57, 59, 60, 63, 66, 68, 71, 75, 76, 79, 81, 84, 85, 90, 93, 101, 106], "IN": 47, "IT": [10, 22, 47], "If": [0, 3, 5, 6, 7, 8, 9, 10, 11, 15, 16, 17, 18, 20, 24, 25, 26, 28, 30, 31, 33, 34, 35, 36, 37, 38, 41, 46, 47, 48, 53, 58, 67, 70, 73, 75, 76, 77, 78, 79, 80, 84, 86, 87, 90, 93, 95, 97, 100, 101, 105, 106], "In": [0, 6, 7, 8, 9, 10, 11, 13, 15, 17, 18, 20, 21, 25, 26, 27, 28, 29, 30, 32, 33, 35, 43, 47, 57, 58, 63, 69, 74, 77, 79, 80, 82, 87, 90, 102, 104, 105, 106, 107], "It": [7, 15, 18, 26, 29, 30, 36, 37, 44, 46, 51, 65, 71, 79, 81, 87, 94, 100, 101, 106], "Its": 66, "NO": [47, 63], "Not": [46, 67, 68, 79, 99], "OR": 37, "On": [6, 7, 17, 20, 41, 75, 83], "One": [11, 33, 59, 69], "Or": [18, 79], "Suche": 40, "That": [50, 79], "The": [0, 1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 15, 18, 20, 22, 23, 24, 25, 27, 28, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 52, 53, 57, 58, 59, 60, 62, 63, 64, 65, 68, 69, 71, 72, 73, 76, 77, 79, 80, 81, 84, 85, 87, 89, 90, 91, 93, 94, 95, 97, 100, 101, 102, 105, 106, 107], "Then": 21, "There": [6, 8, 11, 26, 41, 45, 78, 79, 85, 100, 106], "These": [29, 79], "To": [3, 6, 7, 9, 10, 11, 13, 18, 21, 25, 26, 27, 28, 29, 30, 35, 37, 38, 39, 41, 43, 45, 46, 47, 63, 68, 73, 75, 76, 78, 79, 80, 84, 85, 87, 90, 93, 101, 104, 106, 107], "With": [0, 6, 7, 15, 34, 37, 39, 44, 71, 75, 76, 79, 80, 106], "_": [31, 79], "__": 79, "__name__": 79, "_anchor": 79, "_chapter": 79, "_doc": 79, "_dot": 79, "_fmt": 47, "_info_pag": 92, "_lang": 54, "_non_overwritten_glob": 29, "_notsetclass": 100, "_rest": 79, "_section": 79, "_sphinx": 79, "_subsect": 79, "_svg": 79, "a1": 76, "a2disconf": 6, "a2dismod": 6, "a2dissit": 6, "a2enconf": 6, "a2enmod": 6, "a2ensit": 6, "a446dea1b": 76, "aa": 102, "aa_cont": 39, "aa_ext": 39, "aa_sort": 39, "aaa": 39, "aarch64": 66, "abbrevi": [71, 104], "abl": [3, 13, 23, 26, 39, 44, 71, 79, 104], "abonti": 90, "about": [2, 10, 18, 25, 26, 30, 42, 43, 67, 75, 76, 78, 86, 103, 106], "abov": [0, 6, 10, 15, 25, 26, 35, 36, 37, 46, 63, 75, 79, 80, 81, 106], "absenc": 79, "absolut": 100, "abstract": [29, 88], "abus": 87, "academ": 71, "accept": [10, 18, 30, 38, 46, 47, 58, 63, 68, 90, 104, 106], "access": [6, 9, 10, 11, 12, 13, 18, 21, 22, 34, 35, 36, 37, 38, 39, 40, 47, 61, 71, 75, 79, 87, 90, 91], "access_log": 8, "accord": [7, 11, 15, 33, 93], "account": [9, 10, 20, 21, 25, 50, 75], "accusam": 79, "achiev": 61, "across": [18, 30], "act": 0, "action": [1, 11, 33], "actionfilm": 51, "activ": [2, 6, 10, 13, 17, 18, 23, 26, 30, 31, 43, 44, 75, 77, 80, 81, 83, 90, 104, 107], "actual": [15, 33, 41, 63, 64, 84], "ad": [11, 17, 18, 21, 30, 36, 38, 46, 54, 63, 78, 79, 85, 87, 89, 90, 93, 101], "adapt": 29, "add": [6, 7, 8, 9, 10, 11, 18, 20, 26, 27, 28, 35, 36, 37, 46, 67, 68, 72, 76, 77, 79, 80, 88, 90, 98, 100, 101], "add_domain": 47, "addgrp": [21, 76], "addit": [3, 6, 11, 17, 18, 20, 23, 30, 35, 37, 38, 39, 44, 47, 48, 59, 62, 64, 69, 71, 76, 79, 85, 89, 90, 93, 95, 102], "addition": [51, 63, 86, 87], "additional_transl": [88, 93], "additional_unit": [88, 95], "address": [10, 12, 13, 18, 19, 20, 23, 29, 40, 68, 87, 94], "adipisici": 79, "adjust": [26, 41, 76], "admin": [10, 18, 38, 75, 79], "administr": [10, 18, 20, 34, 36, 38, 81, 86, 87, 105], "admonit": 74, "adopt": 26, "adorn": 79, "advanc": [10, 20, 38, 60], "advantag": 79, "advertis": 87, "ae": 47, "aef": 11, "af": 100, "af2cae6": 79, "af77ec3": 10, "affect": [24, 25], "after": [10, 22, 51, 68, 76, 77, 79, 84, 106], "ag": [41, 45], "again": [41, 80], "against": [7, 10], "agent": [10, 12, 13, 20, 29, 90, 100, 104], "aggreg": [86, 87, 101], "ago": 7, "agpl": 106, "ah": 46, "ahmia": [10, 84], "ahmia_blacklist": [81, 84], "ahrefsbot": 90, "aim": [36, 42, 79, 88], "aka": [43, 58, 68, 92, 93], "al": [1, 18, 43, 68, 100, 102], "alexandria": 102, "alia": [6, 8, 95], "alias": 95, "alias_symbol": [88, 95], "align": 79, "aliquid": 79, "aliquyam": 79, "aliv": [10, 20], "all": [1, 6, 7, 9, 10, 11, 13, 15, 17, 18, 20, 22, 25, 26, 28, 29, 30, 33, 35, 36, 37, 38, 43, 44, 46, 47, 51, 57, 60, 67, 68, 69, 73, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 90, 92, 93, 94, 97, 98, 99, 100, 105, 106, 107], "all_local": [30, 46], "alloc": 0, "allow": [6, 10, 18, 19, 20, 23, 30, 34, 43, 47, 51, 65, 66, 79], "allow_emb": 45, "allow_nan": 30, "allow_non": 100, "allow_redirect": 29, "allowoverrid": 6, "alpin": 7, "alreadi": [26, 58, 75, 76, 80, 85, 100], "also": [3, 6, 7, 10, 11, 13, 20, 25, 26, 31, 35, 38, 39, 41, 46, 53, 66, 72, 75, 78, 79, 87, 93, 100, 101, 102, 104], "alt": 79, "alter": [26, 43], "altern": [9, 15, 18, 24, 36, 50, 57, 59, 76, 78, 79, 106], "altogeth": 19, "alwai": [7, 8, 20, 25, 26, 29, 41, 44, 47, 87, 106], "alx": 102, "am": 100, "ambigu": 95, "amd64": 76, "amet": 79, "among": [26, 87], "amount": [29, 44, 46, 50, 97], "amsmath": 79, "an": [5, 10, 13, 15, 17, 18, 20, 21, 24, 26, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47, 50, 53, 54, 57, 59, 63, 64, 65, 67, 68, 69, 72, 73, 75, 79, 81, 83, 85, 86, 87, 90, 91, 93, 98, 100, 101, 104], "anaconda": 102, "analysi": [3, 13], "anan": 39, "ancel": 79, "anchor": 74, "android": 47, "ani": [5, 6, 8, 9, 20, 26, 37, 43, 44, 46, 48, 51, 58, 62, 65, 68, 70, 76, 79, 80, 81, 83, 90, 92, 93, 100], "anna": [32, 102], "annaarchivist": 39, "annas_arch": [39, 102], "annoi": 79, "anonym": [19, 39, 86, 87, 97, 101], "anoth": [11, 18, 29, 33, 41, 75, 79, 84, 95, 106], "answer": [4, 20, 75, 79, 86, 87], "anymor": [6, 7, 67], "anyon": 86, "anyth": [38, 87, 101], "anywai": 79, "ap": 102, "apach": [2, 4, 9, 11, 13, 25, 86, 106, 107], "apache2": [6, 107], "apache2ctl": 6, "api": [4, 15, 18, 28, 29, 30, 32, 33, 40, 41, 44, 45, 48, 49, 50, 51, 56, 57, 59, 60, 61, 62, 65, 67, 68, 69, 72, 74, 84, 85, 86, 90], "api2u": 64, "api_kei": [18, 29, 62, 65, 67], "api_max": 90, "api_url": 59, "api_wondow": 90, "apikei": [18, 85], "apiyacysearch": 69, "apk": 102, "apkm": 102, "apkmirror": 102, "apm": 102, "app": [8, 11, 13, 44, 47, 53, 68, 69, 75, 76, 79, 90, 92, 107], "appear": 79, "append": [6, 51], "appl": 102, "apple_app_stor": 102, "apple_map": 102, "appli": [23, 26, 47, 60, 100, 106], "applic": [0, 11, 23, 65, 75, 79, 83, 91, 102], "appreci": 101, "approach": 11, "approv": 67, "approxim": 93, "apr": 106, "april": 106, "apt": [3, 6, 7, 8, 10, 79, 80], "aq": 7, "ar": [1, 3, 7, 9, 10, 11, 13, 15, 17, 18, 20, 23, 24, 25, 26, 30, 32, 34, 35, 36, 37, 38, 39, 41, 43, 45, 46, 47, 48, 49, 51, 57, 58, 59, 60, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 84, 85, 86, 88, 89, 90, 93, 95, 97, 100, 102, 104, 106], "ar_a": 45, "ar_aa": 45, "ar_eg": 45, "ar_sa": 45, "arab": 43, "arbitrari": [10, 34, 35], "arc": 102, "arch": [1, 3, 6, 8, 10, 11, 15, 18, 32, 79, 102], "arch_r": 66, "architectur": [4, 9, 57, 66, 86, 107], "archiv": [10, 24, 32, 76, 90, 102], "archivist": 39, "archlinux": [11, 18, 40, 102, 106], "archlinuxcn": 40, "ard": 64, "area": [41, 43, 46, 72], "area_to_str": 46, "arg": [47, 83, 100], "argument": [11, 12, 26, 33, 39, 40, 47, 60, 63, 71, 79, 83, 90, 93, 97, 106], "armv6l": 66, "armv7l": 66, "arrai": 29, "arrow": 79, "art": [28, 79], "artic": [28, 102], "articl": [7, 29, 39, 68, 71, 73, 74, 75, 92, 97], "arx": 102, "arxiv": 102, "arz": 100, "as_ylo": 47, "asc": 36, "ascend": 36, "asciimoo": 10, "ascrib": 79, "asdf": 74, "ask": [33, 102], "ask_yn": 106, "askubuntu": 102, "aspect": [26, 75], "assembl": [27, 41, 47, 56, 63, 68], "assert": 26, "assign": [13, 18, 29, 53, 79, 93, 102], "assign_head": 53, "assum": [10, 79], "assumpt": 93, "assur": 86, "ast": 100, "asterisk": 79, "async": [41, 47], "asyncv2": 41, "atownsend": 84, "attach": 77, "attempt": 93, "attend": 75, "attent": [78, 79], "attribut": [31, 35, 37, 38, 65, 72, 79], "attribute_nam": 65, "au": [47, 60], "audienc": [45, 79], "audio": [44, 69, 102], "auth_plugin": 37, "auth_token": 36, "authent": [36, 37, 65], "author": [26, 29, 47, 79], "auto": [10, 24, 58, 75, 79, 106], "autobuild": [26, 76], "autocomplet": [1, 2, 7, 10, 22, 81], "autocomplete_min": 10, "autodetect": 10, "autodoc": 79, "autoindex": 6, "autoindex_modul": 6, "autom": 86, "automat": [7, 10, 11, 24, 68, 79, 103], "av": 100, "avail": [6, 7, 8, 10, 11, 12, 13, 19, 22, 34, 38, 43, 49, 50, 56, 64, 68, 76, 81, 87, 107], "averag": 104, "avg": 104, "avoid": [9, 12, 13, 20, 34, 63, 85], "awar": [6, 11, 65, 79], "az": 100, "az571": 107, "azb": 100, "b": [79, 80, 84, 96, 100], "ba": 100, "babel": [3, 10, 30, 43, 47, 60, 63, 76, 85, 89, 93], "babel_extract": 89, "back": [7, 75, 78, 97], "backend": [10, 22, 33, 57], "backend_url": 57, "backlink": [72, 79], "backquot": 79, "backslash": 79, "backup": 75, "bag": 100, "bahnhof": 102, "baiduspid": 90, "ban": [10, 22, 65, 87], "ban_time_on_fail": [10, 22], "bandcamp": 102, "bandwidth": [7, 10, 25], "bang": [18, 30, 79, 84, 102, 103], "bangs_url": 84, "bar": [4, 12, 79, 96, 100, 101], "base": [3, 7, 10, 12, 13, 23, 29, 33, 34, 35, 36, 46, 47, 56, 57, 61, 62, 66, 68, 73, 75, 81, 90, 91, 99, 100, 101, 106], "base64": 10, "base_url": [2, 7, 10, 18, 23, 29, 33, 36, 41, 48, 50, 52, 56, 61, 65, 69, 100], "baseprofil": 79, "bash": [7, 10, 35, 37, 38, 75, 76, 77, 79, 80, 106, 107], "bashrc": 80, "basic": [12, 37, 43, 72, 74, 101, 106], "batch": 105, "baz": 79, "bb": [1, 102], "bc": 102, "bcl": 100, "bd": 47, "becaus": [18, 26, 29, 44, 87], "becom": [79, 84, 104], "been": [11, 25, 26, 41, 75, 85, 86, 97, 106], "befor": [9, 10, 11, 20, 25, 26, 35, 37, 38, 75, 76, 77, 78, 79, 87, 90, 106], "before_request": 13, "began": 71, "beginn": 8, "behav": 83, "behavior": [13, 79, 104], "behaviour": [11, 26, 77], "behind": [13, 23, 57, 101], "being": [23, 24, 51, 86, 104], "belgiqu": 93, "belgium": 30, "believ": 101, "belong": [72, 79, 102], "below": [0, 9, 10, 11, 18, 20, 26, 29, 34, 35, 37, 77, 79, 90, 100], "besid": [46, 49, 87], "best": [3, 30, 46, 51, 76, 79, 87, 93], "beta": 39, "better": [3, 6, 7, 8, 10, 29, 33, 41, 87, 100, 101], "between": [12, 18, 29, 68, 79, 93], "bf": 102, "bg": [47, 70, 100], "bh": 100, "bi": [18, 102], "big": [79, 97], "bigger": 20, "bii": 102, "bil": 102, "bildung": 42, "bilibili": 102, "billion": 72, "bin": [3, 7, 10, 11, 76, 102, 106], "binari": [10, 32, 37, 76], "bind": [7, 23, 37], "bind_address": [0, 7, 10, 15, 23], "bing": [15, 32, 79, 83, 102], "bing_imag": [41, 102], "bing_new": [41, 102], "bing_video": [41, 102], "bingbot": 90, "bit": [13, 67, 79, 106], "bitbucket": [1, 73, 102], "bitlybot": 90, "biv": 102, "black": [76, 79], "black_opt": 76, "black_target": 76, "blacklist": [10, 84], "blank": [10, 22, 24, 79], "blexbot": 90, "block": [0, 10, 13, 20, 23, 40, 46, 74, 90, 91, 97, 106], "block_ip": [13, 90], "blog": [11, 75, 79], "bmp": 72, "bn": [47, 100], "bo": 100, "bodi": [10, 26, 79], "boilerpl": 10, "bokm\u00e5l": 63, "bold": 79, "boldfac": 79, "book": [29, 39, 71], "book_com": 39, "book_fict": 39, "book_nonfict": 39, "book_unknown": 39, "bookfind": 71, "bool": [29, 30, 33, 47, 53, 77, 90, 93, 98, 100], "boolean": [29, 33, 77, 79], "born": 26, "bot": [7, 10, 13, 23, 25, 43, 46, 63, 86, 88], "botdetect": [13, 23, 90], "both": [11, 26, 58, 68, 81, 87, 90, 100], "bottom": [10, 24, 84], "boundingbox": 29, "box": [2, 9, 25, 68, 74, 75, 77, 86, 106], "bpb": [32, 102], "bpy": 100, "br": [43, 47, 84, 93, 100, 102], "br_br": 63, "branch": [11, 25, 26, 76, 80, 85], "brand": [4, 10, 14, 26, 75, 76], "brasil": 84, "brave": [32, 102], "brave_categori": 43, "brave_spellcheck": 43, "break": [26, 79], "brimg": 102, "bring": [79, 93], "brnew": 102, "broken": [46, 79], "brows": 51, "browser": [0, 7, 10, 19, 22, 24, 26, 46, 68, 75, 76, 87, 90, 100, 101, 102, 104, 106], "brvid": 102, "bsd": 35, "bt": [44, 102], "bt4g": [32, 102], "bt4g_categori": 44, "bt4g_order_bi": 44, "bt4gv": 44, "btdigg": 102, "buffer": [11, 25], "bug": [11, 76, 86], "bugfix": 11, "bugreport": [11, 26], "build": [2, 4, 5, 10, 18, 21, 28, 30, 45, 47, 63, 65, 70, 72, 73, 74, 75, 78, 80, 84, 93, 95, 106, 107], "build_engine_local": [88, 93], "build_result": 65, "builder": 79, "buildhost": [4, 75, 76, 78, 86, 105, 107], "built": [7, 26, 29, 66, 69], "builtin": [4, 77, 86], "bullet": 97, "bump": 76, "bunddev": 64, "bundesstel": 64, "bundeszentral": 42, "bundl": 10, "burst": 90, "burst_max": 90, "burst_max_suspici": 90, "burst_window": 90, "busi": 35, "bust": [7, 10, 11, 24, 25], "button": 10, "bw": 47, "bxr": 100, "bypass": 13, "byte": [29, 72, 100], "bz2": 37, "c": [10, 11, 47, 70, 75, 76, 77, 79, 84, 95, 100], "c3tv": 102, "ca": [10, 20, 30, 43, 47, 93, 100], "ca_e": 93, "cach": [7, 10, 11, 24, 25, 46, 63, 92, 97, 100], "cache_url": [10, 24], "cache_vqd": 46, "caching_sha2_password": 37, "caddi": [7, 9], "calcul": [10, 12, 68], "call": [17, 18, 30, 46, 47, 72, 75, 76, 78, 79, 84, 90, 97, 98, 100, 102, 106], "callabl": [30, 95], "callback": 77, "can": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 13, 15, 17, 18, 20, 21, 24, 25, 26, 29, 30, 32, 33, 34, 35, 36, 37, 38, 41, 43, 44, 45, 46, 47, 48, 50, 58, 59, 61, 63, 64, 66, 67, 68, 72, 75, 76, 77, 78, 79, 80, 83, 84, 86, 87, 89, 90, 93, 95, 96, 97, 100, 102, 103, 104, 106, 107], "canada": 93, "cancel": 79, "cannot": [3, 46, 47, 79, 87, 90, 101, 104], "capabl": [26, 36], "captcha": [4, 10, 13, 22, 47, 63, 86, 87, 91], "caption": 79, "cardin": 26, "care": [18, 34, 63, 65, 79, 85, 101, 106], "carv": 18, "case": [9, 10, 18, 20, 22, 25, 36, 47, 57, 63, 68, 69, 73, 75, 87, 100, 107], "cash": 84, "cat": [11, 106], "catcher": 79, "categori": [1, 10, 17, 18, 24, 29, 30, 37, 41, 43, 44, 46, 51, 58, 62, 65, 69, 79, 81, 83, 84, 98, 102, 103], "categories_as_tab": [4, 14, 18, 79, 102], "category_choic": 83, "categorysnippet": 33, "caus": 10, "caution": 79, "caveat": 79, "cb": 102, "cbk": 100, "cc": [90, 102], "ccc": 102, "ccc_media": 102, "cd": [7, 9, 10, 75, 76, 80], "cdn": 3, "ce": 100, "ceb": 100, "ceid": [47, 76], "ceid_list": 47, "cell": 79, "center": [10, 24], "center_align": [10, 24], "cer": [10, 20], "cert": [10, 20], "certain": 51, "certif": [10, 20], "cf_searxengineaccessdeni": [10, 22], "cf_searxenginecaptcha": [10, 22], "cfg": [89, 90], "cfg_schema": 90, "cgi": 11, "ch": [47, 50, 93], "chain": [76, 78, 104, 106], "chang": [10, 11, 13, 15, 16, 20, 23, 25, 26, 44, 75, 76, 77, 78, 79, 80, 84, 101], "changeabl": 13, "changem": 36, "channel": 0, "chapter": [26, 79, 80, 107], "char": 34, "charact": [10, 26, 34, 47, 68, 79], "chat": 101, "chdir": [11, 75], "cheat": 7, "check": [0, 3, 4, 7, 12, 13, 21, 26, 29, 34, 39, 43, 53, 71, 76, 85, 86, 88, 90, 93, 100, 106, 107], "check_circular": 30, "check_parsing_opt": 34, "checker": 74, "checkout": 76, "checkput": 76, "chicago": 28, "child": 84, "chines": [41, 43, 68], "chmod": [11, 106], "choic": [5, 43, 79, 87, 100, 105], "chompj": 100, "choos": [5, 26, 43, 78], "chosen": 50, "chown": 10, "chrome": 101, "chromium": 101, "chronolog": 79, "ci": [76, 82, 84, 86], "citi": 29, "ckb": 100, "cl": [47, 102], "class": [13, 30, 72, 73, 84, 88, 90, 92, 98], "classic": 68, "classif": 100, "classifi": [13, 79], "classmethod": 30, "clean": [7, 74, 80], "clear": [43, 87], "client": [13, 48, 56, 75, 83, 85, 90, 96, 97], "client_token": 90, "clita": 79, "clone": [7, 9, 10, 75, 76, 78, 80, 85, 107], "close": [10, 27, 28, 72, 90], "cloudflar": [10, 22], "cmd": [35, 37, 38, 75, 76, 77, 105, 106, 107], "cn": [47, 68, 93, 100], "cn_cn": 63, "co": [47, 100], "coalesc": 37, "code": [6, 10, 11, 18, 22, 24, 25, 29, 30, 33, 41, 45, 46, 47, 55, 56, 63, 66, 68, 73, 74, 75, 76, 78, 81, 83, 86, 87, 91, 97, 100, 101, 102, 106], "codeberg": [85, 102], "coffe": 106, "col": 79, "collabor": 68, "colleagu": 18, "collect": [3, 35, 36, 44, 63, 66, 72, 97], "colon": 79, "color": 100, "colspan": 79, "column": 79, "com": [0, 2, 7, 9, 10, 16, 18, 24, 30, 32, 41, 44, 45, 46, 47, 53, 59, 62, 68, 69, 70, 72, 75, 76, 77, 78, 79, 80, 81, 84, 100, 106, 107], "combin": [6, 47, 97], "come": [8, 18, 26, 60, 86, 87, 90, 101, 104, 106], "comfort": [76, 78, 79], "comma": [18, 34, 81], "command": [0, 3, 4, 6, 10, 11, 21, 25, 26, 32, 38, 75, 76, 79, 83, 85, 86, 97], "comment": [10, 25, 29, 35, 36, 37, 38, 48, 76, 79, 102], "comment_tag": 89, "commentari": 64, "commit": [10, 25, 56, 75, 76, 78, 85], "commodi": 79, "common": [11, 39, 43, 47, 63, 68, 71, 76, 86, 87], "commonli": 79, "commonmark": 92, "commun": [6, 8, 10, 11, 20, 23, 38, 43, 48, 80, 86, 101, 102], "compact": 79, "compani": [36, 87], "compar": [6, 7, 11, 13, 17, 47, 63, 68, 75, 95, 104, 106], "comparison": 36, "compat": [10, 20, 90], "compil": [66, 76, 78, 80, 100], "complet": [11, 25, 26, 32, 47, 57, 75, 76, 80, 81, 106, 107], "complex": 37, "compliant": 7, "compon": [6, 57, 77, 90], "compos": [47, 68], "compress": [47, 100], "compromis": [87, 101], "comput": [76, 87], "con": 79, "concat": 100, "concept": [18, 32, 54], "concern": [26, 34, 101], "concert": 37, "conclus": 86, "concret": 79, "concurr": 10, "conda": 102, "condit": [79, 99, 100], "conf": [3, 6, 8, 11, 79, 107], "config": [1, 10, 11, 18, 25, 29, 38, 75, 79, 85, 88, 105], "configur": [4, 6, 7, 8, 11, 15, 18, 20, 30, 31, 32, 36, 38, 43, 58, 75, 79, 81, 85, 86, 87, 89, 90, 100, 103], "confirm": 84, "conflict": 106, "confnam": 11, "confus": [46, 79], "congress": [32, 102], "connect": [0, 2, 8, 10, 11, 13, 20, 21, 25, 37, 38, 53, 75, 86, 90, 96], "connector": 37, "consciou": 101, "consectetur": 79, "consent": 47, "consequ": [20, 26], "consequat": 79, "consetetur": 79, "consid": [25, 30, 53, 63], "consider": 11, "consist": [57, 75], "constantli": 72, "construct": [29, 79], "contact": [10, 19, 20, 101], "contact_url": [10, 19], "contain": [4, 5, 10, 11, 12, 24, 31, 34, 38, 45, 46, 51, 58, 64, 74, 79, 84, 85, 86, 90, 91, 98, 101, 105, 106], "content": [10, 23, 29, 36, 37, 39, 45, 50, 58, 61, 64, 65, 68, 73, 85, 87, 92], "content_xpath": 73, "context": [37, 45, 77, 79, 92, 106], "continu": [47, 77, 79], "contrari": 83, "contribut": [49, 74, 76, 78, 86, 101], "contributor": 79, "control": [6, 11, 76, 87], "conveni": [76, 97], "convent": 26, "convers": 68, "convert": [12, 29, 68, 79, 86, 88, 100, 104], "convert_str_to_int": [88, 100], "cooki": [29, 41, 46, 58, 63, 73, 86, 87], "cool": 46, "copi": [7, 10, 13, 29, 30, 79, 85, 106], "copyright": 79, "core": [3, 11, 30, 47, 57, 63, 93], "coreutil": 80, "corner": 26, "correct": [2, 10, 13, 23, 33], "correctli": [13, 34, 47, 90], "correspond": [6, 11, 93], "could": [10, 11, 29, 46, 72, 79, 97], "count": [11, 29, 44, 68, 79, 90], "counter": 97, "counterpart": [76, 85], "countri": [29, 41, 47, 60, 93], "countrycod": 60, "cours": 79, "cover": 76, "coverag": 76, "cp": 10, "cpan": 102, "cpp": 102, "cpprefer": 102, "cpu": 11, "cr": [47, 102], "crawl": 72, "crawl_dat": 72, "crawler": 79, "creat": [4, 6, 7, 8, 9, 11, 23, 30, 31, 34, 37, 39, 43, 45, 67, 75, 76, 79, 81, 85, 95, 97, 106], "create_timestamp_asc": 33, "create_timestamp_desc": 33, "created_tim": 45, "creation": [3, 79], "credibl": 62, "cross": 79, "crossref": 102, "crowdview": 102, "cruis": 51, "cryptographi": 23, "cspan": 79, "css": [12, 76, 78, 90], "csv": [10, 22, 81], "csv_tabl": 79, "ctan": 79, "ctrl": [10, 75], "ctx": 77, "cu": 47, "cup": 106, "curl": [0, 10, 13, 80], "curli": 102, "currenc": [29, 84, 88, 102], "currency_convert": 102, "current": [10, 18, 24, 26, 29, 30, 47, 64, 76, 90, 97], "cursor": 37, "custom": [10, 20, 26, 30, 36, 40, 43, 60, 68, 79, 85, 86, 88, 104], "custom_query_json": 36, "customiz": 1, "customlog": 6, "cv": [100, 102], "cy": 100, "cycl": 75, "cz": [47, 102], "d": [0, 6, 7, 8, 11, 46, 84, 100, 106], "d41586": 29, "da": [70, 100, 102], "daemon": 11, "dai": [11, 29, 41, 47, 73, 81, 83, 91], "daili": 75, "dailymot": [32, 102], "danger": 79, "danhper": 80, "dark": [10, 24], "darmarit": 10, "dash": 7, "data": [4, 29, 30, 34, 35, 36, 37, 41, 44, 46, 47, 53, 63, 64, 76, 79, 84, 87, 88, 90, 100, 101], "data_typ": 30, "databas": [2, 10, 13, 21, 23, 25, 32, 37, 38, 51, 79, 97], "dataclass": 30, "date": [1, 29, 72], "datetim": [29, 79], "db": [2, 7, 10, 11, 13, 21, 25, 35, 37, 75, 86, 88, 90, 97], "dbpedia": [10, 22, 81], "dc": 102, "ddd": 102, "ddg": [46, 84, 102, 104], "ddg_categori": 46, "ddi": [46, 102], "ddn": 102, "ddv": 102, "de": [1, 10, 11, 18, 22, 24, 33, 37, 40, 43, 47, 51, 60, 73, 93, 100, 102, 107], "de_facto": 93, "deactiv": [10, 19], "deal": [18, 43, 100], "debian": [3, 7, 8, 10, 79, 80], "debug": [2, 4, 9, 10, 19, 75, 76], "dec": 11, "decentr": [55, 101], "decim": 29, "declar": 31, "decod": 47, "decoupl": 85, "decreas": [10, 24], "dedic": [11, 75, 79], "deep": 90, "deeper": [76, 79], "deezer": 102, "def": [29, 77, 79, 90, 92, 100], "default": [6, 7, 8, 10, 11, 13, 15, 18, 19, 20, 22, 24, 26, 30, 31, 34, 35, 37, 38, 39, 43, 44, 45, 46, 48, 53, 58, 60, 63, 65, 66, 69, 77, 79, 81, 83, 87, 90, 91, 92, 93, 96, 97, 99, 100, 102, 103, 105, 106, 107], "default_http_head": [10, 23], "default_lang": [10, 18, 22], "default_local": [1, 10, 24], "default_on": 77, "default_request_param": 99, "default_them": [1, 10, 24], "defin": [7, 13, 15, 18, 20, 24, 30, 35, 37, 46, 77, 79, 80, 90, 106], "definit": [47, 102], "deflat": 90, "dejavu": 3, "del": 97, "delet": [18, 30, 76, 81, 97, 106], "delimit": [34, 79, 84], "demo": [18, 32, 38, 97], "demo_offlin": [27, 38], "demo_onlin": 28, "demon": 10, "demonstr": [37, 77], "deni": [6, 10, 11, 22, 91], "depend": [4, 6, 8, 12, 13, 25, 29, 40, 63, 75, 76, 79, 80, 81], "deploi": [7, 23, 24, 76, 79], "deprec": [25, 90], "depth": [68, 79], "desc": 37, "describ": [6, 9, 11, 15, 18, 30, 34, 35, 36, 37, 75, 76, 79, 100, 107], "descript": [12, 21, 26, 29, 37, 38, 41, 45, 47, 63, 77, 79, 84, 88, 93, 94, 100], "description_and_sourc": 84, "deserv": 26, "design": [10, 36, 57, 79], "desir": [29, 68], "desktop": [0, 24, 61, 75], "detach": 7, "detail": [6, 10, 11, 18, 19, 29, 30, 47, 72, 79], "detect": [10, 13, 22, 24, 46, 86, 88, 100], "detect_google_captcha": 47, "detect_languag": [88, 100], "determin": [0, 13, 30, 32, 46, 84, 90, 93, 100], "detriment": 10, "deutsch": 1, "deutschland": 51, "dev": [3, 6, 8, 10, 69, 76, 79, 80, 102], "devel": [3, 10], "develop": [4, 10, 14, 26, 33, 43, 76, 79, 82, 86, 100, 101, 105, 106], "deviantart": 102, "devop": [2, 9, 25, 75, 86, 106], "devpkg": 76, "dfrac": 79, "dg": 84, "dh": 102, "dhivehi": 93, "dialog": 47, "diam": 79, "dict": [29, 30, 31, 34, 47, 53, 65, 72, 77, 83, 90, 93, 98, 100], "dict_subset": [88, 100], "dictionari": [18, 30, 47, 88, 90, 93, 97, 100], "dictzon": 102, "did": [6, 90], "didn": 10, "diff": 79, "differ": [6, 11, 12, 18, 20, 26, 29, 41, 43, 47, 48, 59, 63, 68, 73, 75, 79, 101, 104, 106], "dig": 84, "digest": [12, 69, 104], "digit": [43, 60, 93, 101], "digraph": 79, "diq": 100, "dir": 10, "direct": [6, 8, 74, 78, 79, 93], "directli": [19, 23, 65, 66, 76, 85, 104, 106], "directori": [6, 7, 11, 20, 34, 92, 102], "dirmngr": 80, "dirti": 7, "disabl": [4, 10, 11, 15, 17, 18, 19, 20, 22, 24, 27, 28, 30, 37, 43, 69, 75, 77, 79, 81, 102, 106], "disabled_engin": 81, "disabled_plugin": 81, "disadvantag": 79, "discov": 51, "discoveri": [18, 34, 35, 36, 37], "discrep": 100, "discuss": 86, "displai": [3, 7, 10, 12, 17, 18, 19, 29, 30, 35, 37, 63, 64, 68, 79, 102], "display_error_messag": [18, 29, 30], "display_typ": 68, "displaystyl": 79, "dispos": 105, "disrespect": 26, "dist": [26, 76], "distinguish": [79, 93], "distribut": [6, 7, 8, 11, 18, 20, 69, 75, 79, 100], "distributor": 4, "distro": 75, "dive": 87, "divid": [75, 95], "dl_prefix": 61, "dm": 102, "dnf": [3, 6, 8, 10, 79], "do": [0, 3, 5, 6, 8, 9, 11, 12, 18, 26, 27, 28, 35, 36, 37, 43, 56, 59, 63, 72, 75, 76, 78, 79, 87, 93, 100, 103, 106], "doc": [4, 6, 10, 11, 16, 18, 30, 37, 44, 74, 75, 79, 100, 101, 106], "docker": [4, 5, 9, 53, 75, 76, 86, 102], "docker_hub": 102, "dockerfil": 7, "dockerhub": 7, "docs_url": [10, 16], "doctest": 79, "doctre": 79, "document": [3, 6, 16, 18, 30, 32, 33, 35, 36, 46, 47, 48, 61, 64, 76, 79, 86, 88, 92, 101, 106], "documented_modul": 79, "documentroot": 6, "docutil": 79, "doe": [6, 9, 10, 11, 18, 25, 29, 30, 37, 38, 39, 40, 41, 43, 44, 46, 47, 54, 57, 61, 62, 63, 68, 72, 75, 79, 81, 86, 97, 99, 100, 103, 106], "doesn": [15, 23, 24, 31, 37, 44, 50, 51, 58, 77, 100, 101], "doi": [10, 12, 29], "dolor": 79, "dom": [47, 53], "domain": [61, 70, 72, 79], "domin": 26, "don": [6, 7, 10, 13, 15, 21, 24, 25, 26, 29, 73, 78, 79, 83, 86, 93, 106], "donat": [10, 19], "donation_url": [10, 19], "done": [25, 47, 75, 76, 79, 80, 83, 85, 90, 100, 106], "dontlog": 6, "dot": [3, 76], "doubl": 79, "down": [46, 58, 93], "download": [9, 10, 23, 29, 37, 61, 69, 72, 75, 76, 79, 80], "download_error": 72, "dr": [46, 75], "drag": 72, "draw": 49, "driven": [57, 62, 86, 101], "driver": 76, "drop": [7, 28, 72, 78, 90, 97, 106], "drop_count": [88, 97], "dry": 7, "dsb": 100, "dt": 33, "dty": 100, "duckduckgo": [2, 10, 15, 22, 32, 81, 84, 102, 104], "duckduckgo_definit": [46, 102], "duckduckgo_extra": [46, 102], "due": [72, 97], "dummi": 18, "duo": 79, "duplic": [45, 101], "durat": [37, 45, 97], "dure": [37, 47, 52], "duref": 79, "dv": [93, 100], "dvisvgm": 3, "dynam": [0, 13], "dz": 102, "e": [7, 10, 13, 17, 26, 29, 36, 37, 43, 46, 47, 63, 64, 71, 75, 76, 78, 79, 80, 84, 87, 90, 92, 93, 95, 100, 104, 106, 107], "e121": 75, "e5a2": 20, "ea": 79, "each": [10, 11, 15, 20, 25, 29, 30, 34, 36, 38, 63, 68, 73, 75, 77, 79, 80, 81, 84, 85, 95, 97, 100, 106], "easi": [7, 75, 86], "easier": 26, "easiest": 34, "easili": [13, 26, 53], "echo": [10, 80, 106], "ecma": 100, "ecma_unescap": [88, 100], "ecosi": 69, "ecosystem": 79, "ecretvalu": 15, "edg": 101, "edit": [11, 26, 68, 75, 76, 79, 87], "editor": 29, "edu": 28, "ee1f": 20, "effect": [9, 11, 26, 79], "effici": [57, 100], "eg": 47, "egnine_lang": 30, "egnine_region": 30, "eirmod": 79, "either": [35, 100, 101], "el": [47, 70, 100], "elast": 36, "element": [34, 63, 65, 79, 100], "elementbas": 100, "elit": 79, "elitr": 79, "els": [79, 85, 106], "emac": 79, "email": [10, 20], "emb": [4, 45, 57, 79], "embed": [1, 7, 79], "eml": 100, "emoji": [84, 93], "emperor": 11, "emphasi": 79, "empti": [6, 15, 37, 39, 46, 47, 53, 61, 73, 79, 93, 100, 106], "en": [1, 10, 11, 18, 19, 20, 22, 24, 29, 33, 43, 47, 53, 63, 68, 70, 73, 76, 79, 92, 93, 100, 102], "en_au": 46, "en_ca": 46, "en_en": 45, "en_gb": [45, 46, 63], "en_u": [18, 29, 45, 46], "enabl": [1, 4, 6, 7, 8, 10, 11, 15, 18, 19, 20, 23, 24, 26, 29, 30, 33, 34, 36, 37, 53, 68, 76, 79, 81, 94, 95, 102], "enable_http": [18, 29, 30, 35, 36], "enable_http2": [10, 18, 20], "enable_metr": [10, 19], "enabled_engin": 81, "enabled_engine_count": 79, "enabled_plugin": [10, 81, 94, 95], "encapsul": 75, "enclos": 79, "encod": [10, 11, 30, 47, 63, 79, 90], "encompass": 63, "encount": 101, "encourag": 79, "encrypt": 86, "encyclopedia": 68, "end": [39, 54, 71, 78, 79, 106], "endfor": 79, "endif": 79, "endpoint": [33, 49, 65, 81], "eng_lang": 46, "eng_region": 46, "eng_trait": [46, 47, 68], "engin": [0, 1, 4, 10, 13, 14, 15, 17, 20, 22, 26, 36, 39, 40, 44, 45, 48, 52, 53, 55, 57, 59, 60, 64, 65, 66, 67, 68, 69, 71, 72, 74, 77, 79, 81, 83, 84, 86, 87, 88, 91, 93, 98, 99, 103], "engine_categori": [83, 99], "engine_data": [31, 98], "engine_default_arg": 31, "engine_descript": 84, "engine_list": 31, "engine_local": 93, "engine_nam": 99, "engine_set": [27, 28, 34, 38, 39, 52, 65, 71], "engine_shortcut": [31, 32], "engine_trait": [30, 39, 40, 41, 43, 45, 46, 47, 53, 55, 56, 60, 63, 68, 70, 71, 76], "engine_traits_fil": [30, 84], "engine_typ": [30, 32, 72, 79], "enginelib": [30, 47, 84], "engineprocessor": 99, "engineref": [88, 98], "engineref_list": 98, "enginetrait": [30, 39, 40, 41, 43, 45, 46, 47, 53, 55, 56, 60, 63, 68, 70, 71], "enginetraitsencod": 30, "enginetraitsmap": [30, 84], "english": [1, 18, 22, 46, 93, 100], "english_nam": 93, "enim": 79, "enough": [25, 100], "ensur": [2, 10, 26], "ensure_ascii": 30, "enter": [10, 75], "entir": [6, 10, 97], "entiti": 46, "entri": [7, 10, 27, 28, 74, 79], "entrypoint": 7, "enum": 34, "env": [6, 11, 74, 75, 78, 106], "environ": [7, 10, 15, 26, 35, 37, 38, 74, 75, 78, 80, 86, 93, 106, 107], "eo": [1, 79, 100], "eof": 106, "eol": 106, "eoss": 106, "epub": [39, 71], "equal": [84, 95], "equat": [3, 74], "equival": 100, "erat": 79, "error": [10, 11, 13, 18, 19, 20, 22, 25, 29, 30, 33, 34, 38, 53, 67, 72, 73, 79, 90, 91, 100], "error_log": 8, "es_ar": 46, "escap": [79, 84], "espa\u00f1ol": 100, "especi": 79, "esperanto": 1, "essenti": [3, 10, 13, 76, 80], "est": 79, "establish": 10, "et": [47, 70, 79, 100], "etc": [2, 6, 7, 8, 10, 11, 13, 15, 25, 26, 43, 75, 98, 106, 107], "eth0": [75, 106], "etre": [65, 100], "eu": [69, 100], "eval_xpath": [88, 100], "eval_xpath_getindex": [88, 100], "eval_xpath_list": [88, 100], "evalu": [7, 46, 62, 68, 79, 90, 95, 100, 106], "even": [11, 18, 21, 47, 75, 106], "event": 11, "ever": 106, "everi": [18, 25, 26, 29, 53, 63, 75, 83, 85, 87, 88, 106], "everyon": [86, 87, 101], "everyth": [10, 79, 87], "ex": 79, "exabot": 90, "exact": 35, "exact_match_onli": 35, "exactli": [11, 79], "exampl": [0, 1, 2, 6, 10, 11, 13, 14, 15, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 38, 39, 41, 44, 46, 47, 51, 68, 71, 74, 75, 81, 83, 84, 87, 90, 93, 94, 95, 100, 104, 105, 106], "excel": 5, "except": [6, 15, 26, 29, 30, 79, 86, 88, 90, 100], "exchang": 87, "exec": 7, "exec_modul": 83, "execstart": 11, "execut": [0, 18, 30, 34, 76, 78, 89, 106], "exercis": 75, "exercit": 79, "exist": [5, 7, 10, 15, 18, 22, 25, 26, 30, 37, 47, 63, 75, 76, 80, 84, 90, 97, 100, 106], "exit": [7, 10, 12, 93, 94], "expand": 79, "expect": [10, 18, 26, 34], "experienc": 75, "expert": 86, "expir": [11, 25, 90, 97], "explain": [6, 8, 26], "explanatori": [106, 107], "explicit": [45, 79], "export": [7, 10, 61, 75, 106], "expos": [18, 35, 36, 37, 83], "expres": 66, "express": [12, 34, 90, 91], "ext": 3, "extend": [26, 33, 38, 43, 77, 79], "extens": [3, 11, 39, 79], "extent": 25, "extern": [10, 29, 38, 74, 79, 81, 87, 103], "external_bang": [84, 98], "extra": [3, 6, 10, 20], "extra_proxy_timeout": [10, 20], "extract": [3, 53, 68, 88, 89, 100], "extract_text": [88, 100], "extract_url": [88, 100], "extractor": [85, 86, 88], "extrem": 46, "ey": [75, 79], "f": [7, 75, 79, 84, 95, 100, 106], "f3": 100, "fa": [93, 100], "face": 79, "facebook": [50, 58], "facet": 36, "fact": 13, "facto": [43, 93], "factor": 95, "factori": 30, "fail": [11, 31, 75, 76, 78], "fake": 90, "fallback": [80, 93], "fallback_to_default": 92, "fals": [1, 2, 10, 13, 15, 16, 18, 19, 20, 23, 24, 27, 28, 30, 35, 37, 43, 45, 53, 58, 64, 65, 73, 77, 79, 81, 90, 92, 93, 100], "famili": 45, "familiar": [11, 76], "family_filt": 45, "family_filter_map": 45, "fanci": 26, "faq": 79, "far": 46, "farsid": 90, "fashion": 20, "fast": 37, "fasttext": 100, "favorit": [26, 76], "fd": 102, "fd00": 6, "fd42": 75, "fdroid": 102, "fdsize": 11, "fe5b": 75, "fe80": [6, 10, 13, 20, 90], "featur": [10, 11, 18, 23, 25, 26, 46, 52, 57, 62, 79, 87, 102, 104], "feder": [48, 50], "fedora": [3, 6, 8, 10, 11, 79, 106], "fedora35": 106, "fedoraproject": 106, "feed": 44, "feedback": [26, 79], "feedfetch": 90, "feel": [77, 79, 104], "fetch": [28, 30, 39, 40, 41, 43, 45, 46, 47, 51, 53, 55, 56, 60, 63, 68, 70, 71, 84, 94, 107], "fetch_trait": [30, 39, 40, 41, 43, 45, 46, 47, 53, 55, 56, 60, 63, 68, 70, 71, 93], "fetch_traits_map": 84, "fetch_wikimedia_trait": 68, "few": [18, 25, 26, 29, 45, 104], "fewer": 44, "fi": [100, 106], "field": [30, 39, 40, 43, 45, 63, 68, 90, 95], "fieldnam": 79, "figur": 74, "fil_ph": 63, "file": [3, 6, 7, 8, 10, 11, 13, 14, 15, 17, 18, 20, 24, 25, 26, 30, 34, 37, 39, 44, 53, 61, 65, 71, 72, 75, 76, 83, 84, 85, 89, 92, 93, 103, 106], "filenam": 91, "fileobj": 89, "files": [29, 72, 100], "filesize_multipli": 100, "filesystem": 61, "fill": 79, "film": [37, 51], "filmlist": 37, "filter": [1, 10, 22, 27, 28, 39, 45, 46, 51, 57, 60, 63, 71, 73, 76, 81, 84, 90, 100, 104], "filter_link_loc": 13, "filter_local": 84, "filtron": 25, "final": 58, "find": [2, 7, 10, 13, 18, 21, 25, 26, 34, 35, 36, 46, 50, 72, 93, 101, 104, 106], "fine": [9, 10], "finish": [78, 106], "firefox": [0, 3, 10, 76, 84, 101], "first": [5, 6, 21, 25, 35, 38, 41, 47, 58, 68, 73, 75, 76, 78, 79, 87, 90, 93, 95, 100, 104, 106], "first_page_num": 73, "fit": [11, 18, 30, 36, 46, 47, 57, 62, 68, 77, 84, 90, 93], "five": 93, "fix": [25, 26, 43], "fka": 68, "fl": 102, "flag": [7, 43, 84, 93], "flask": [13, 77, 79, 83, 92, 98], "flask_babel": 93, "flaskfix": [6, 8], "fledg": 18, "flexibl": [34, 79], "flickr": 102, "flickr_noapi": 102, "float": [29, 30, 95, 98, 100], "fname": 92, "fnd": 34, "focu": 54, "folder": [6, 8, 9, 11, 25, 29, 30, 75, 76, 79, 82, 92, 93, 105, 106], "follow": [6, 7, 8, 9, 10, 11, 15, 21, 23, 26, 27, 28, 29, 31, 33, 34, 35, 36, 37, 39, 44, 48, 51, 52, 53, 59, 61, 62, 65, 69, 71, 76, 79, 90, 95, 106], "followsymlink": 6, "font": 3, "fontsrecommend": 3, "foo": [29, 30, 96, 97], "food": 43, "fooh": 43, "footer": [10, 26], "forbid": 50, "forc": 11, "force_timeout": [75, 105, 106], "forget": [7, 10, 21, 24, 25, 26, 106], "fork": [9, 26, 75, 86, 100, 101], "form": [1, 10, 19, 39, 46, 63, 71, 79, 87], "format": [10, 22, 33, 38, 47, 64, 72, 74, 78, 79, 81, 90], "format_not_support": 72, "formatt": 84, "formerli": 71, "forward": [0, 6, 8, 13, 49, 87, 90, 106], "found": [3, 11, 32, 38, 70, 72, 76, 100], "foundat": [18, 34, 35, 36, 37, 77], "fqn": 90, "fr": [10, 18, 22, 24, 30, 33, 43, 47, 73, 84, 93, 100, 102, 104], "fr_be": 93, "fr_ca": 93, "fr_ch": 93, "fr_fr": 93, "fraction": 79, "fralef": 106, "framework": 30, "fran\u00e7ai": [84, 93], "free": [26, 29, 39, 54, 69, 77, 86, 101, 102], "freedom": 101, "freeli": 47, "freer": 101, "french": [30, 93], "frequent": 68, "fresh": 6, "fridai": 85, "friend": [18, 87], "friendli": 57, "frinkiac": 102, "frk": 102, "from": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 20, 22, 25, 26, 27, 28, 29, 30, 31, 33, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 53, 54, 55, 56, 58, 59, 60, 63, 64, 65, 66, 68, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 100, 101, 104, 106, 107], "from_data": 30, "from_lang": 29, "from_nam": 29, "from_si": 95, "from_url": 21, "fromstr": 100, "front": [54, 79], "frontend": 57, "frontend_url": 57, "frozenset": 100, "frr": 100, "fsd": 102, "fsk": 51, "ftp": 29, "full": [15, 18, 29, 36, 47, 61, 79, 90], "fulli": 52, "function": [28, 29, 30, 31, 38, 46, 47, 63, 68, 77, 79, 86, 88, 89, 90, 93, 95, 97, 106], "fund": [18, 34, 35, 36, 37], "further": [30, 67, 73, 100, 101], "furthermor": [29, 35, 36, 81, 87], "fv": 107, "fy": 100, "f\u00fcr": [42, 64], "g": [7, 10, 13, 17, 26, 29, 36, 37, 43, 44, 46, 47, 64, 71, 75, 76, 78, 79, 84, 87, 90, 92, 93, 95, 104, 106, 107], "ga": 100, "gain": 87, "gawk": 80, "gb": [43, 47, 100], "gb_gb": 63, "gd": [3, 100], "ge": 102, "gecko": 76, "geckodriv": 76, "gen": 102, "gen_userag": [88, 100], "gener": [1, 2, 4, 6, 7, 10, 11, 14, 17, 18, 26, 30, 32, 33, 37, 43, 58, 63, 66, 69, 71, 73, 83, 84, 87, 90, 93, 95, 100, 101, 103, 104], "genesi": [71, 102], "geniu": 102, "genr": 51, "gentlemen": 74, "gentoo": 102, "geojson": 29, "german": [1, 18, 42, 51, 60], "gesg2kvx": 68, "get": [3, 4, 6, 8, 9, 10, 11, 13, 21, 25, 26, 27, 28, 29, 36, 38, 41, 43, 45, 46, 47, 58, 63, 65, 68, 74, 75, 76, 78, 79, 81, 83, 84, 86, 90, 91, 92, 95, 96, 97, 100, 101, 104, 106, 107], "get_attribut": 65, "get_ctx": 92, "get_ddg_lang": 46, "get_engine_from_set": [88, 100], "get_engine_local": [30, 88, 93, 100], "get_engines_stat": 79, "get_google_info": 47, "get_languag": 30, "get_language_nam": 93, "get_local": [88, 93], "get_locale_descr": 84, "get_network": [88, 90], "get_official_languag": 93, "get_official_local": [88, 93], "get_output": 84, "get_pag": 92, "get_param": 99, "get_ping_kei": 90, "get_real_ip": [88, 90], "get_region": 30, "get_sc_cod": 63, "get_search_queri": [82, 83], "get_set": 107, "get_tag": 84, "get_territory_nam": 93, "get_thumbnail": 68, "get_token": 90, "get_torrent_s": [88, 100], "get_torznab_attribut": 65, "get_transl": [88, 93], "get_translation_local": [88, 93], "get_unicode_flag": 84, "get_valu": 92, "get_vqd": 46, "get_wiki_param": 68, "get_xpath": [88, 100], "gh": [26, 47, 85, 102], "gib": 100, "gid": 11, "gif": 72, "gil": 11, "git": [3, 7, 9, 10, 15, 22, 26, 29, 30, 32, 61, 75, 76, 77, 78, 79, 80, 82, 84, 85, 89, 93, 105, 106, 107], "git_branch": [75, 107], "git_url": [75, 107], "github": [7, 9, 10, 16, 53, 69, 75, 76, 77, 78, 79, 80, 81, 85, 102, 106, 107], "gitlab": 102, "gitmoji": 26, "give": [6, 8, 11, 76, 83, 101, 104], "given": [21, 32, 79, 90, 95, 97, 100], "gl": [47, 76, 100, 102], "glob": 11, "global": [18, 20, 29, 45, 69, 80, 93, 97], "global_ip": 106, "globe": 93, "gluetun": 53, "glyph": 79, "gn": 100, "gnu": 76, "go": [18, 35, 38, 41, 46, 47, 74, 78, 79, 87, 90, 102], "goal": 30, "goe": 76, "goi": [1, 102], "golang": [76, 80], "gom": 100, "gon": 102, "goo": 102, "good": [8, 75, 93, 100], "googl": [1, 10, 15, 18, 22, 30, 32, 76, 81, 83, 101, 102], "google_complet": 47, "google_domain": 47, "google_imag": [47, 102], "google_new": [47, 76, 102], "google_plai": 102, "google_scholar": [47, 102], "google_video": [47, 102], "googlebot": 90, "googleimageproxi": 90, "googleusercont": [10, 24], "gosl": 51, "gov": 102, "government": 42, "gpa": 102, "gpg": 80, "gpm": 102, "gpod": 102, "gpodder": 102, "gr": 47, "grandma": 67, "grant": [6, 11], "granular": 76, "graphviz": 3, "great": 36, "green": [47, 77], "grep": [11, 75, 76, 80, 106], "group": [7, 11, 18, 21, 76, 79, 87, 95], "group_bang": 79, "group_engines_in_tab": 79, "grow": [5, 25], "grumpi": [79, 83], "gsw": 68, "gu": 100, "gubergren": 79, "guess": [46, 63], "guest": 75, "guid": [8, 36, 79], "guidanc": [6, 8], "guidelin": [18, 78], "guilabel": 79, "gv": 100, "gz": [6, 11], "gzip": [11, 90], "h": [3, 6, 7, 8, 9, 10, 11, 21, 25, 33, 34, 75, 79, 83, 105, 106, 107], "ha": [11, 13, 15, 18, 25, 26, 29, 34, 38, 39, 41, 44, 47, 48, 52, 57, 59, 60, 62, 65, 69, 71, 75, 79, 80, 85, 86, 87, 91, 92, 93, 95, 97, 100, 106], "habr": 102, "habrahabr": 102, "hack": [26, 78, 83], "hackabl": 74, "hackernew": 102, "had": [11, 46], "han": [47, 93], "handi": 106, "handl": [18, 30, 35, 47, 75, 79, 87, 99, 100, 106], "hant": [47, 93], "happen": 90, "happi": [26, 78], "hard": [13, 29, 79], "hardcod": 13, "harmon": [41, 100], "hash": [10, 12, 90, 97, 104], "hash_plugin": 81, "hashtag": 102, "hat": 79, "have": [0, 5, 6, 7, 8, 9, 10, 11, 18, 25, 26, 29, 33, 35, 36, 37, 38, 41, 43, 51, 53, 58, 63, 66, 68, 75, 76, 78, 79, 80, 87, 90, 93, 101, 106], "hbar": 79, "he": [47, 70, 79, 93, 100], "head": [10, 76], "header": [13, 18, 23, 29, 30, 46, 47, 53, 58, 63, 68, 73, 79, 88], "headers_modul": 6, "headlesschrom": 90, "headlin": 100, "heard": 79, "height": [72, 79], "held": 62, "hello": 11, "help": [7, 21, 26, 47, 53, 66, 74, 80, 86, 101, 105], "helper": 79, "henc": 51, "her": 18, "here": [3, 11, 17, 20, 25, 26, 29, 30, 36, 37, 41, 67, 68, 73, 75, 76, 78, 79, 83, 106], "herein": 2, "hesit": [78, 86], "heterogen": 75, "hex": [10, 102], "hi": [47, 100], "hidden": [1, 18, 87], "hierarchi": 61, "hif": 100, "higher": [68, 76], "highest": 95, "him": 18, "hint": [2, 11, 30, 75, 79], "histori": [10, 42], "hit": [10, 58, 68, 95], "hk": [47, 68, 70, 93], "hl": [47, 76], "hn": 102, "ho": 102, "holland": 104, "home": [10, 13, 30, 63, 75, 76, 80, 85], "homepag": 29, "hong": 93, "hoogl": 102, "hook": 77, "host": [0, 3, 6, 7, 8, 10, 11, 16, 26, 35, 52, 55, 75, 86, 106], "hostabl": 50, "hostnam": [10, 12, 106], "hostname_replac": [10, 81], "hotkei": [10, 24], "hour": [41, 73, 91], "hous": [29, 84], "house_numb": 29, "housekeep": 7, "hovercard": 68, "how": [4, 5, 6, 7, 8, 9, 11, 15, 18, 37, 46, 68, 72, 74, 75, 76, 78, 79, 86, 103], "howev": [29, 47, 50, 81], "hr": [64, 70, 100], "href": [46, 73, 90], "hsb": 100, "ht": 100, "html": [1, 3, 6, 10, 11, 18, 22, 26, 29, 30, 37, 44, 46, 47, 59, 63, 68, 75, 76, 79, 90, 92, 100], "html_math_render": 3, "html_str": 100, "html_to_text": [88, 100], "html_url": 29, "htmlelement": [53, 100], "http": [0, 1, 2, 3, 4, 7, 9, 10, 11, 13, 16, 18, 20, 22, 23, 24, 25, 26, 29, 30, 33, 36, 37, 38, 41, 45, 46, 47, 48, 51, 52, 53, 56, 57, 59, 61, 63, 68, 69, 72, 73, 75, 76, 77, 78, 79, 80, 84, 85, 88, 94, 100, 106, 107], "http2": [10, 20], "http_connect": 8, "http_digest_auth_pass": 69, "http_digest_auth_us": 69, "http_host": 8, "http_protocol_vers": 10, "http_x_forwarded_for": 8, "http_x_real_ip": 8, "http_x_scheme": 8, "http_x_script_nam": 8, "httpclient": 90, "httpd": 6, "httpx": [10, 20, 65, 79], "hu": [47, 100], "hub": 102, "huge": [65, 79], "human": [29, 100], "humanize_byt": [88, 100], "hy": 100, "i": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 97, 99, 100, 103, 104, 106, 107], "i18n": [84, 85, 86, 88], "i18n_origin": 92, "i686": 66, "ia": [100, 102], "iana": 63, "icon": 102, "id": [7, 10, 29, 45, 47, 58, 63, 65, 76, 95, 100], "idea": 54, "ident": [41, 56, 63, 66, 106], "identif": 100, "identifi": [44, 46, 51, 72, 106], "ie": [47, 76, 100], "iframe_src": 45, "ig": 84, "ignor": [11, 13, 27, 45, 46, 47, 90, 93], "il": 47, "illustr": 5, "ilo": 100, "imag": [1, 3, 4, 9, 10, 17, 23, 25, 28, 43, 58, 59, 62, 68, 69, 72, 74, 75, 76, 81, 83, 103, 104, 106], "image_proxi": [2, 10, 23, 81], "image_url": 72, "imagemagick": [3, 79], "imagin": 34, "imdb": 51, "img": [47, 102], "img_format": 29, "img_src": [29, 68, 73], "imgmath": 3, "imgmath_font_s": 3, "imgmath_image_format": 3, "imgmath_latex": 3, "imgur": 102, "immedi": [10, 24, 97], "implement": [4, 9, 11, 18, 25, 26, 27, 28, 29, 30, 40, 41, 47, 49, 51, 53, 54, 63, 68, 72, 74, 76, 77, 78, 86, 88, 89, 90, 96, 97, 100, 106], "impli": 18, "import": [79, 83, 92, 93, 96], "importlib": 83, "imposs": 91, "improp": 59, "improv": [86, 101], "ina": 102, "inact": [18, 30], "inbound": [2, 10, 23], "incl": 76, "includ": [6, 7, 8, 9, 17, 18, 34, 37, 65, 68, 75, 76, 79, 93, 106], "includeopt": 6, "inclus": 104, "incom": [6, 90], "incoming_links_asc": 33, "incoming_links_desc": 33, "inconsist": 90, "incr": 97, "incr_count": [88, 97], "incr_sliding_window": [88, 97], "increas": 25, "increment": 97, "indent": [30, 79, 106], "independ": [48, 63], "index": [6, 35, 36, 43, 54, 56, 61, 72, 100], "indic": [36, 68, 72], "individu": 36, "infinit": 97, "infinite_scrol": [10, 24, 57, 62], "infinitescrollajax": 41, "info": [10, 19, 20, 68, 75, 76, 86, 88, 106], "info_fold": 92, "info_msg": 106, "infobox": [68, 84], "infopag": [88, 92], "infopageset": [88, 92], "inform": [10, 12, 18, 20, 22, 26, 29, 65, 75, 76, 86, 92, 94, 98, 101, 106], "infrastructur": [2, 11, 25], "inherit": [79, 98], "ini": [6, 7, 8, 11, 25, 75, 107], "init": [11, 27, 28, 38, 39, 52, 65, 71, 75, 93, 106], "initgroup": 11, "initi": [4, 10, 11, 13, 15, 18, 27, 28, 30, 31, 34, 35, 36, 37, 52, 65, 75, 79, 83, 93, 96, 97, 106], "inlin": 74, "inod": 106, "input": [1, 18, 63, 79], "insecur": 10, "insert": [79, 106], "insid": [10, 34, 75, 91, 106], "insight": 87, "inspect": [4, 9, 75, 107], "inspir": [97, 101], "instal": [2, 3, 4, 6, 7, 8, 11, 13, 21, 26, 35, 36, 37, 38, 53, 66, 74, 75, 77, 78, 79, 80, 86, 105], "instanc": [0, 1, 2, 5, 6, 7, 8, 10, 11, 13, 18, 21, 23, 24, 25, 30, 33, 34, 35, 36, 37, 38, 47, 48, 50, 56, 57, 58, 60, 65, 69, 72, 75, 76, 77, 81, 84, 86, 92, 97, 101, 106, 107], "instance_nam": [1, 2, 7, 10, 19], "instant": 76, "instanti": [30, 97], "instead": [11, 18, 24, 36, 41, 50, 73, 79, 84, 97], "institut": [28, 42], "instruct": [53, 79, 101], "int": [29, 79, 91, 97, 98, 100], "int_or_zero": [88, 100], "integr": [34, 36, 76, 85, 86], "intend": [7, 30, 45], "intent": [13, 26, 106], "intention": 58, "interact": [7, 10, 105, 106], "intercept": 90, "interest": [6, 7, 8, 71], "interfac": [6, 10, 17, 18, 20, 22, 24, 47, 48, 61], "interfer": 26, "intermedi": 76, "intern": [30, 33, 47, 51, 93, 100], "internet": [10, 24, 38, 75, 86, 101], "internet_archive_scholar": 102, "internetarchivescholar": 102, "interpret": [11, 47, 76, 79], "intersect": [84, 93], "intersphinx_map": 79, "interv": 41, "introduc": [38, 68, 74, 79, 106], "introduct": 76, "intuit": 79, "inv": 79, "invalid": [13, 90], "inventori": 79, "investig": 90, "invidi": 102, "invidunt": 79, "io": [11, 35, 76, 79, 100], "ip": [4, 6, 8, 12, 13, 20, 46, 63, 75, 83, 86, 87, 88, 94, 106], "ip_limit": 13, "ip_list": 13, "ipecho": 0, "ipf": 39, "ipsum": [79, 104], "iptabl": 106, "ipv4": [13, 18, 20, 90, 106], "ipv4_prefix": 13, "ipv4address": 90, "ipv4network": 90, "ipv6": [13, 18, 20, 75, 90, 106], "ipv6_prefix": 13, "ipv6address": 90, "ipv6network": 90, "ir": 93, "is_broken_text": 46, "is_created_for_kid": 45, "is_instal": [4, 13], "is_locale_support": 30, "is_missing_required_attribut": [31, 32], "is_suspici": 90, "is_valid_lang": [88, 100], "is_vpn_connect": 53, "isbn": 29, "isn": 67, "iso": [18, 24, 29, 33, 63, 73, 100], "isol": 75, "issn": 29, "issu": [0, 10, 11, 16, 18, 29, 75, 90, 101, 106], "issue_url": [10, 16], "ital": [29, 79], "item": [7, 28, 29, 30, 51, 65, 72, 73, 79, 88, 95, 97], "iter": [30, 92], "iter_pag": 92, "its": [26, 27, 28, 31, 33, 35, 43, 46, 47, 68, 71, 72, 79, 80, 81, 87, 100, 101, 106], "itself": [11, 13, 26, 41, 61], "iv": 102, "j": [12, 46, 48, 74, 78, 84], "ja": [43, 47, 70, 100, 102], "jackett": 65, "jahr": 51, "jahrzehnt": 51, "jahrzent": 51, "jakarta": 90, "jame": 90, "java": 90, "javafx": 90, "javascript": [78, 100], "jbo": 100, "jersei": 90, "jinja": [79, 92], "jinja2": 76, "jinja_context": 79, "job": [85, 105], "join": [86, 100, 101], "joinpeertub": 56, "jon": 10, "journal": [29, 39, 47, 71], "jp": [43, 47], "jpeg": 72, "js_variabl": 100, "js_variable_to_python": [88, 100], "json": [10, 22, 27, 30, 33, 35, 36, 47, 51, 53, 56, 57, 59, 64, 72, 76, 81, 83, 84, 93, 100], "json_engin": 102, "json_seri": [82, 83], "jsonencod": 30, "jspb": 47, "jump": [9, 10, 75, 76, 104], "just": [0, 1, 13, 25, 27, 28, 35, 36, 37, 41, 59, 75, 76, 78, 79, 87, 101, 106], "just_match": 33, "justo": 79, "jv": 100, "k": 11, "ka": 100, "kasd": 79, "kavin": 57, "kbd": 79, "kc": 102, "ke": 47, "keep": [6, 8, 10, 15, 20, 75, 76, 77, 104], "keep_onli": 15, "keepalive_expiri": [18, 20], "kei": [7, 10, 18, 29, 30, 34, 35, 37, 47, 62, 65, 67, 83, 84, 85, 90, 93, 97], "kelvin": 95, "kernel": 66, "keyerror": 90, "keyword": [35, 37, 89, 94, 104], "kickass": 102, "kid": 45, "kind": [6, 43, 63, 79, 87], "kiss_": 79, "kk": 100, "kl": 46, "km": 100, "kn": 100, "know": [6, 11, 18, 63, 75, 79, 85, 87], "knowledg": 79, "known": [11, 13, 68, 76, 90, 93, 95, 101], "ko": [47, 70, 100, 102], "kong": 93, "kr": 47, "krc": 100, "ku": 100, "kv": 100, "kw": 100, "ky": 100, "l": [7, 21, 34, 46, 75, 76, 79, 95, 102, 106], "l19": 75, "la": [21, 79, 100, 106], "label": [79, 84, 100], "labor": 79, "labori": 79, "lack": 26, "lambda": 95, "land": 51, "lang": [1, 11, 70, 73, 76, 83, 84, 98, 100], "lang2domain": 70, "lang_al": 73, "lang_en": [47, 76], "lang_zh": 47, "languag": [1, 10, 11, 18, 22, 24, 29, 30, 33, 39, 40, 41, 45, 46, 47, 53, 54, 55, 56, 60, 68, 70, 71, 73, 76, 79, 81, 84, 90, 92, 93, 98, 100, 103], "language_support": [30, 79], "language_tag": [88, 93], "languageconvert": 68, "laptop": 87, "larg": [11, 50, 106, 107], "largest": 39, "last": [11, 29, 41, 47, 76, 78, 79], "last_edit_asc": 33, "last_edit_desc": 33, "lat": 29, "later": [36, 106], "latest": [7, 10, 11, 20, 29, 76, 80], "latex": 3, "latexextra": 3, "latexmk": 3, "latitud": 29, "latn": 63, "latter": [57, 68, 69, 79], "launch": 106, "layout": [24, 35, 37], "lazi": 11, "lb": [47, 100], "lc": 68, "lc_all": 11, "ld": 75, "lead": [13, 29, 46], "leaf_kei": 84, "leak": [34, 65], "learn": 79, "least": [41, 46, 47, 63, 75, 90, 100], "leav": [10, 22, 106], "leco": 102, "lecom": 102, "leech": 29, "leecher": [29, 44], "left": [24, 25, 79, 93], "lemmi": [32, 102], "lemmy_typ": 48, "length": [26, 79], "lepo": 102, "less": [6, 8, 36, 44, 56, 76, 79, 87, 90], "let": [75, 79, 87], "leta": 32, "letter": 63, "leu": 102, "level": [0, 26, 72, 79, 90], "lez": 100, "lg": 102, "li": [100, 106], "lib": [6, 11, 71, 102], "lib_r": 102, "libbz2": 80, "libffi": [3, 10, 80], "liblzma": 80, "libncursesw5": 80, "libr": 54, "librari": [32, 37, 39, 74, 86, 88, 100, 102], "libreadlin": 80, "libretransl": 102, "librsvg": 3, "librsvg2": 3, "libsqlite3": 80, "libssl": [3, 10, 80], "libwww": 90, "libxml2": [3, 10, 80], "libxmlsec1": 80, "libxslt": [3, 10], "licens": [29, 35, 106], "license_nam": 29, "license_url": 29, "life": 76, "light": [10, 24], "like": [3, 6, 7, 10, 12, 18, 20, 24, 26, 29, 35, 36, 37, 41, 43, 44, 46, 50, 60, 67, 76, 78, 79, 83, 94, 100], "like_hotkei": 81, "limit": [2, 4, 6, 7, 8, 10, 11, 18, 20, 23, 25, 29, 34, 35, 36, 37, 38, 43, 47, 67, 68, 73, 79, 86, 88, 97], "limiter_cfg": [4, 13], "limiter_cfg_schema": [4, 13], "line": [4, 6, 8, 26, 32, 38, 76, 83, 85, 106], "lingva": 102, "link": [2, 10, 11, 13, 16, 19, 23, 24, 41, 44, 46, 47, 57, 58, 65, 68, 69, 72, 73, 74, 75, 84, 90, 101], "link_src": 106, "link_token": [13, 23], "linkdexbot": 90, "linkloc": [13, 90], "lint": [4, 76], "linux": [1, 3, 6, 7, 8, 10, 11, 15, 18, 32, 53, 74, 79, 86, 102, 106], "linuxcontain": 106, "linuxcontainers_org_nam": 106, "linuxdoc": 79, "list": [6, 7, 13, 17, 18, 22, 25, 27, 28, 29, 30, 32, 33, 34, 37, 38, 41, 43, 44, 45, 46, 47, 51, 56, 57, 58, 60, 63, 65, 68, 69, 72, 73, 74, 76, 80, 81, 83, 86, 88, 92, 93, 94, 95, 98, 100, 101, 104], "list_of_wikipedia": 68, "listen": [0, 6, 8, 11, 106], "lite": 59, "liter": [30, 74, 90], "literalinclud": 79, "littl": 54, "live": [75, 78, 79, 97, 106], "live_them": [76, 78], "livespac": 102, "livetim": 90, "ll": 90, "lmo": 100, "ln": [6, 8, 11, 75], "lo": [100, 102], "load": [6, 10, 11, 15, 20, 24, 27, 30, 31, 83, 91, 93, 100, 106], "load_engin": [30, 31, 32], "loader": [30, 32, 74, 83], "loadmodul": 6, "lobst": 102, "loc": 102, "local": [0, 1, 2, 6, 7, 8, 10, 11, 13, 18, 20, 21, 23, 24, 25, 27, 29, 30, 32, 43, 45, 46, 47, 61, 63, 68, 69, 75, 76, 77, 79, 84, 86, 88, 92, 96, 100, 102, 106, 107], "local_address": 18, "local_imag": 106, "locale_best_match": [88, 93], "locale_default": 92, "locale_nam": [68, 84, 88, 93], "locale_tag": 93, "locale_tag_list": 93, "locales_initi": [88, 93], "localhost": [0, 6, 7, 8, 21, 36], "localtest": 107, "locat": [2, 6, 8, 10, 11, 14, 23, 29, 40, 61, 63, 68, 79, 85, 92], "lock": [10, 100], "log": [4, 7, 11, 13, 19, 59, 75, 84, 87, 90, 101, 107], "log_msg": 90, "logger": [11, 90], "logic": 26, "login": [0, 9, 10, 21, 75], "logout": 21, "lokal": 13, "lomig": 69, "lon": 29, "long": [30, 46, 87], "long_max": 90, "long_max_suspici": 90, "long_window": 90, "longer": [25, 41, 46, 76, 90, 106], "longhand": 33, "longitud": 29, "look": [6, 10, 11, 27, 28, 35, 41, 49, 76, 78, 80, 95], "loop": [79, 97], "lorem": [79, 104], "loremlorem": 79, "lot": [41, 60, 75, 97], "love": 78, "low": 43, "lower": [10, 22, 97], "lowercas": 31, "lowest": 95, "lr": [47, 76, 102], "lrc": 100, "lrwxrwxrwx": 75, "lsb": 11, "lt": [47, 76, 100, 102, 106], "lua": 97, "lua_script_storag": [88, 97], "lucen": 36, "lucki": 104, "luizm": 80, "lunch": 54, "lv": [47, 100, 102], "lxc": [75, 86, 105], "lxc_host_prefix": 106, "lxc_repo_root": 106, "lxc_set_suite_env": 106, "lxc_suit": [75, 106], "lxc_suite_info": 106, "lxc_suite_instal": 106, "lxc_suite_install_info": 106, "lxc_suite_nam": 106, "lxd": [75, 105], "lxml": [3, 10, 100], "m": [10, 33, 47, 79, 100], "ma": 47, "machin": 0, "macrolanguag": 63, "made": [0, 20, 41, 75, 84], "magazin": [29, 39], "magna": 79, "magnet": [44, 65], "magnetlink": 29, "mah": 102, "mai": [10, 11, 20, 46, 64, 65, 72, 75, 79, 80, 90, 100, 101, 106], "mailto": [10, 19], "mainli": [47, 93], "mainlin": 8, "maintain": [2, 7, 10, 11, 13, 25, 29, 39, 44, 53, 71, 75, 79, 82, 86, 105], "mainten": [4, 9, 75, 86, 107], "major": 11, "make": [3, 7, 18, 26, 30, 32, 46, 47, 53, 73, 74, 75, 78, 79, 80, 85, 87, 90, 103, 106], "makefil": [26, 74, 75, 78, 86, 106], "man": [79, 102], "manag": [21, 26, 37, 74, 75, 78, 86, 93, 107], "mandatori": [47, 52], "mani": [7, 10, 22, 37, 48, 58, 90, 91], "manipul": 106, "mankier": 102, "manli": 47, "manual": [10, 18, 25, 30, 76, 79], "map": [1, 11, 17, 30, 31, 34, 40, 43, 46, 47, 63, 68, 70, 73, 79, 83, 84, 93, 100, 103, 104], "margin": 41, "mark": [10, 79], "markdown": [92, 100], "markdown_str": 100, "markdown_to_text": [88, 100], "market": 41, "marku": 106, "markup": [74, 92], "mass": 26, "master": [11, 25, 26, 75, 79, 85, 107], "mastodon": [32, 102], "match": [35, 36, 66, 72, 90, 93, 95, 99], "match_json": 72, "match_local": [88, 93], "materi": 102, "material_icon": 102, "math": [3, 74], "mathemat": [12, 79], "mathrm": 79, "matrix": [32, 101], "matter": [29, 75, 87], "mau": 102, "max": [10, 22, 29, 43, 63, 97], "max_ban_time_on_fail": [10, 22], "max_connect": [18, 20], "max_keepalive_connect": [18, 20], "max_pag": [10, 41, 43, 59, 63], "max_redirect": [20, 29], "max_request_timeout": [10, 20], "maxim": 26, "maximum": [10, 20, 26, 29, 41, 43, 59, 63, 73, 90], "mayb": 34, "mb": 29, "mc": [79, 102], "md": [10, 19, 35], "md5": 104, "mdn": 102, "me": [36, 43, 69, 79, 106], "mean": [10, 11, 22, 38, 41, 75, 79, 87, 97], "meaning": [26, 78, 79], "meant": [7, 22, 79], "measur": [68, 95], "media": [1, 17, 50, 64, 83, 102], "mediathekview": 37, "mediathekviewweb": 102, "mediawiki": [32, 40, 102], "medium": 29, "member": [21, 90, 93], "membership": 7, "memori": [23, 35, 63], "mention": [63, 104], "menu": 43, "menuselect": 79, "merg": [11, 15, 25, 66, 75, 84, 85], "merge_when_no_leaf": 84, "mess": 63, "messag": [18, 19, 26, 29, 30, 53, 72, 78, 79, 85, 86, 88, 90, 91], "met": 76, "meta": [53, 58, 68, 79], "metacpan": 102, "metadata": [44, 79], "metasearch": [10, 29, 39, 86, 101], "method": [1, 5, 10, 11, 13, 25, 29, 36, 57, 62, 79, 89, 92, 100], "metr": 95, "metric": 19, "mg": 100, "mhr": 100, "mi": [95, 102], "mib": 100, "microsoft": 101, "middl": 86, "might": [6, 7, 8, 11, 18, 26, 36, 46, 67, 73, 75, 79, 81, 84, 87, 106], "migrat": [4, 5], "mile": 95, "million": 36, "mimetyp": 90, "min": [24, 29, 100], "min_len": 100, "mind": 104, "minim": [10, 68, 76, 78, 79, 84], "minimun": 10, "minu": [47, 97], "minut": [7, 90], "mirror": [71, 102], "misbehav": 26, "misinform": 42, "miss": [11, 38, 79, 90, 91], "mistletoepag": 92, "mitmproxi": [10, 20], "mix": [75, 101], "mixcloud": 102, "mj12bot": 90, "mjk": 102, "mk": 100, "mkdir": [6, 7, 8, 10], "ml": [47, 48, 100], "mn": 100, "mo": [68, 85], "mod": 79, "mod_autoindex": 6, "mod_head": 6, "mod_proxi": 6, "mod_proxy_http": 6, "mod_proxy_uwsgi": 6, "mod_setenvif": 6, "mod_ssl": 6, "mod_uwsgi": 6, "mode": [4, 6, 10, 37, 69, 79, 106], "model": [93, 100], "moder": [10, 22, 29, 73], "modif": 75, "modifi": [7, 10, 11, 18, 50, 53, 76, 78, 79, 93, 104], "modul": [11, 27, 28, 30, 31, 68, 77, 79, 83, 89, 91, 102], "modular": 30, "module_from_spec": 83, "moduletyp": [30, 31], "mojeek": 102, "moment": [36, 37, 54], "monet": 87, "monitor": [11, 13, 75, 85], "monkei": 93, "mono": 3, "monolith": 66, "month": [1, 29, 41, 47, 73, 81, 83], "more": [10, 11, 18, 19, 20, 26, 29, 30, 37, 43, 45, 47, 49, 54, 56, 59, 60, 63, 65, 76, 79, 81, 86, 87, 90, 97, 100, 101, 104, 106], "morecol": 79, "moreov": 101, "morerow": 79, "morti": [10, 25], "morty_kei": 7, "morty_url": 7, "most": [3, 6, 18, 22, 30, 36, 37, 39, 43, 46, 58, 63, 71, 75, 76, 87, 100, 107], "mostli": [11, 68, 79], "motiv": [13, 74], "mount": [7, 61], "mount_prefix": 61, "move": [25, 26, 30, 79, 97], "movi": [37, 44, 51, 102], "moviepilot": 32, "mozhi": 102, "mozilla": [90, 100], "mp": 51, "mr": [32, 47, 100], "mrj": 100, "msg": [89, 90], "msnbot": 90, "mt": 100, "much": [26, 79], "mullvad": 32, "mullvad_leta": 53, "multi": 11, "multilingu": 14, "multipl": [10, 18, 20, 24, 29, 30, 68, 76, 79, 87, 102], "multipli": 95, "multithread": 11, "multius": 10, "music": [17, 57, 83, 103], "music_song": 57, "musl": 66, "must": [11, 13, 19, 20, 26, 29, 31, 34, 35, 37, 46, 52, 58, 61, 77, 79, 100, 101], "mutablemap": 100, "mv": 75, "mvw": 102, "mwl": 100, "mwm": 102, "mwmbl": [10, 22, 32, 81, 102], "mx": 47, "my": [7, 18, 27, 28, 36, 46, 47, 68, 75, 79, 100, 103], "my_arg": 79, "my_column": 37, "my_databas": 37, "my_funct": 79, "my_other_arg": 79, "my_tabl": 37, "mymemori": 102, "mymongo": 35, "myredi": 35, "mysql_serv": 37, "myv": 100, "mz": 102, "mzn": 100, "n": [0, 34, 75, 106], "na": 47, "nah": 100, "name": [1, 6, 8, 10, 11, 12, 15, 18, 24, 25, 27, 28, 30, 31, 34, 35, 36, 37, 38, 39, 43, 44, 48, 52, 57, 58, 59, 60, 62, 63, 69, 71, 73, 74, 75, 77, 84, 88, 90, 91, 92, 93, 94, 95, 97, 98, 100, 101, 102, 104, 106], "namespac": [29, 30, 31, 83], "nap": 100, "narrow": [58, 93], "naver": 102, "navig": 101, "nb": [63, 100], "nd": 100, "ndr": 64, "ne": 100, "nearmatch": 33, "necessari": [18, 25], "need": [6, 7, 8, 9, 10, 11, 13, 18, 21, 23, 24, 25, 26, 28, 33, 35, 37, 38, 41, 45, 46, 47, 58, 63, 68, 73, 75, 76, 77, 78, 79, 80, 81, 85, 86, 87, 90, 93, 104, 106], "neither": [86, 100], "net": [0, 53, 68, 69], "netflix": 51, "netloc": 68, "netvib": 90, "network": [0, 10, 13, 18, 20, 57, 59, 69, 90, 106], "never": [11, 30, 75, 101], "new": [6, 7, 8, 9, 10, 11, 17, 18, 24, 25, 30, 37, 43, 58, 59, 62, 63, 64, 76, 80, 81, 83, 90, 97, 100, 103], "new_issue_url": 10, "newest": 39, "next": [10, 24, 57, 62, 79], "nextpag": [57, 62], "ng": 47, "nginx": [2, 4, 9, 13, 25, 75, 86, 105, 106, 107], "nightmar": 79, "nil": 106, "nisi": 79, "nl": [47, 93, 100], "nlnet": [18, 34, 35, 36, 37], "nn": 100, "no_no": 63, "no_parsed_url": [82, 83], "no_result_for_http_statu": 73, "no_signature_error": 72, "noconfirm": [3, 10], "node": [12, 74, 78, 84, 94, 100], "nodej": 80, "nofollow": [10, 23], "noindex": [10, 23], "non": [39, 54], "none": [6, 10, 22, 27, 29, 30, 31, 33, 36, 38, 39, 47, 59, 60, 65, 71, 73, 76, 77, 79, 83, 90, 91, 92, 93, 97, 98, 99, 100], "nonumi": 79, "noopen": [10, 23], "nor": [86, 100], "normal": [29, 51, 79, 84, 100], "normalize_url": [88, 100], "norwegian": 63, "nosniff": [10, 23], "nosql": [32, 38], "nostrud": 79, "notat": [10, 29, 43], "note": [10, 14, 26, 36, 60, 75, 76, 81, 84, 104], "noth": [10, 85], "notic": 75, "now": [0, 6, 8, 10, 25, 36, 75, 76, 77, 78, 100], "npm": [76, 102], "nsfw": [41, 67], "nt": 102, "null": [6, 8, 20], "nullif": 37, "num": [47, 100], "number": [7, 10, 11, 13, 20, 23, 29, 37, 47, 57, 62, 63, 65, 72, 73, 79, 81, 84, 97, 99, 100, 106], "number_of_result": 29, "number_str": 100, "numer": [36, 79], "numref": 79, "nvm": 78, "nvr": 102, "nw": 79, "nyaa": 102, "nz": 47, "o": [30, 79, 80, 100, 107], "oad": 102, "oap": 102, "oauth": 50, "obj": [68, 79, 83, 100], "object": [29, 30, 43, 53, 72, 77, 79, 83, 90, 93, 97, 100], "objets_globaux": 100, "observ": 51, "obtain": 18, "oc": [93, 100], "occitan": 93, "oct": 11, "od": 102, "odyse": [32, 102], "oe": [47, 76], "off": [6, 8, 10, 22, 26, 67, 106], "offer": [11, 41, 44, 46, 47, 61, 64, 73, 101], "offic": 41, "offici": [40, 48, 50, 51, 57, 72, 93], "official_api_document": [18, 30], "officiat": 43, "offlin": [18, 29, 34, 79, 88], "offlineprocessor": 99, "offload": 11, "offset": [37, 43, 73], "often": [29, 30, 46, 58, 75, 79, 105], "ok": [10, 25, 76], "okhttp": 90, "old": [6, 7, 25, 75, 78, 83], "old_redis_url_default_url": [88, 96], "oldest": 39, "omit": 38, "on_result": 77, "onc": [3, 10, 25, 75, 76, 97, 100, 106], "one": [6, 8, 10, 11, 15, 17, 18, 20, 26, 30, 31, 37, 47, 48, 51, 62, 63, 66, 68, 75, 76, 77, 79, 84, 86, 87, 89, 90, 93, 95, 100, 106], "ones": [29, 36], "onion": 84, "onli": [3, 7, 9, 10, 11, 13, 15, 18, 24, 26, 29, 30, 34, 37, 41, 43, 44, 45, 46, 48, 58, 65, 68, 71, 72, 73, 76, 77, 78, 79, 83, 85, 90, 93, 97, 100, 101, 106], "onlin": [39, 51, 79, 86, 88], "online_curr": [32, 99, 102], "online_dictionari": [32, 99, 102], "online_url_search": [32, 72, 99, 102], "onlinecurrencyprocessor": 99, "onlinedictionaryprocessor": 99, "onlineprocessor": 99, "onlineurlsearchprocessor": 99, "only_search_languag": 100, "only_show_green_result": [10, 77], "open": [0, 6, 7, 10, 12, 24, 26, 35, 37, 47, 50, 64, 75, 76, 79, 81, 86, 87, 101, 106], "open_access_doi_rewrit": 81, "openairedataset": 102, "openairepubl": 102, "openapi": 64, "openli": 43, "openrepo": 102, "opensearch": 101, "openssl": [3, 10, 20], "openstreetmap": [1, 84, 102], "openvers": 102, "oper": [53, 66, 69, 79, 87, 106], "opportun": 25, "oppos": 84, "optim": 93, "option": [6, 7, 10, 11, 13, 15, 18, 23, 26, 30, 34, 35, 37, 39, 44, 46, 63, 68, 71, 75, 76, 79, 81, 84, 86, 87, 89, 100], "opv": 102, "order": [6, 10, 20, 26, 33, 35, 36, 37, 44, 79, 90], "ordered_plugin_list": 98, "org": [0, 1, 3, 10, 11, 12, 13, 16, 20, 23, 24, 29, 33, 37, 40, 46, 56, 61, 68, 73, 79, 84, 85, 90, 94, 100, 101, 106], "org_bot": 90, "organ": [13, 90], "orient": 6, "origin": [4, 13, 18, 25, 27, 30, 35, 37, 47, 63, 71, 72, 75, 79, 85], "orphan": 85, "os_str": 100, "osm": [1, 29, 84, 102], "osm_keys_tag": 84, "other": [7, 9, 13, 17, 18, 20, 26, 29, 33, 39, 41, 44, 47, 50, 63, 68, 71, 76, 79, 87, 100, 101], "otherwis": [22, 29, 31, 53, 78, 101, 106], "our": [2, 5, 7, 9, 26, 75, 76, 78, 79, 88, 105, 106], "out": [7, 26, 27, 28, 35, 36, 37, 45, 46, 60, 76, 77, 79, 80], "outdat": 41, "outgo": [4, 10, 14, 18], "output": [3, 18, 76, 79, 81, 84, 106, 107], "outsid": [75, 80], "outstand": 79, "over": [0, 13, 25, 45, 62, 63, 72, 75, 79, 86, 92, 93, 106], "overlai": 72, "overlin": 79, "overlook": 75, "overrid": [10, 15, 20], "overview": [7, 18, 32, 73, 74, 76, 81, 84, 102], "overwrit": [7, 13, 18], "overwritten": [2, 10, 20, 29], "own": [6, 7, 9, 10, 16, 19, 26, 35, 37, 38, 43, 47, 67, 75, 76, 86, 103, 104], "owner": [11, 101, 106], "p": [6, 7, 8, 10, 11, 59, 73, 100, 102, 106], "p1282": 84, "p2p": 69, "pa": 100, "pack": 102, "packag": [3, 4, 7, 11, 30, 32, 35, 37, 38, 75, 76, 79, 89, 106, 107], "package_nam": 29, "packagist": 102, "pacman": [3, 6, 8, 10, 79], "page": [6, 8, 10, 15, 17, 18, 19, 20, 24, 26, 29, 30, 36, 37, 41, 43, 44, 47, 57, 58, 59, 62, 63, 68, 73, 79, 81, 84, 85, 87, 92, 99, 101, 102, 104], "page_class": 92, "page_s": 73, "pagenam": 92, "pageno": [29, 73, 81, 83, 98], "pagenumb": 29, "pagin": 50, "pai": 78, "pair": 47, "palletsproject": 79, "pam": 100, "pap": 93, "papiamento": 93, "paragraph": 68, "param": [28, 29, 38, 41, 46, 47, 56, 59, 63, 65, 68, 70, 72, 73, 79, 99], "paramet": [22, 30, 31, 37, 38, 45, 47, 73, 74, 77, 84, 91, 92, 93, 97, 98, 99, 100], "parent": 79, "pari": [46, 104], "pars": [28, 30, 33, 34, 44, 46, 47, 56, 59, 65, 70, 72, 83, 91, 93, 94], "parse_argu": [82, 83], "parse_gs_a": 47, "parse_regex": 34, "parse_tineye_match": 72, "parse_url": 70, "parse_web_api": 59, "parse_web_lit": 59, "parsed_url": 77, "parser": 92, "parser_r": 99, "parsererror": 100, "part": [13, 18, 61, 79, 90, 106], "parti": [87, 101], "partial": [35, 79, 88, 97], "particular": 47, "pass": [6, 13, 26, 27, 46, 47, 81, 90, 93, 100], "pass_ip": [13, 90], "pass_searxng_org": 13, "passlist": [13, 90], "password": [18, 21, 35, 36, 37, 69], "past": 1, "patch": [26, 79, 80, 93], "path": [6, 10, 15, 20, 21, 25, 34, 51, 75, 76, 79, 80, 90, 100, 101, 106], "pathlib": 90, "pattern": 33, "payload": 36, "payment": 84, "paywal": 12, "pb": 47, "pc": 47, "pd": 102, "pdb": 102, "pdbe": 102, "pdf": [3, 29, 39, 71], "pdf_url": 29, "pe": 47, "peer": [56, 69], "peertub": [32, 102], "peopl": [43, 67, 87, 101], "pep": 79, "pep8": [26, 76], "per": [11, 26, 29, 79, 84], "perfect": 75, "perform": [10, 11, 13, 24, 29, 33, 38, 72, 80, 97, 104], "perl": 90, "permiss": 11, "persist": [30, 84], "person": [51, 101, 104], "petalbot": 90, "pfl": 100, "pformat": 84, "pgo": 102, "ph": [47, 102], "photo": 49, "photon": 102, "php": 33, "phrase": 79, "pictur": 41, "pid": 11, "piec": 79, "pin": 102, "ping": 90, "ping_kei": 90, "ping_live_tim": 90, "pinterest": 102, "pip": [3, 10, 35, 37, 38, 76, 77], "pipe": [32, 102], "piped_filt": 57, "pipedapi": 57, "piratebai": 102, "pitfal": 4, "pixel": [29, 72], "pixrai": 90, "pk": 47, "pkg": 102, "pkg_go_dev": 102, "pl": [47, 93, 100], "pl_pl": 93, "place": [6, 8, 11, 26, 29, 30, 35, 37, 58, 79, 85, 87], "plai": [57, 62, 102], "plain": [0, 68], "plaintext": 79, "plan": 7, "platform": [50, 55, 101], "pleas": [25, 26, 36, 37, 76, 78, 79, 81, 104], "plenti": 26, "plugin": [1, 3, 4, 10, 11, 26, 37, 74, 79, 80, 81, 86, 88, 98], "plugin1": 10, "plugin2": 10, "pm": 100, "pnb": 100, "png": [29, 72], "po": 85, "pocket": [6, 8], "point": [7, 8, 10, 11, 72, 74, 75, 78, 79, 87, 90], "pointer": 79, "polici": [10, 19, 23, 106], "polit": [41, 42], "poltisch": 42, "polygon": 79, "pool": [10, 18, 20], "pool_connect": [10, 18, 20], "pool_maxs": [10, 18, 20], "popular": [29, 36, 37, 62, 79], "popup": 68, "port": [0, 7, 10, 23, 26, 29, 30, 35, 106], "portal": 64, "portugu\u00ea": 84, "posix": 7, "posixpath": [13, 30], "possibl": [7, 15, 18, 29, 34, 39, 41, 47, 68, 73, 75, 79, 81], "post": [1, 10, 26, 46, 48, 50, 63, 75, 77, 81, 90, 102], "post_search": 77, "postcod": 29, "pot": 85, "pov": 79, "power": [34, 36, 37, 79], "ppd": 102, "ppdm": [57, 102], "pprint": 84, "pr": [25, 26, 68, 76, 78, 79, 85], "pr1071": 45, "practic": 26, "pre_request": [4, 13], "pre_search": 77, "preasearch": 58, "prebuild": 76, "precis": 100, "prefer": [5, 6, 8, 9, 10, 17, 18, 19, 41, 46, 47, 79, 81, 87, 92, 94, 104], "preference_sect": [88, 94], "prefix": [10, 13, 18, 24, 47, 90, 97, 104], "preinstal": 75, "prepar": 106, "prerequisit": [13, 75, 79], "presarch": 58, "presearch": [32, 102], "present": [18, 38], "preserv": [26, 79], "press": 75, "pretti": 18, "preview": [29, 68], "previous": 76, "primari": 63, "prime": 74, "primer": [74, 86], "principl": [69, 79], "print": [49, 53], "priorit": 62, "prioriti": [13, 93], "privaci": [6, 7, 8, 10, 11, 19, 24, 57, 69, 74, 79, 83, 86, 90, 101, 104], "privacypolicy_url": [10, 19], "privat": [13, 14, 30, 34, 35, 36, 37, 62, 65, 86, 90], "pro": 79, "probabl": 100, "probe": [13, 88], "problem": [6, 8, 10, 101, 106], "proc": 11, "procedur": [9, 25, 106], "process": [3, 7, 11, 18, 38, 75, 76], "processor": [30, 32, 38, 72, 79, 86, 88], "produc": 79, "product": [19, 74, 78], "profession": 86, "profil": [10, 76, 86, 87, 101], "profit": [39, 54], "prog": 47, "program": [35, 64, 76], "project": [11, 29, 71, 75, 76, 79, 80, 86, 101], "prompt": [75, 76, 105], "proof": [54, 97], "proper": 87, "properti": [30, 33, 47, 84, 92, 100], "property_nam": 65, "protect": [7, 10, 13, 25, 26, 46, 86, 104], "protobuf": 47, "protocol": [0, 7, 20, 100], "provid": [18, 26, 29, 33, 34, 36, 39, 40, 42, 44, 48, 51, 53, 65, 66, 79, 101], "prowlarr": 65, "proxi": [0, 2, 6, 7, 10, 18, 20, 23, 25, 29, 30, 57, 75, 81, 87, 90, 105, 106], "proxif": 10, "proxify_result": 10, "proxy1": [10, 18, 20], "proxy2": [10, 18, 20], "proxy3": 18, "proxy4": 18, "proxy_add_x_forwarded_for": 8, "proxy_buff": 8, "proxy_buffer_s": 8, "proxy_http": 6, "proxy_http_modul": 6, "proxy_modul": 6, "proxy_pass": 8, "proxy_request_buff": 8, "proxy_set_head": 8, "proxy_uwsgi": 6, "proxy_uwsgi_modul": 6, "proxyfix": 90, "proxypass": 6, "proxypreservehost": 6, "proxyq": [10, 20], "prune": 7, "psi": 79, "psimg": 102, "psnew": 102, "psvid": 102, "psychopg2": 37, "psycopg2": 37, "pt": [43, 47, 63, 84, 93, 100], "pt_br": [63, 84], "pt_pt": 93, "ptb": 102, "ptipython": 83, "pub": 102, "public": [2, 7, 10, 12, 23, 29, 34, 35, 36, 37, 47, 51, 79, 101], "public_inst": [10, 16, 23], "publicli": 38, "publish": [29, 41, 43, 47], "publishedd": 29, "pubm": 102, "pull": [7, 26, 69, 78, 79, 85], "purg": 97, "purge_by_prefix": [88, 97], "puriti": 67, "purpos": [23, 29, 66], "push": [26, 76, 85], "put": [34, 37, 46, 63], "pwd": [7, 75, 106], "py": [3, 6, 8, 10, 22, 23, 29, 30, 34, 35, 36, 37, 38, 47, 61, 68, 74, 76, 79, 82, 92, 93, 96, 107], "py3": 76, "pybabel": 85, "pyenv": [10, 11, 35, 37, 38, 75, 76, 77, 107], "pygment": [76, 79, 84], "pylintrc": 76, "pymongo": 35, "pyobj": 90, "pypi": [79, 102], "pyright": 76, "python": [3, 10, 11, 18, 20, 23, 29, 30, 35, 37, 38, 74, 75, 78, 79, 80, 89, 90, 93, 100, 107], "python2": 11, "python3": [3, 10, 11, 83], "pythonhom": 11, "pythonpath": [11, 75], "pyyaml": 10, "q": [0, 1, 7, 10, 24, 46, 63, 76, 81], "q1148747": 84, "q11573": 95, "q11579": 95, "q253276": 95, "q306656": [18, 30], "q3947": 84, "q69362731": 95, "q712226": 46, "q850107": 84, "q99490479": 95, "qdm12": 53, "qu": 100, "qualiffi": 90, "qualiti": [3, 43, 68, 76, 79, 86], "queri": [10, 12, 18, 22, 24, 27, 28, 29, 33, 34, 35, 36, 37, 38, 41, 43, 46, 47, 49, 51, 54, 56, 59, 63, 65, 66, 68, 70, 72, 73, 79, 81, 83, 84, 87, 91, 94, 95, 97, 98, 99, 100, 101, 102, 103], "query_enum": 34, "query_exampl": [88, 94], "query_in_titl": [10, 24], "query_keyword": [88, 94], "query_str": 37, "query_typ": [34, 36], "question": [79, 87, 101], "qui": 79, "quickli": 66, "quickstart": [26, 43, 74, 76, 86], "quit": [6, 7, 11, 26, 67, 75], "quot": 106, "qw": 102, "qwant": [0, 10, 22, 32, 81, 83, 102], "qwant_categ": 59, "qwi": 102, "qwn": 102, "qwv": 102, "r": [10, 47, 100, 102, 106], "radio": 60, "radio_brows": [60, 102], "radiobrows": 32, "rain": 83, "rais": [29, 52, 83, 90, 91, 100], "raise_for_httperror": 29, "rand": 10, "random": [29, 33, 87, 90, 100, 104], "randomli": [57, 69, 90], "rang": [11, 29, 30, 41, 43, 47, 54, 73, 79, 81, 90, 97, 99, 102], "rangl": 79, "rank": 43, "rapidli": [5, 25], "rate": [10, 13, 23, 29, 67, 68, 88], "rather": 18, "raw": [79, 92], "raw_cont": 92, "rb": 102, "rbg": 102, "rd": 35, "rdbm": 37, "rdf": 84, "re": [5, 7, 25, 66, 76, 102], "re_search_url": 99, "reach": [61, 79, 97], "reactiv": 20, "read": [5, 10, 21, 26, 59, 67, 72, 73], "readability_": 79, "readabl": [9, 29, 100], "reader": [75, 79], "readi": 75, "readm": [6, 11, 76], "readthedoc": 11, "real": [6, 8, 13, 58, 90], "real_ip": [13, 90], "realiz": 68, "realli": [39, 57, 62], "reason": [11, 31, 79, 97], "rebas": 53, "reboot": 106, "rebuild": [26, 76, 93], "rebum": 79, "recaptcha": 10, "recaptcha_searxenginecaptcha": [10, 22], "receiv": [13, 78], "recent": 76, "reclaim": 101, "recogn": 11, "recol": 32, "recommend": [3, 5, 10, 11, 25, 26, 63, 76, 79, 80], "reconfigur": 25, "reconsid": 26, "record": [10, 19, 24, 29, 73, 79], "red": 100, "reddit": 102, "redefin": 29, "redesign": 56, "redi": [2, 4, 7, 10, 11, 13, 14, 23, 25, 74, 75, 86, 88, 90, 107], "redirect": [12, 20, 29, 47, 59, 68, 73, 76, 103], "redirect_to_first_result": 98, "redirectmatch": 6, "redis_serv": 35, "redisdb": [11, 21, 25, 96], "redislib": 97, "redispi": 97, "rediss": 21, "reduc": [26, 42, 68, 90, 100], "ref": [29, 75, 77, 84, 106], "refactor": 56, "refer": [2, 6, 8, 9, 42, 61, 63, 79, 84, 87, 90, 98, 100], "referenc": 79, "referr": [10, 23], "refnam": 79, "refresh": 97, "regard": [9, 101], "regardless": [18, 87], "regex": 34, "regexp": 100, "region": [18, 30, 41, 46, 47, 53, 54, 60, 68, 84, 93, 100], "region_tag": [88, 93], "regist": [31, 60, 80], "register_script": 97, "registri": 63, "regular": [34, 66, 90], "regularli": [5, 25], "reinstal": 25, "rel": [75, 79, 90, 100, 106], "relat": [30, 37, 46], "releas": [11, 25, 29, 39, 69, 76, 106], "releng": 106, "relev": [33, 39, 44, 76], "reli": [15, 37], "reliabl": 37, "reload": 11, "remain": 78, "remark": 43, "rememb": [11, 26, 75], "remot": [0, 90, 106], "remote_addr": [6, 8], "remov": [7, 10, 11, 12, 15, 18, 22, 30, 66, 68, 70, 75, 76, 77, 83, 87, 97, 101, 106, 107], "renam": [7, 81], "render": [3, 92], "renew": 90, "replac": [10, 12, 25, 73, 75, 76, 77, 79, 85, 90, 97], "repo": 73, "report": [29, 64, 75, 86, 101], "repositori": [7, 9, 75, 80, 85, 106], "repres": 93, "represent": [30, 38, 93, 100], "reqbin": 68, "request": [0, 6, 10, 12, 13, 18, 20, 22, 23, 26, 28, 30, 32, 33, 36, 38, 40, 41, 45, 46, 47, 51, 53, 56, 58, 59, 63, 65, 68, 69, 70, 72, 73, 76, 77, 78, 79, 85, 87, 88, 91, 92, 94, 98, 99], "request_param": 27, "request_schem": 6, "request_timeout": [10, 18, 20], "request_uri": 6, "requesthead": [6, 13], "requir": [3, 6, 11, 13, 23, 25, 26, 29, 31, 35, 36, 37, 38, 53, 67, 72, 73, 76, 79, 81, 83, 90, 91, 107], "require_api_kei": [18, 30], "reset": [87, 90, 106, 107], "resolut": 29, "resourc": [8, 36, 39, 42], "resp": [28, 41, 47, 53, 56, 59, 65, 66, 70, 72, 73], "respect": [10, 26, 87], "respons": [18, 28, 29, 30, 38, 41, 45, 46, 47, 53, 56, 65, 66, 68, 70, 72, 73, 90], "rest": [7, 18, 45, 47, 56, 57, 62, 74, 76, 86], "rest_v1": 68, "rest_v1_summary_url": 68, "restart": [6, 7, 8, 11, 75], "restor": [76, 78], "restrict": [18, 47, 69], "restructuredtext": 79, "result": [3, 10, 12, 13, 18, 20, 22, 24, 27, 28, 30, 32, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 46, 47, 48, 51, 53, 56, 58, 59, 65, 66, 68, 71, 72, 73, 77, 79, 81, 83, 86, 87, 91, 93, 95, 98, 100, 101, 104], "result_contain": [77, 98], "result_field": 45, "result_proxi": [7, 10], "result_separ": 34, "result_templ": [35, 37], "resultcontain": 98, "results_on_new_tab": [10, 24, 81], "results_per_pag": 35, "results_xpath": 73, "retri": [18, 20], "retriev": [38, 45], "retry_on_http_error": 18, "return": [12, 13, 18, 27, 29, 30, 31, 33, 34, 37, 38, 41, 43, 45, 46, 47, 53, 59, 65, 68, 73, 77, 79, 83, 84, 87, 90, 91, 92, 93, 95, 97, 99, 100], "return42": [77, 79], "revers": [2, 7, 46, 47, 59, 62, 72, 106], "review": 35, "rewind": 78, "rewrit": [1, 10, 12, 33], "rfc": 79, "rhel": [3, 6, 8, 10, 11, 79], "rid": [7, 46, 76, 106], "right": [11, 18, 21, 77, 78, 79, 84, 93], "rightmost": 79, "risk": 104, "rm": [7, 11, 100], "rmgrp": 76, "rmi": 7, "ro": [47, 100], "road": 29, "robin": 20, "robot": [10, 23, 47, 76], "robot_test": 76, "robust": 37, "rock": 57, "role": 74, "rolenam": 79, "roll": [25, 106], "room": 32, "root": [6, 9, 75, 76, 106], "rotat": 79, "rough": 68, "round": [20, 26], "rout": [79, 90, 92], "row": 79, "rowspan": 79, "rr": 90, "rspan": 79, "rss": [10, 22, 44, 81], "rst": [26, 76, 79], "rst_titl": 106, "rtl": 24, "rtl_local": [84, 88, 93], "ru": [47, 100, 102], "rubi": 90, "rubygem": 102, "rue": 100, "rule": [26, 30, 43, 68, 93, 106], "rumbl": 102, "run": [2, 3, 6, 8, 9, 10, 11, 13, 19, 21, 23, 25, 26, 34, 36, 46, 53, 74, 75, 77, 78, 79, 83, 96, 101, 105, 107], "runner": [13, 30, 76], "runtim": [74, 86], "rw": 106, "ryan": 51, "sa": [47, 83, 100], "sadipsc": 79, "safari": 101, "safe": [54, 67, 73, 79, 81, 102], "safe_search": [1, 2, 10, 22, 73], "safe_search_map": 73, "safe_search_support": 73, "safes_search_map": 73, "safesearch": [29, 30, 41, 47, 73, 79, 81, 83, 98], "safesearch_map": 67, "safesearch_param": 45, "sah": 100, "sai": 46, "said": 37, "same": [10, 29, 37, 56, 62, 66, 68, 75, 79, 100, 101, 106], "sampl": 79, "san": 3, "sanctu": 79, "satisfi": [35, 37], "save": [6, 7, 10, 25, 43, 47, 63, 84, 106], "save_data": 30, "sbin": [7, 11], "sc": [63, 100, 102], "sc2031": 106, "sc2034": 106, "sc_code_cache_sec": 63, "scalabl": 79, "scale": [36, 75, 79, 106], "scan": 11, "scc": 102, "scenario": [61, 100], "schema": [13, 56, 90, 97], "schemaissu": 90, "scheme": [6, 8, 47], "scholar": 102, "scholarli": 71, "schroeding": 79, "schr\u00f6dinger": 79, "scienc": [17, 83, 103], "scientif": 47, "scn": 100, "sco": 100, "scope": [26, 63], "score": [62, 72, 97], "scrap": [63, 73], "scrapi": 90, "scratch": 3, "screen": 24, "screenshot": 0, "script": [2, 4, 5, 6, 7, 8, 10, 11, 25, 63, 68, 75, 76, 83, 84, 86, 93, 97, 105, 106, 107], "scroll": [10, 24], "sd": 100, "se": [47, 102], "sea": 79, "search": [0, 2, 4, 7, 10, 12, 13, 14, 15, 17, 20, 24, 26, 27, 29, 30, 33, 34, 35, 37, 38, 39, 41, 43, 44, 45, 46, 47, 48, 50, 51, 53, 54, 56, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 72, 73, 74, 77, 79, 83, 86, 87, 88, 91, 93, 94, 95, 100, 102, 103], "search_dir": 61, "search_form_xpath": 63, "search_language_cod": [88, 100], "search_mod": 69, "search_on_category_select": [10, 24], "search_queri": [83, 98, 99], "search_typ": [33, 58, 69], "search_url": [29, 45, 72, 73, 100], "searchcod": 102, "searchcode_cod": 102, "searchlab": 69, "searchmysit": 102, "searchqueri": [83, 88, 98], "searchwithplugin": [77, 88, 98], "searx": [1, 5, 6, 8, 10, 11, 13, 15, 16, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 79, 83, 84, 86, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 106, 107], "searx_userag": [10, 88, 100], "searxengineaccessdeni": [10, 22, 91], "searxengineaccessdeniedexcept": [88, 91], "searxengineapiexcept": [88, 91], "searxenginecaptcha": [10, 22, 91], "searxenginecaptchaexcept": [88, 91], "searxengineexcept": [88, 91], "searxengineresponseexcept": [88, 91], "searxenginetoomanyrequest": [10, 22, 91], "searxenginetoomanyrequestsexcept": [88, 91], "searxenginexpathexcept": [88, 91, 100], "searxexcept": [88, 91], "searxng": [0, 1, 2, 3, 4, 5, 9, 11, 12, 13, 15, 16, 18, 19, 20, 21, 23, 24, 26, 29, 30, 32, 33, 35, 37, 38, 39, 41, 43, 44, 45, 46, 47, 53, 57, 58, 62, 64, 66, 68, 71, 72, 74, 76, 77, 78, 79, 80, 81, 83, 85, 88, 89, 90, 92, 94, 96, 97, 100, 102, 103, 104, 105], "searxng_": 97, "searxng_bind_address": [10, 23, 75, 107], "searxng_check": 107, "searxng_counter_": 97, "searxng_debug": [10, 19, 76], "searxng_extra": [74, 76, 86], "searxng_lang": 30, "searxng_limit": 90, "searxng_local": [29, 30, 47, 63, 93], "searxng_msg": 89, "searxng_org": 90, "searxng_port": [10, 23, 75, 107], "searxng_redis_url": [2, 10, 21, 76], "searxng_region": 30, "searxng_secret": [2, 10, 23], "searxng_settings_path": [10, 11, 15, 75], "searxng_url": [2, 10, 23, 75, 106, 107], "searxng_uwsgi_socket": [75, 107], "searxnggfedora35": 106, "searxparameterexcept": [88, 91], "searxsettingsexcept": [88, 91], "searxxpathsyntaxexcept": [88, 91, 100], "sec": [90, 91, 97, 100], "second": [10, 20, 22, 63, 79, 93, 95, 97], "secret": [18, 30, 97], "secret_hash": [88, 97], "secret_kei": [2, 10, 15, 23, 97], "section": [5, 6, 8, 9, 10, 15, 18, 20, 32, 34, 35, 36, 37, 41, 73, 75, 76, 77, 79, 94, 106], "sectiontitl": 33, "secur": [0, 10, 11, 34, 86], "sed": [10, 79], "see": [0, 3, 5, 6, 7, 8, 10, 11, 13, 15, 18, 20, 21, 23, 25, 26, 30, 31, 33, 35, 37, 41, 43, 45, 46, 47, 56, 57, 58, 63, 65, 66, 68, 73, 75, 76, 77, 79, 81, 84, 86, 89, 93, 97, 99, 100, 101, 104, 106], "seed": 29, "seeder": [29, 44], "seek": 101, "seeker": 62, "seekr": [32, 102], "seekr_categori": 62, "seem": [41, 43, 46, 63], "seimg": 102, "sekr": 62, "select": [10, 18, 24, 29, 30, 35, 36, 37, 38, 43, 45, 46, 47, 57, 60, 62, 63, 69, 73, 76, 78, 79, 84, 87, 89, 93, 103, 106], "selector": [63, 73], "self": [10, 12, 30, 47, 50, 86, 90, 106, 107], "self_inform": 81, "semant": [26, 102], "semantic_scholar": 102, "semrushbot": 90, "send": [0, 11, 18, 20, 22, 30, 46, 58, 63, 78, 87, 90, 91, 101], "send_accept_language_head": [18, 30, 46, 58, 63, 68], "senew": 102, "sens": [46, 79], "sensit": 46, "sent": [46, 87], "sep": [30, 102], "separ": [18, 26, 30, 34, 78, 79, 81, 104], "sepiasearch": 102, "seri": 76, "serial": 83, "serializ": [30, 83], "serif": 3, "seriou": 75, "serv": [6, 8, 11, 26, 76, 87, 106], "server": [2, 4, 7, 9, 10, 13, 14, 15, 20, 37, 72, 75, 81, 83, 86, 97, 101, 105, 106, 107], "server_nam": 8, "servic": [6, 8, 9, 10, 11, 23, 46, 47, 52, 75, 76, 79, 81, 84, 86, 87, 106, 107], "session": [10, 90, 93], "set": [0, 2, 3, 4, 6, 7, 8, 10, 11, 13, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 37, 38, 39, 43, 44, 45, 47, 48, 52, 57, 58, 59, 61, 62, 63, 64, 65, 68, 69, 71, 73, 75, 76, 77, 79, 81, 86, 87, 90, 91, 93, 94, 95, 96, 97, 99, 100, 102, 103, 104, 105, 106, 107], "set_trait": 30, "setenvif": 6, "setenvif_modul": 6, "settings_redi": 10, "setup": [0, 3, 4, 5, 6, 7, 8, 9, 10, 13, 18, 25, 38, 75, 76, 78, 79, 96, 105], "setuptool": 10, "sever": [18, 66, 68, 75], "sevid": 102, "seznam": [10, 102], "seznambot": 90, "sfw": [41, 67], "sg": [47, 68], "sh": [3, 6, 7, 8, 9, 25, 35, 37, 38, 75, 76, 77, 79, 80, 86, 100, 105], "sha256": 76, "sha512": 104, "shadow": [39, 71], "share": [6, 11, 18, 41, 47, 56, 65, 66, 68, 71, 75, 76, 101, 106], "sheet": 7, "shell": [4, 10, 34, 75, 80, 106], "shellcheck": [3, 79, 80, 106], "short": 29, "shortcut": [1, 18, 27, 28, 29, 30, 31, 34, 35, 36, 39, 44, 57, 69, 71, 79], "shorten": 11, "should": [5, 6, 8, 11, 18, 25, 26, 30, 46, 47, 63, 65, 68, 75, 78, 79, 80, 93], "show": [3, 6, 10, 11, 25, 65, 68, 75, 76, 79, 104, 106], "show_magnet_link": 65, "show_torrent_fil": 65, "shown": [6, 9, 10, 11, 13, 17, 18, 22, 30, 75, 79, 94, 106], "si": [47, 93, 95, 100], "si_nam": 95, "side": [0, 9, 24, 79, 84], "sighup": 11, "sign": 79, "signal": [11, 75], "signatur": 84, "signifi": 79, "sigterm": 11, "silesian": 93, "similar": [11, 15, 37, 51, 79, 93], "simpl": [1, 10, 24, 27, 28, 29, 31, 35, 36, 37, 47, 72, 73, 75, 76, 78, 81, 97, 106], "simple_query_str": 36, "simple_styl": [10, 24], "simplest": 79, "simpli": [0, 26, 72, 75, 76, 78, 81, 107], "simplifi": [15, 68, 107], "sinc": [10, 11, 13, 24, 41, 43, 46, 48, 50, 58, 62, 79, 90, 106], "singl": [11, 53, 87, 106], "sit": 79, "site": [1, 4, 18, 25, 29, 65, 67, 73, 79, 81, 84, 107], "size": [7, 11, 25, 29, 44, 72, 100], "sk": [47, 70, 100], "skeleton": 38, "sketchi": 67, "skill": 74, "skipkei": 30, "sl": [47, 70, 100], "slash": [6, 10, 24, 100], "sleep": 97, "slide": [46, 90, 97], "slightli": 47, "slow": 20, "slr": 36, "slurp": 90, "sm": 102, "small": [29, 36, 37, 43, 54, 76, 106, 107], "smallest": 39, "smtbot": 90, "sn": 47, "snap": [75, 106], "snapcraft": 106, "snapshot": 106, "snippet": 33, "so": [6, 7, 11, 19, 26, 29, 35, 36, 38, 75, 77, 79, 87, 100, 101], "social": [1, 17, 50, 83], "social_media": 103, "sock": [0, 2, 10, 11, 13, 20, 21, 25, 96, 107], "socket": [0, 6, 7, 8, 11, 21, 23, 75, 107], "socks5": [0, 18, 29, 30], "socks5h": 18, "soft": [29, 73, 74], "soft_max_redirect": [29, 73], "softwar": [66, 75, 101, 102], "sogou": 90, "sold": 87, "solid": 102, "solidtorr": 102, "solut": [34, 46, 106], "solv": [0, 18], "some": [2, 6, 7, 8, 9, 10, 11, 13, 15, 18, 22, 23, 25, 26, 33, 41, 43, 46, 47, 63, 68, 73, 75, 76, 78, 79, 82, 90, 101, 105, 106, 107], "someon": 87, "someth": [26, 34, 46, 76, 78], "sometim": [25, 47, 66], "somewhat": 11, "somewher": 46, "soon": [32, 90], "sorri": 47, "sort": [33, 36, 39, 44, 95, 97], "sort_kei": 30, "soundcloud": 102, "sourc": [7, 10, 13, 20, 27, 28, 29, 30, 31, 32, 34, 35, 37, 39, 40, 41, 43, 45, 46, 47, 50, 52, 53, 54, 55, 56, 59, 60, 63, 64, 65, 66, 68, 70, 71, 72, 73, 75, 76, 78, 79, 83, 84, 86, 87, 89, 90, 91, 92, 93, 95, 97, 98, 99, 100, 101, 106], "source_code_url": 29, "source_ip": [10, 20], "sourcehut": 102, "sp": 102, "space": [10, 13, 16, 23, 76, 86, 90, 104], "span": [79, 100], "spanish": 100, "sparql": 84, "sparql_keys_request": 84, "sparql_tags_request": 84, "spars": 79, "spdx": 106, "speak": 11, "speaker": 18, "spec": 83, "spec_from_file_loc": 83, "special": [5, 6, 8, 11, 29, 30, 34, 40, 47, 65, 80, 103], "specif": [11, 18, 20, 23, 24, 29, 30, 34, 39, 41, 44, 45, 63, 65, 70, 71], "specifi": [0, 7, 11, 15, 18, 20, 30, 47, 48, 81], "speed": 54, "spell": [33, 43], "spellcheck": 43, "spezial": 40, "sphinx": 26, "sphinxopt": 26, "spinn3r": 90, "splash": 90, "split": 26, "spoilt": 5, "sponsor": [18, 34, 35, 36, 37], "sq": [43, 100], "sql": [32, 38], "sqlite3": 37, "sqlite_cursor": 37, "sr": [47, 100], "src": [6, 8, 10, 11, 47, 75, 76, 107], "srenablerewrit": 33, "srh1": 62, "srht": 102, "srprop": 33, "srsort": 33, "srv": 6, "srwhat": 33, "srwxrwx": 21, "ssl": [6, 10, 20, 29], "ssl_cert_dir": 20, "ssl_cert_fil": 20, "ssl_modul": 6, "st": 102, "stabl": [18, 44, 76], "stack": [75, 106], "stackexchang": 102, "stackoverflow": [68, 102], "stage": 79, "stai": [4, 5], "stamp": 63, "stand": 67, "standalon": 52, "standalone_searx": [74, 82], "standard": [6, 11, 26, 29, 65, 106], "standards_docu": 39, "start": [2, 6, 7, 8, 9, 10, 11, 26, 29, 31, 38, 72, 74, 76, 78, 86, 106], "startpag": [10, 22, 32, 81, 102], "startpage_categ": 63, "stat": [10, 19, 79, 101], "state": [33, 93, 99, 106], "static": [3, 6, 8, 10, 11, 24, 25, 74, 78, 84, 90], "static_path": 10, "static_use_hash": [2, 6, 8, 10, 11, 24], "station": 60, "station_filt": 60, "statist": [79, 101], "statu": [11, 18, 73, 78, 91, 93, 107], "stealth": 69, "step": [2, 4, 5, 9, 25, 26, 75, 78, 86, 107], "stet": 79, "still": [17, 35, 36, 37, 41, 46, 62, 68], "stimmung": 51, "stock": 72, "stone": 18, "stop": [7, 10, 11, 29, 45, 73, 75, 76, 77, 91, 97, 106], "storag": 106, "store": [29, 30, 35, 36, 43, 44, 46, 87, 90, 101, 102], "str": [29, 30, 33, 39, 47, 57, 62, 65, 69, 71, 83, 90, 91, 92, 93, 97, 98, 99, 100, 102], "stract": [10, 81, 102], "strang": 11, "stream": 58, "street": 29, "strict": [10, 18, 22, 29, 73], "string": [10, 12, 18, 27, 29, 30, 33, 39, 41, 46, 47, 66, 73, 81, 84, 90, 93, 97, 100, 104], "stroke": 79, "strong": 79, "structur": [26, 35, 59, 74, 83, 90], "stub": 79, "stuck": 76, "stuff": [76, 79], "style": [10, 24, 76, 78, 84, 100], "stylesheet": 90, "su": [100, 102], "sub": 79, "subdomain": 47, "subject": 79, "submit": [26, 34, 36], "subnet": 90, "subscript": 79, "subsect": 79, "subset": [36, 100], "subshel": 106, "substitut": 74, "subtag": 63, "successfulli": [7, 72, 76], "sudo": [3, 6, 7, 8, 9, 10, 11, 21, 25, 35, 37, 38, 75, 77, 79, 80, 105, 106, 107], "sudoer": 9, "suffix": [7, 10, 20], "suggest": [2, 13, 51, 73, 77, 86], "suggestion_xpath": 73, "suit": [74, 105], "suitabl": 79, "sum": 76, "summari": [68, 73, 74], "sup": 79, "superscript": 79, "superus": 102, "support": [3, 8, 10, 11, 18, 20, 26, 29, 30, 35, 36, 37, 43, 46, 47, 50, 54, 57, 58, 62, 65, 68, 70, 72, 73, 77, 79, 81, 84, 87, 92, 93, 99, 100, 101, 102, 104, 106], "suppress": 63, "sure": [7, 46, 67, 75], "surround": 79, "suspend": [91, 99], "suspend_time_set": 91, "suspended_tim": [10, 22, 91], "suspendedstatu": 99, "suspens": [10, 22], "suspici": [13, 90], "suspicious_ip_max": 90, "suspicious_ip_window": 90, "sv": [47, 100], "svg": [3, 102], "svg_imag": 79, "svgrepo": 102, "sw": 100, "swisscow": [10, 22, 81], "switch": [6, 25, 26, 35, 37, 38, 43], "swr": 64, "sxng_local": [46, 47, 68, 76, 93, 100], "symbol": [11, 95], "symbol_to_si": [88, 95], "symlink": [6, 8, 75], "sync": 85, "synchron": 85, "synhttpclient": 90, "syntax": [17, 51, 81, 86, 91, 100, 102, 103], "system": [7, 10, 11, 26, 37, 66, 68, 75, 76, 79, 80, 106], "systemctl": [6, 8, 11, 75], "systemctl_skip_redirect": 11, "systemd": [11, 76], "systemexit": 83, "sz": 33, "szl": 93, "szn": 102, "t": [6, 7, 10, 11, 13, 15, 21, 23, 24, 25, 26, 29, 31, 37, 43, 44, 50, 51, 58, 67, 73, 77, 78, 79, 83, 86, 93, 100, 101, 102, 104, 106], "ta": [47, 100], "tab": [10, 17, 18, 24, 74, 76, 81, 103, 106], "tabl": 74, "tablet": 24, "tag": [7, 10, 23, 29, 43, 63, 68, 69, 72, 84, 93], "tag_list": 93, "tagesschau": [32, 102], "taginfo": 84, "tailor": 87, "taiwan": 93, "take": [9, 11, 20, 25, 26, 72, 80, 85, 90, 97, 101, 106], "taken": [10, 18, 20, 73, 79, 90], "takimata": 79, "tale": 7, "target": [26, 45, 76, 78, 79], "task": [3, 9, 10, 11, 13, 75, 76, 78, 79, 106], "tb": 100, "tcp": 7, "tcp_nodelai": 10, "te": [47, 100], "team": 39, "technologi": 54, "tell": [29, 34], "templat": [10, 11, 32, 35, 37, 38, 45, 58, 66, 73, 74, 75, 76, 77, 90], "template_nam": [35, 37], "templates_path": 10, "tempor": 79, "temporarili": 46, "term": [6, 27, 30, 34, 36, 39, 46, 47, 73, 75, 79, 95], "termin": [10, 75, 83], "territori": [63, 93], "test": [0, 3, 6, 7, 8, 10, 21, 26, 37, 43, 63, 64, 68, 74, 75, 78, 80, 86, 90, 96, 100, 106, 107], "texliv": 3, "text": [1, 29, 33, 36, 46, 47, 61, 68, 69, 71, 79, 90, 100], "text_cont": 100, "textstyl": 79, "tfrac": 79, "tg": 100, "tgwf": 77, "th": [47, 100], "than": [10, 20, 36, 44, 47, 54, 60, 63, 68, 79, 86, 100, 101], "thats": 41, "thei": [10, 11, 18, 79, 87, 90, 102], "them": [11, 18, 35, 36, 37, 75, 79], "theme": [10, 24, 35, 37, 74, 78, 81], "theme_arg": [10, 24], "theme_nam": [35, 37], "themselv": [18, 36], "therefor": [46, 66, 79], "thi": [0, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 51, 53, 57, 58, 59, 61, 62, 63, 64, 65, 68, 71, 72, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 87, 88, 89, 90, 91, 93, 94, 95, 96, 97, 101, 104, 106], "thing": [11, 41, 79], "think": [26, 76, 78, 79], "third": [79, 87, 97, 101], "those": [7, 38, 45, 68, 75, 84, 87], "though": [47, 61], "thought": 33, "thread": [7, 11, 100], "three": [26, 63, 77, 79, 87], "threshold": [84, 100], "through": [10, 13, 18, 41, 79, 81, 87], "throw": 73, "thu": [13, 81, 87], "thumbnail": [29, 68], "thumbnail_360_url": 45, "thumbnail_src": 29, "thumbnail_xpath": 73, "tib": 100, "tiff": 72, "time": [10, 13, 20, 22, 26, 29, 30, 33, 37, 43, 44, 47, 54, 63, 73, 75, 76, 79, 81, 87, 90, 91, 97, 99, 100, 102, 106], "time_map": 41, "time_rang": [1, 29, 44, 47, 73, 81, 98], "time_range_arg": 47, "time_range_map": 73, "time_range_support": [29, 30, 43, 73, 79], "time_range_url": 73, "time_range_v": 73, "timeout": [10, 18, 20, 29, 30, 46, 79, 102, 105], "timeout_limit": 98, "timerang": 83, "timestamp": [11, 33], "timestamp_format": 33, "timezon": 106, "tin": 102, "tiney": [32, 102], "tini": 7, "tip": 79, "titl": [10, 24, 29, 33, 34, 37, 40, 45, 68, 73, 92], "title_xpath": 73, "tk": [80, 100], "tl": [46, 75, 100, 102], "tm": 79, "tmdb": 51, "to_dict": [82, 83], "to_lang": 29, "to_nam": 29, "to_si": 95, "to_str": [88, 100], "toc": 92, "todai": [24, 72], "todo": 30, "togeth": [54, 65], "token": [14, 15, 30, 34, 35, 36, 37, 38, 90], "token_kei": 90, "token_live_tim": 90, "tokyotoshokan": 102, "tom": 51, "toml": 4, "too": [10, 19, 22, 72, 77, 79, 87, 90, 91], "too_many_request": [88, 90], "tool": [2, 4, 9, 10, 25, 26, 38, 61, 74, 75, 76, 78, 79, 80, 83, 86, 106], "toot": 102, "tootfind": [50, 102], "top": 79, "tor": [10, 12, 18, 20, 30, 31, 86, 87, 88], "tor_check": 94, "tor_check_plugin": 81, "torproject": [12, 94], "torrent": [44, 65], "torrentfil": 29, "torznab": 32, "torznab_categori": 65, "touch": [6, 8, 11, 18], "tpb": 102, "tr": [47, 100], "tr_local": 84, "track": [70, 83, 86, 87, 101], "tracker": [10, 12, 16, 44, 65], "tracker_url_remov": 81, "trademark": 79, "tradeoff": 44, "tradit": 68, "trail": [6, 10, 24, 100], "train": 79, "trait": [32, 47, 53, 60, 68, 76, 84, 93], "traits_map": 84, "traits_v1": 30, "transalt": 93, "transform": 79, "translat": [40, 41, 60, 74, 76, 86, 93, 94, 101], "transpar": [75, 106], "tree": [10, 75, 76, 78], "trend": 51, "tri": [43, 46, 63, 90, 93], "trick": 100, "true": [1, 2, 6, 8, 11, 13, 18, 19, 20, 23, 24, 29, 30, 31, 33, 35, 36, 38, 41, 43, 45, 46, 47, 53, 63, 64, 65, 68, 69, 73, 77, 79, 81, 90, 93, 96, 100], "trust": [13, 18, 86, 87], "trustworthi": 104, "try": [10, 11, 25, 43, 59, 63, 80, 87], "tt": [100, 102], "ttf": 3, "tube": 56, "tune": [4, 5], "tunnel": 0, "tupl": [90, 93, 95, 100], "turn": [10, 22, 26, 45, 67, 72, 83, 97], "tw": [47, 68, 70, 93], "tw_hk": 63, "tw_tw": 63, "twice": 10, "twitter": [50, 58], "two": [6, 7, 8, 11, 15, 18, 20, 26, 43, 59, 68, 79, 81], "txt": [76, 79, 84], "type": [1, 9, 10, 23, 26, 30, 31, 33, 34, 36, 43, 47, 50, 63, 68, 69, 73, 74, 76, 77, 81, 84, 87, 90, 91, 92, 99, 100, 106], "typedur": 97, "typeerror": [83, 100], "typic": [2, 76, 79], "typo": [43, 79], "tyrant": 4, "tyv": 100, "tz": 47, "u": [10, 18, 22, 29, 43, 47, 63, 75, 76, 78, 79, 86, 93, 101, 102], "u5409": 100, "ua": 47, "ubu2004": [76, 106], "ubu2110": 106, "ubu2204": 106, "ubuntu": [3, 6, 8, 10, 11, 76, 79, 102, 106], "ud": 6, "ug": [47, 100], "ugli": 79, "ugo": 106, "ui": [2, 4, 6, 8, 10, 11, 14, 17, 18, 29, 30, 41, 43, 47, 57, 58, 62, 63, 79, 85, 86, 93, 102], "ui_async": 47, "ui_lang": 43, "uid": [11, 75], "uk": [47, 84, 100], "ukrainian": 100, "ullamco": 79, "ultrasecretkei": [2, 10, 15, 23], "un": 10, "uncom": [6, 10, 20], "uncomfort": 67, "uncommon": [26, 47], "under": [17, 18, 29, 32, 45, 75, 106], "underlin": [29, 31, 76], "underscor": [31, 84, 93], "understand": [79, 93], "undo": 25, "undocu": 59, "unescap": 100, "unfortun": [26, 41, 50], "unicod": [74, 84, 93], "unicodeescap": 84, "uniform": 63, "uninstal": [25, 76], "union": 100, "unit": [11, 12, 26, 46, 76, 84, 86, 88, 93], "unit_convert": 95, "universalfeedpars": 90, "unix": [2, 6, 8, 10, 11, 13, 21, 96], "unixepoch": 37, "unknown": [60, 63, 87, 90], "unknownlocaleerror": 63, "unless": 18, "unlik": [68, 87], "unlimit": [10, 13], "unpack": 37, "unrestrict": 13, "unset": [11, 22, 62, 63, 90, 93], "unspecifi": 29, "unsplash": 102, "unsupport": 72, "until": 97, "untouch": 76, "unusu": 11, "unwant": 9, "up": [2, 5, 6, 7, 8, 10, 11, 18, 21, 25, 28, 41, 75, 76, 79, 80, 86, 93, 95], "upd_cfg": 90, "updat": [4, 7, 10, 18, 26, 29, 31, 53, 66, 68, 74, 76, 77, 80, 82, 85, 90, 107], "update_ahmia_blacklist": 82, "update_curr": 82, "update_engine_descript": 82, "update_engine_trait": 82, "update_external_bang": 82, "update_firefox_vers": 82, "update_local": [82, 93], "update_osm_keys_tag": 82, "update_pyg": 82, "update_wikidata_unit": 82, "upgrad": [5, 25, 84], "upload": [68, 72], "upon": 106, "upper": 79, "upstream": [6, 8, 11], "uptim": 10, "ur": 100, "uri": 37, "url": [1, 2, 6, 7, 10, 12, 13, 16, 18, 21, 23, 24, 26, 28, 29, 33, 37, 41, 45, 46, 47, 51, 56, 57, 59, 64, 65, 66, 68, 69, 70, 72, 73, 75, 76, 77, 80, 83, 87, 88, 90, 96, 100, 106], "url_for": 90, "url_str": 70, "url_video": 37, "url_video_hd": 37, "url_video_sd": 37, "url_xpath": 73, "urlencod": 47, "urllib": 47, "urlpars": 77, "us": [0, 3, 5, 6, 7, 8, 9, 10, 11, 13, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 50, 51, 53, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 68, 69, 70, 72, 73, 75, 76, 78, 79, 80, 82, 83, 84, 85, 86, 90, 92, 93, 96, 97, 99, 100, 102, 103, 104, 105, 106, 107], "usag": [23, 31, 75, 76, 79, 83, 92, 101, 106, 107], "use_ac": 47, "use_default_set": [2, 14], "use_local_search_result": 58, "use_official_api": [18, 30], "use_source_url": 64, "useabl": 54, "user": [0, 4, 7, 9, 11, 12, 13, 15, 17, 18, 20, 21, 22, 26, 29, 30, 34, 43, 46, 47, 48, 50, 58, 60, 63, 69, 73, 75, 76, 79, 86, 87, 90, 93, 94, 100, 101, 102, 104, 106, 107], "user_ag": 90, "user_random": 33, "useradd": [10, 76], "userag": [76, 84, 100], "useragent_suffix": [10, 20], "userdel": 76, "usermod": 7, "usernam": [21, 36, 37], "using_tor_proxi": [10, 18, 20, 30, 31, 32], "usr": [2, 6, 7, 8, 10, 11, 13, 21, 25, 75, 76, 96, 107], "usual": [11, 27, 41, 73, 74, 78, 87, 106], "ut": 79, "utf": [6, 11, 79, 106], "utf8": [47, 76], "util": [3, 6, 8, 9, 10, 25, 35, 37, 38, 75, 77, 80, 83, 86, 88, 105], "uu": 90, "uuid": 104, "uwsgi": [3, 4, 5, 7, 8, 9, 10, 25, 75, 86, 107], "uwsgi_param": 8, "uwsgi_pass": 8, "uwsgi_thread": 7, "uwsgi_work": 7, "uz": 100, "v": [7, 10, 11, 26, 46], "v0": 76, "v10": 76, "v16": 76, "v2": 37, "v3": [48, 59], "val": [90, 95], "valid": [29, 37, 38, 60, 66, 67, 81, 90], "valu": [1, 7, 10, 13, 18, 19, 22, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, 46, 47, 57, 58, 63, 66, 68, 69, 73, 79, 81, 84, 90, 91, 92, 93, 95, 97, 100, 107], "valueerror": [52, 100], "var": 6, "vari": 11, "variabl": [7, 15, 20, 29, 79, 93, 100], "variant": [68, 79], "varieti": 39, "variou": [19, 26, 35, 47, 75, 77], "vassal": 11, "ve": 47, "vec": 100, "vector": 79, "vendor": 26, "veniam": 79, "venv": [3, 10], "vep": 100, "verbos": 10, "veri": [29, 43, 106], "verif": [10, 20, 30, 41], "verifi": [10, 20, 29, 104], "vero": 79, "versa": 95, "version": [10, 12, 29, 33, 74, 76, 79, 93], "vi": [47, 100], "via": [12, 13, 39, 64, 78, 80], "vice": 95, "video": [17, 43, 44, 55, 57, 59, 62, 63, 69, 83, 103], "video_id": 45, "video_respons": 56, "videolanguag": 56, "view": [74, 87], "viewbox": 79, "vim": [10, 24, 81], "vimeo": 102, "vintag": 47, "virtual": [6, 35, 37, 38], "virtualenv": [10, 11, 75, 76, 107], "visit": [7, 10, 36, 63, 79, 80, 87, 101], "visual": 72, "vl": 100, "vm": [80, 102], "vn": 47, "vo": 100, "void": [32, 102], "void_arch": 66, "voidlinux": [66, 102], "volum": [7, 29], "voluptua": 79, "vpn": [53, 87], "vqd": 46, "vulner": 87, "w": [33, 102], "w3": [63, 79], "w3c": 63, "wa": [10, 18, 25, 26, 29, 68, 72, 75, 76, 83, 96, 97, 100, 101, 102], "wai": [11, 13, 15, 26, 29, 36, 41, 44, 65, 79, 83, 87], "wait": [20, 97], "wallhaven": [32, 102], "wallpap": 67, "want": [5, 7, 10, 11, 18, 20, 24, 26, 36, 37, 48, 58, 76, 79, 80, 81, 85, 87, 101, 105, 106], "war": 100, "warn": [3, 43, 76, 79, 83, 90, 106], "watch": 26, "wau": 104, "wb": 102, "wc": 102, "wca": 102, "wcf": 102, "wcv": 102, "wd": 102, "wdr": 64, "we": [0, 2, 3, 6, 8, 9, 10, 11, 15, 18, 27, 28, 41, 43, 45, 46, 47, 49, 50, 51, 58, 63, 72, 75, 76, 77, 78, 79, 82, 85, 88, 93, 101, 105, 106], "web": [0, 7, 10, 19, 22, 23, 24, 29, 30, 36, 43, 46, 58, 59, 61, 63, 68, 70, 72, 75, 76, 77, 90, 100, 106], "web_lite_url": 59, "webapi": 32, "webapp": [10, 11, 23, 76], "webcach": [10, 24], "weblat": [26, 76, 85, 101], "webp": 72, "webproject": 69, "webserv": 8, "websit": [1, 18, 30, 46, 72, 79, 84, 91, 101], "webui": 61, "week": [7, 29, 41, 47, 73, 83], "weight": [18, 79, 95, 102], "weird": 26, "welcom": [6, 8, 69, 101], "well": [7, 57, 62, 63, 68, 79, 86, 101], "were": 68, "werkzeug": 90, "west": 78, "wfr": 104, "wh": 102, "what": [6, 8, 11, 13, 18, 25, 35, 46, 63, 67, 72, 75, 79, 93, 97, 101, 106], "whatev": [9, 106], "wheel": 10, "when": [3, 6, 7, 9, 10, 12, 18, 21, 24, 30, 31, 34, 38, 43, 44, 47, 51, 60, 63, 64, 77, 78, 79, 83, 87, 88, 91, 93, 99, 100, 101, 104], "whenev": [0, 93, 106], "where": [0, 11, 23, 29, 34, 37, 38, 43, 61, 64, 68, 75, 79, 94, 97, 101], "whether": [13, 18, 65, 72, 87, 90], "which": [2, 9, 10, 11, 13, 18, 20, 26, 27, 28, 29, 30, 32, 33, 34, 37, 38, 42, 45, 48, 50, 51, 57, 59, 65, 71, 73, 75, 76, 78, 79, 81, 83, 84, 85, 86, 87, 90, 93, 97, 101, 102], "while": [11, 27, 43, 75, 76, 78, 79, 80, 91, 97, 100, 101], "whitepap": 43, "whitespac": 76, "who": [7, 11, 67, 87], "whole": 77, "whose": 100, "why": [50, 79, 86, 103], "wib": 102, "wibi": 102, "wide": 26, "widen": 79, "width": [24, 72, 79], "wiki": [1, 7, 8, 10, 15, 16, 18, 33, 68, 76, 79, 84, 102, 106], "wiki_lc_locale_vari": 68, "wiki_netloc": [40, 68], "wiki_url": [10, 16], "wikibas": 84, "wikibook": 102, "wikicommon": 102, "wikidata": [46, 84, 95, 102], "wikidata_id": [18, 30], "wikidata_unit": [84, 95], "wikimedia": [32, 33], "wikimini": 102, "wikinew": 102, "wikipedia": [10, 22, 33, 81, 84, 102, 104], "wikipedia_article_depth": 68, "wikipedia_languag": 68, "wikiquot": 102, "wikisourc": 102, "wikispeci": 102, "wikivers": 102, "wikivoyag": 102, "wild": 78, "wildcard": 37, "win": 13, "window": [46, 90, 97], "wish": [20, 35, 37], "within": [27, 28, 53, 79, 104], "without": [3, 7, 11, 18, 22, 29, 30, 35, 50, 63, 65, 76, 83, 84, 86, 87, 92, 93, 101, 106], "wkmn": 102, "wlc": 74, "wn": 102, "wolframalpha": 102, "wolframalpha_noapi": 102, "won": [7, 11, 43, 83], "word": [76, 77, 79, 81], "work": [0, 7, 10, 13, 24, 26, 29, 30, 34, 39, 46, 67, 74, 76, 78, 87, 103, 106], "workaround": 18, "worker": 11, "workflow": [78, 85], "working_dir": 34, "world": [26, 79, 87], "worri": 78, "worst": 100, "worth": 11, "would": [18, 27, 41, 75], "wp": [68, 102, 104], "wq": 102, "wrap": [74, 106], "wrapper": 76, "write": [21, 68, 84, 90], "written": [10, 19, 47, 75], "wrong": [46, 76], "wsgi": 11, "wsp": 102, "wt": 46, "wt_wt": 46, "wuu": 100, "wv": 102, "ww": 90, "www": [3, 6, 10, 20, 37, 41, 45, 46, 51, 59, 79, 84, 100, 106], "www1x": 102, "wy": 102, "wysiwyg": 26, "x": [0, 6, 8, 10, 11, 13, 23, 29, 50, 58, 79, 90, 106], "x1": 79, "x2": 79, "x86_64": 66, "x_for": [13, 90], "xal": 100, "xapian": 61, "xbp": 66, "xdg": [7, 10, 76], "xetex": 3, "xmf": 100, "xml": [11, 44, 47, 65, 79, 100], "xmln": 79, "xpath": [32, 63, 91, 100, 102], "xpath_result": 100, "xpath_spec": [91, 100], "xpath_str": 100, "xpathxslt": 100, "xxxx": [46, 79], "xz": 80, "y": [3, 10, 12, 33, 79, 102], "y1": 79, "y2": 79, "ya": [69, 102], "yaci": [32, 102], "yacy_search_serv": 69, "yacybot": 90, "yahoo": [32, 90, 102], "yahoo_new": 102, "yai": [69, 102], "yaml": [10, 18, 21, 30, 31, 76], "yamllint": 76, "yamllint_fil": 76, "yandex": 10, "yandexbot": 90, "yandexmobilebot": 90, "ye": 75, "year": [29, 41, 47, 71, 73, 81, 83], "yep": 102, "yepi": 102, "yepn": 102, "yet": [26, 29, 32, 63, 69, 80, 106], "yh": 102, "yhn": 102, "yi": 100, "yield": 89, "yml": [2, 4, 6, 7, 8, 10, 11, 14, 18, 25, 27, 28, 35, 36, 37, 38, 48, 59, 62, 63, 75, 76, 77, 79, 81, 94, 95, 96, 100, 102, 107], "yn": 106, "yo": 100, "you": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 18, 19, 20, 21, 23, 24, 25, 26, 27, 33, 34, 35, 36, 37, 38, 41, 43, 48, 61, 63, 65, 66, 67, 68, 72, 75, 76, 78, 79, 80, 81, 83, 85, 86, 87, 95, 101, 104, 105, 106, 107], "your": [0, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 19, 21, 23, 24, 25, 26, 27, 28, 33, 34, 35, 36, 37, 38, 43, 61, 68, 72, 74, 76, 77, 78, 79, 80, 83, 85, 86, 101, 104, 106], "your_morty_proxy_kei": 10, "yourself": [7, 26, 101], "youtub": [57, 102], "youtube_noapi": 102, "yt": 102, "yue": 100, "yyyi": 79, "z": [32, 79, 100, 102], "za": [47, 100], "zadd": 97, "zcount": 97, "zero": [97, 106], "zgrab": 90, "zh": [40, 47, 63, 68, 93, 100], "zh_ch": 70, "zh_cht": 70, "zh_han": [93, 100], "zh_hans_cn": [63, 92], "zh_hant": [93, 100], "zh_hant_hk": 63, "zh_hant_tw": 63, "zh_tw": 93, "zip": 100, "zlib": 102, "zlib1g": [3, 10, 80], "zlib2010": 71, "zlib_ext": 71, "zlib_year_from": 71, "zlib_year_to": 71, "zlibrari": [71, 102], "zmeu": 90, "zremrangebyscor": 97, "zw": 47, "zz": 100, "zzzz": 79, "\u00f3": 100, "\u015bl\u014dnski": 93, "\u0780": 93, "\u0788": 93, "\u078b": 93, "\u51fa\u79df\u8eca": 68, "\u51fa\u79df\u8f66": 68, "\u5409": 100, "\u5fb7\u58eb": 68, "\u641c\u7d22": 40, "\u7684\u58eb": 68, "\u8a08\u7a0b\u8eca": 68}, "titles": ["Answer CAPTCHA from server\u2019s IP", "Administration API", "Architecture", "Buildhosts", "Administrator documentation", "Installation", "Apache", "Docker Container", "NGINX", "Installation Script", "Step by step installation", "uWSGI", "Plugins builtin", "Limiter", "Settings", "<code class=\"docutils literal notranslate\"><span class=\"pre\">settings.yml</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">brand:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">categories_as_tabs:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">engine:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">general:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">outgoing:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">redis:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">search:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">server:</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">ui:</span></code>", "SearXNG maintenance", "How to contribute", "Demo Offline Engine", "Demo Online Engine", "Engine Overview", "Engine Library", "SearXNG\u2019s engines loader", "Engine Implementations", "MediaWiki Engine", "Command Line Engines", "NoSQL databases", "Local Search APIs", "SQL Engines", "Offline Concept", "Anna\u2019s Archive", "Arch Linux", "Bing Engines", "Bpb", "Brave Engines", "BT4G", "Dailymotion", "DuckDuckGo Engines", "Google Engines", "Lemmy", "Library of Congress", "Mastodon", "Moviepilot", "Matrix Rooms Search (MRS)", "Mullvad-Leta", "Mwmbl Engine", "Odysee", "Peertube Engines", "Piped", "Presearch Engine", "Qwant", "RadioBrowser", "Recoll Engine", "Seekr Engines", "Startpage Engines", "Tagesschau API", "Torznab WebAPI", "Void Linux binary packages", "Wallhaven", "Wikimedia", "Yacy", "Yahoo Engine", "Z-Library", "Tineye", "XPath Engine", "Developer documentation", "Developing in Linux Containers", "Makefile &amp; <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage</span></code>", "Plugins", "Development Quickstart", "reST primer", "Runtime Management", "Search API", "Tooling box <code class=\"docutils literal notranslate\"><span class=\"pre\">searxng_extra</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">searxng_extra/standalone_searx.py</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">searxng_extra/update/</span></code>", "Translation", "Welcome to SearXNG", "Why use a private instance?", "Source-Code", "Custom message extractor (i18n)", "Bot Detection", "SearXNG Exceptions", "Online <code class=\"docutils literal notranslate\"><span class=\"pre\">/info</span></code>", "Locales", "Tor check plugin", "Unit converter plugin", "Redis DB", "Redis Library", "Search", "Search processors", "Utility functions for the engines", "About SearXNG", "Configured Engines", "User information", "Search syntax", "DevOps tooling box", "<code class=\"docutils literal notranslate\"><span class=\"pre\">utils/lxc.sh</span></code>", "<code class=\"docutils literal notranslate\"><span class=\"pre\">utils/searxng.sh</span></code>"], "titleterms": {"": [0, 6, 8, 11, 31, 39, 93], "If": 29, "In": 75, "The": [6, 8, 26, 29, 75], "about": [79, 87, 101], "abstract": 99, "activ": 76, "addit": 29, "administr": [1, 4], "admonit": 79, "after": 25, "aka": 79, "anchor": 79, "anna": 39, "answer": [0, 46], "apach": 6, "api": [1, 36, 46, 47, 64, 81], "app": 102, "ar": [29, 87], "arbitrari": 29, "arch": 40, "architectur": 2, "archiv": 39, "archlinux": 75, "argument": 29, "articl": 79, "ascii": 79, "asdf": 80, "audienc": 75, "autocomplet": [47, 54], "automat": 104, "bang": 104, "bar": 1, "bashism": 7, "basic": 79, "bibliograph": 79, "bibtex": 29, "binari": 66, "bing": 41, "block": 79, "bot": 90, "box": [82, 105], "bpb": 42, "brand": 16, "brave": 43, "bt4g": 44, "build": [3, 7, 26, 76, 79], "buildhost": [3, 106], "built": 12, "builtin": 12, "bullet": 79, "can": 101, "captcha": 0, "categori": [63, 104], "categories_as_tab": 17, "check": [10, 25, 94], "checker": 76, "class": 99, "clean": [26, 76, 106], "code": [26, 79, 88, 93], "command": [7, 34, 105, 106, 107], "commit": 26, "common": [29, 105], "compon": 32, "concept": 38, "conclus": 87, "config": [90, 106], "configur": [1, 10, 12, 13, 29, 33, 34, 35, 37, 39, 44, 48, 52, 57, 59, 61, 62, 65, 69, 71, 73, 102], "congress": 49, "connect": 106, "consequ": 87, "contain": [7, 75], "content": [43, 44, 47, 48, 52, 57, 59, 62, 69, 71, 79], "contribut": 26, "convert": 95, "creat": [10, 26], "csp": 47, "csv": 79, "currenc": [32, 99], "custom": 89, "dailymot": 45, "data": [1, 93], "databas": 35, "db": 96, "debian": [6, 11], "debug": 25, "default": [12, 29, 101], "definit": 79, "demo": [27, 28], "depend": [10, 35, 37, 38], "deploi": 26, "design": 26, "detect": 90, "develop": [3, 21, 74, 75, 78], "devop": 105, "dictionari": [32, 99], "direct": 26, "disabl": [6, 8], "distributor": 11, "do": 101, "doc": [3, 26, 76], "docker": [7, 106], "document": [4, 26, 74], "doe": [87, 101], "dot": 79, "drop": 76, "duckduckgo": 46, "elasticsearch": 36, "emb": 1, "enabl": 13, "engin": [18, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 41, 43, 46, 47, 54, 56, 58, 61, 62, 63, 70, 73, 75, 76, 100, 101, 102, 104], "engine_typ": 29, "entri": 77, "env": 76, "environ": [76, 79, 105], "equat": 79, "exampl": [18, 34, 35, 36, 37, 61, 73, 77, 79], "except": 91, "ext": 79, "extern": [77, 104], "extlink": 79, "extra": [35, 37, 38, 46], "extractor": 89, "featur": 86, "field": [29, 79], "figur": 79, "file": [29, 79, 102], "first": 9, "flask": 90, "flat": 79, "foo": 79, "format": [29, 76], "framework": 32, "from": 0, "fulli": 75, "function": [75, 100], "further": [2, 6, 8, 9, 11, 12, 14, 15, 18, 25, 29, 35, 36, 37, 75, 76, 77, 78, 79, 81, 102, 106, 107], "gate": 79, "gener": [19, 29, 79, 102], "gentlemen": 75, "get": [1, 7, 80], "gh": 76, "github": 26, "go": 76, "goggl": 43, "good": [26, 106], "googl": 47, "graphviz": 79, "grid": 79, "group": 102, "hackabl": 26, "head": 79, "header": [6, 90], "hello": 79, "help": [76, 106, 107], "highlight": 79, "hint": [7, 106], "hlist": 79, "horizont": 79, "how": [25, 26, 87, 101], "http": [6, 8, 90], "http_accept": 90, "http_accept_encod": 90, "http_accept_languag": 90, "http_connect": 90, "http_user_ag": 90, "hyperlink": 79, "i": [29, 87, 101], "i18n": 89, "imag": [7, 29, 41, 46, 47, 79, 102], "implement": [13, 32, 33, 34, 35, 37, 39, 43, 44, 48, 52, 57, 58, 59, 61, 62, 65, 69, 71, 73, 93], "info": [7, 13, 18, 25, 32, 34, 35, 36, 37, 61, 92], "inform": 103, "inlin": 79, "insid": 7, "inspect": 25, "instal": [5, 9, 10, 25, 76, 106, 107], "instanc": 87, "instant": 46, "interfac": 38, "internet": 106, "intersphinx": 79, "introduc": 80, "io": 26, "ip": [0, 90], "ip_limit": 90, "ip_list": 90, "j": 76, "kernel": 79, "kiss": 79, "know": 106, "known": [57, 62], "languag": [43, 58, 63, 104], "latex": 79, "layout": [6, 11], "lemmi": 48, "leta": 53, "librari": [30, 49, 71, 97], "limit": [13, 90], "line": [7, 34, 79], "link": 79, "link_token": 90, "lint": 3, "linux": [40, 66, 75], "list": [79, 90], "lite": 46, "liter": 79, "live": [26, 76], "loader": 31, "local": [36, 93], "locat": 15, "log": [6, 8], "lxc": 106, "lxd": 106, "lyric": 102, "mainten": [11, 25], "make": [29, 76, 101], "makefil": 76, "manag": [76, 80], "manual": 0, "map": [29, 102], "markup": 79, "mastodon": 50, "math": 79, "matrix": 52, "matter": 79, "media": 29, "mediawiki": 33, "meilisearch": 36, "messag": 89, "method": 90, "migrat": 25, "mode": 11, "modul": [6, 29], "mongodb": 35, "motiv": 75, "moviepilot": 51, "mr": 52, "mullvad": 53, "multilingu": 18, "music": 102, "mwmbl": 54, "my": [87, 101], "mysql": 37, "name": [29, 76, 79], "need": 3, "nest": 79, "new": [41, 46, 47, 102], "nginx": 8, "node": 76, "nodej": 76, "nosql": 35, "note": [21, 79], "nvm": 76, "o": 9, "obsolet": 25, "odyse": 55, "offlin": [27, 32, 38, 99], "onlin": [28, 29, 32, 92, 99], "online_curr": 29, "online_dictionari": 29, "online_url_search": 29, "option": 29, "ordinari": 79, "origin": [11, 86], "outgo": 20, "overrid": 29, "overview": 29, "own": [87, 101], "packag": [10, 29, 66, 102], "page": 76, "paper": 29, "paragraph": 79, "paramet": [29, 81], "part": 86, "pass": 29, "peertub": 56, "pipe": 57, "pitfal": 11, "plugin": [12, 77, 94, 95], "point": 77, "polici": 47, "postgresql": 37, "presearch": 58, "prime": 26, "primer": 79, "privaci": [26, 87], "privat": [18, 38, 87], "probe": 90, "process": 79, "processor": 99, "product": 75, "program": 38, "protect": 87, "public": 87, "py": [83, 84], "pylint": 76, "python": 76, "q": 102, "queri": 104, "quickstart": 78, "quirk": [57, 62], "quot": 79, "qwant": 59, "radio": 102, "radiobrows": 60, "rate": 90, "read": [2, 6, 8, 9, 11, 12, 14, 15, 18, 25, 29, 35, 36, 37, 75, 76, 77, 78, 79, 81, 102, 106, 107], "readabl": 79, "recol": 61, "recommend": 29, "redi": [21, 35, 76, 96, 97], "redirect": 104, "ref": 79, "region": [43, 58, 63], "remote_addr": 90, "remov": 25, "render": 79, "repo": 102, "request": [29, 90], "respons": 1, "rest": [26, 79], "result": 29, "role": 79, "room": 52, "run": [7, 76, 87, 106], "runtim": 80, "sampl": 1, "scholar": 47, "scienc": 102, "scientific_publ": 102, "script": [3, 9], "search": [1, 18, 22, 32, 36, 52, 58, 76, 81, 98, 99, 101, 104], "searxng": [6, 7, 8, 10, 25, 31, 75, 86, 87, 91, 93, 101, 106, 107], "searxng_extra": [82, 83, 84], "secur": [38, 47], "see": [29, 87], "seekr": 62, "select": 104, "sepiasearch": 56, "server": [0, 6, 8, 23, 35], "servic": 25, "set": [14, 15, 29, 101], "setup": [2, 11, 29, 106], "sh": [106, 107], "shell": [3, 7, 76], "sidebar": 79, "simpl": 79, "site": [6, 8], "skill": 79, "smart": 79, "social_media": 102, "soft": 79, "software_wiki": 102, "solr": 36, "sourc": [26, 88], "space": 79, "special": 104, "specif": 79, "specifi": 29, "sphinx": [3, 79], "sql": 37, "sqlite": 37, "ssh": 0, "stai": 25, "standalone_searx": 83, "start": [75, 80], "startpag": 63, "static": 76, "statu": 76, "step": 10, "structur": 79, "subgroup": 102, "substitut": 79, "suit": [75, 106], "summari": 75, "svg": 79, "syntax": [79, 104], "tab": [79, 102], "tabl": 79, "tagesschau": 64, "templat": [29, 79], "test": 76, "theme": 76, "time": 12, "tiney": 72, "titl": 79, "token": 18, "toml": 13, "tool": [3, 82, 105], "tor": 94, "torrent": 29, "torznab": 65, "trait": 30, "translat": [26, 85, 102], "true": [10, 15], "truth": 79, "tune": 25, "type": [29, 32, 58], "tyrant": 11, "ui": 24, "unicod": 79, "unit": 95, "up": 106, "updat": [9, 25, 84], "update_ahmia_blacklist": 84, "update_curr": 84, "update_engine_descript": 84, "update_engine_trait": 84, "update_external_bang": 84, "update_firefox_vers": 84, "update_local": 84, "update_osm_keys_tag": 84, "update_pyg": 84, "update_wikidata_unit": 84, "url": [32, 79, 99], "us": [87, 101], "use_default_set": [10, 15], "user": [10, 103], "usual": 75, "util": [100, 106, 107], "uwsgi": [2, 6, 11], "version": 80, "video": [29, 41, 45, 46, 47, 56, 58, 102], "view": 79, "void": 66, "wallhaven": 67, "warn": 7, "weather": 46, "web": [41, 47, 54, 102], "webapi": 65, "welcom": 86, "what": 87, "why": [87, 101], "wiki": 40, "wikidata": 68, "wikimedia": [68, 102], "wikipedia": 68, "without": 102, "wlc": 85, "work": [75, 101], "worth": 87, "wrap": 75, "xpath": 73, "yaci": 69, "yahoo": 70, "yml": [15, 29], "your": 75, "z": 71}}) \ No newline at end of file
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 000000000..f4816c0b2
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Source-Code &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Custom message extractor (i18n)" href="searx.babel_extract.html" />
+ <link rel="prev" title="utils/lxc.sh" href="../utils/lxc.sh.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.babel_extract.html" title="Custom message extractor (i18n)"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../utils/lxc.sh.html" title="utils/lxc.sh"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Source-Code</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="source-code">
+<h1>Source-Code<a class="headerlink" href="#source-code" title="Link to this heading">¶</a></h1>
+<p>This is a partial documentation of our source code. We are not aiming to document
+every item from the source code, but we will add documentation when requested.</p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html#searx.babel_extract.extract"><code class="docutils literal notranslate"><span class="pre">extract()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html#searx.botdetection.get_network"><code class="docutils literal notranslate"><span class="pre">get_network()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html#searx.botdetection.get_real_ip"><code class="docutils literal notranslate"><span class="pre">get_real_ip()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html#searx.botdetection.too_many_requests"><code class="docutils literal notranslate"><span class="pre">too_many_requests()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html#module-searx.botdetection.ip_lists">IP lists</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html#module-searx.botdetection.ip_limit">Rate limit</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html#module-searx.botdetection.http_accept">Probe HTTP headers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html#module-searx.botdetection.config">Config</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxEngineAPIException"><code class="docutils literal notranslate"><span class="pre">SearxEngineAPIException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxEngineAccessDeniedException"><code class="docutils literal notranslate"><span class="pre">SearxEngineAccessDeniedException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxEngineCaptchaException"><code class="docutils literal notranslate"><span class="pre">SearxEngineCaptchaException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxEngineException"><code class="docutils literal notranslate"><span class="pre">SearxEngineException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxEngineResponseException"><code class="docutils literal notranslate"><span class="pre">SearxEngineResponseException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxEngineTooManyRequestsException"><code class="docutils literal notranslate"><span class="pre">SearxEngineTooManyRequestsException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxEngineXPathException"><code class="docutils literal notranslate"><span class="pre">SearxEngineXPathException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxException"><code class="docutils literal notranslate"><span class="pre">SearxException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxParameterException"><code class="docutils literal notranslate"><span class="pre">SearxParameterException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxSettingsException"><code class="docutils literal notranslate"><span class="pre">SearxSettingsException</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html#searx.exceptions.SearxXPathSyntaxException"><code class="docutils literal notranslate"><span class="pre">SearxXPathSyntaxException</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.infopage.html">Online <code class="docutils literal notranslate"><span class="pre">/info</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.infopage.html#searx.infopage.InfoPage"><code class="docutils literal notranslate"><span class="pre">InfoPage</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.infopage.html#searx.infopage.InfoPageSet"><code class="docutils literal notranslate"><span class="pre">InfoPageSet</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.locales.html">Locales</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searxngs-locale-data">SearXNG’s locale data</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#module-searx.sxng_locales">SearXNG’s locale codes</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searxngs-locale-implementations">SearXNG’s locale implementations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.build_engine_locales"><code class="docutils literal notranslate"><span class="pre">build_engine_locales()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.get_engine_locale"><code class="docutils literal notranslate"><span class="pre">get_engine_locale()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.get_locale"><code class="docutils literal notranslate"><span class="pre">get_locale()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.get_official_locales"><code class="docutils literal notranslate"><span class="pre">get_official_locales()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.get_translation_locales"><code class="docutils literal notranslate"><span class="pre">get_translation_locales()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.get_translations"><code class="docutils literal notranslate"><span class="pre">get_translations()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.language_tag"><code class="docutils literal notranslate"><span class="pre">language_tag()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.locales_initialize"><code class="docutils literal notranslate"><span class="pre">locales_initialize()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.match_locale"><code class="docutils literal notranslate"><span class="pre">match_locale()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.region_tag"><code class="docutils literal notranslate"><span class="pre">region_tag()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.ADDITIONAL_TRANSLATIONS"><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_TRANSLATIONS</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.LOCALE_BEST_MATCH"><code class="docutils literal notranslate"><span class="pre">LOCALE_BEST_MATCH</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.LOCALE_NAMES"><code class="docutils literal notranslate"><span class="pre">LOCALE_NAMES</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html#searx.locales.RTL_LOCALES"><code class="docutils literal notranslate"><span class="pre">RTL_LOCALES</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html#searx.plugins.tor_check.description"><code class="docutils literal notranslate"><span class="pre">description</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html#searx.plugins.tor_check.name"><code class="docutils literal notranslate"><span class="pre">name</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html#searx.plugins.tor_check.preference_section"><code class="docutils literal notranslate"><span class="pre">preference_section</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html#searx.plugins.tor_check.query_examples"><code class="docutils literal notranslate"><span class="pre">query_examples</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html#searx.plugins.tor_check.query_keywords"><code class="docutils literal notranslate"><span class="pre">query_keywords</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html#searx.plugins.unit_converter.symbol_to_si"><code class="docutils literal notranslate"><span class="pre">symbol_to_si()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html#searx.plugins.unit_converter.ADDITIONAL_UNITS"><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_UNITS</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html#searx.plugins.unit_converter.ALIAS_SYMBOLS"><code class="docutils literal notranslate"><span class="pre">ALIAS_SYMBOLS</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.redisdb.html">Redis DB</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html#searx.redisdb.OLD_REDIS_URL_DEFAULT_URL"><code class="docutils literal notranslate"><span class="pre">OLD_REDIS_URL_DEFAULT_URL</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.redislib.html">Redis Library</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html#searx.redislib.drop_counter"><code class="docutils literal notranslate"><span class="pre">drop_counter()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html#searx.redislib.incr_counter"><code class="docutils literal notranslate"><span class="pre">incr_counter()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html#searx.redislib.incr_sliding_window"><code class="docutils literal notranslate"><span class="pre">incr_sliding_window()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html#searx.redislib.lua_script_storage"><code class="docutils literal notranslate"><span class="pre">lua_script_storage()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html#searx.redislib.purge_by_prefix"><code class="docutils literal notranslate"><span class="pre">purge_by_prefix()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html#searx.redislib.secret_hash"><code class="docutils literal notranslate"><span class="pre">secret_hash()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html#searx.redislib.LUA_SCRIPT_STORAGE"><code class="docutils literal notranslate"><span class="pre">LUA_SCRIPT_STORAGE</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.search.html">Search</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html#searx.search.EngineRef"><code class="docutils literal notranslate"><span class="pre">EngineRef</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html#searx.search.SearchQuery"><code class="docutils literal notranslate"><span class="pre">SearchQuery</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html#searx.search.Search"><code class="docutils literal notranslate"><span class="pre">Search</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html#searx.search.SearchWithPlugins"><code class="docutils literal notranslate"><span class="pre">SearchWithPlugins</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.search.processors.html">Search processors</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html#module-searx.search.processors.abstract">Abstract processor class</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html#module-searx.search.processors.offline">Offline processor</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html#module-searx.search.processors.online">Online processor</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html#module-searx.search.processors.online_currency">Online currency processor</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html#module-searx.search.processors.online_dictionary">Online dictionary processor</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html#module-searx.search.processors.online_url_search">Online URL search processor</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.convert_str_to_int"><code class="docutils literal notranslate"><span class="pre">convert_str_to_int()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.detect_language"><code class="docutils literal notranslate"><span class="pre">detect_language()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.dict_subset"><code class="docutils literal notranslate"><span class="pre">dict_subset()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.ecma_unescape"><code class="docutils literal notranslate"><span class="pre">ecma_unescape()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.eval_xpath"><code class="docutils literal notranslate"><span class="pre">eval_xpath()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.eval_xpath_getindex"><code class="docutils literal notranslate"><span class="pre">eval_xpath_getindex()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.eval_xpath_list"><code class="docutils literal notranslate"><span class="pre">eval_xpath_list()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.extract_text"><code class="docutils literal notranslate"><span class="pre">extract_text()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.extract_url"><code class="docutils literal notranslate"><span class="pre">extract_url()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.gen_useragent"><code class="docutils literal notranslate"><span class="pre">gen_useragent()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.get_engine_from_settings"><code class="docutils literal notranslate"><span class="pre">get_engine_from_settings()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.get_torrent_size"><code class="docutils literal notranslate"><span class="pre">get_torrent_size()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.get_xpath"><code class="docutils literal notranslate"><span class="pre">get_xpath()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.html_to_text"><code class="docutils literal notranslate"><span class="pre">html_to_text()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.humanize_bytes"><code class="docutils literal notranslate"><span class="pre">humanize_bytes()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.int_or_zero"><code class="docutils literal notranslate"><span class="pre">int_or_zero()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.is_valid_lang"><code class="docutils literal notranslate"><span class="pre">is_valid_lang()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.js_variable_to_python"><code class="docutils literal notranslate"><span class="pre">js_variable_to_python()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.markdown_to_text"><code class="docutils literal notranslate"><span class="pre">markdown_to_text()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.normalize_url"><code class="docutils literal notranslate"><span class="pre">normalize_url()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.searx_useragent"><code class="docutils literal notranslate"><span class="pre">searx_useragent()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.to_string"><code class="docutils literal notranslate"><span class="pre">to_string()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html#searx.utils.SEARCH_LANGUAGE_CODES"><code class="docutils literal notranslate"><span class="pre">SEARCH_LANGUAGE_CODES</span></code></a></li>
+</ul>
+</li>
+</ul>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Source-Code</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li>Previous: <a href="../utils/lxc.sh.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a>
+ <li>Next: <a href="searx.babel_extract.html" title="next chapter">Custom message extractor (i18n)</a>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.babel_extract.html b/src/searx.babel_extract.html
new file mode 100644
index 000000000..ec9d9df62
--- /dev/null
+++ b/src/searx.babel_extract.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Custom message extractor (i18n) &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Bot Detection" href="searx.botdetection.html" />
+ <link rel="prev" title="Source-Code" href="index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.botdetection.html" title="Bot Detection"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="Source-Code"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Custom message extractor (i18n)</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="module-searx.babel_extract">
+<span id="custom-message-extractor-i18n"></span><span id="searx-babel-extract"></span><h1>Custom message extractor (i18n)<a class="headerlink" href="#module-searx.babel_extract" title="Link to this heading">¶</a></h1>
+<p>This module implements the <a class="reference external" href="https://github.com/searxng/searxng/blob/master/babel.cfg">searxng_msg</a> extractor to
+extract messages from:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/searxng.msg">git://searx/searxng.msg</a></p></li>
+</ul>
+<p>The <code class="docutils literal notranslate"><span class="pre">searxng.msg</span></code> files are selected by <a class="reference external" href="https://babel.pocoo.org/en/latest/index.html">Babel</a>, see Babel’s configuration in
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/babel.cfg">git://babel.cfg</a>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">searxng_msg</span> <span class="o">=</span> <span class="n">searx</span><span class="o">.</span><span class="n">babel_extract</span><span class="o">.</span><span class="n">extract</span>
+<span class="o">...</span>
+<span class="p">[</span><span class="n">searxng_msg</span><span class="p">:</span> <span class="o">**/</span><span class="n">searxng</span><span class="o">.</span><span class="n">msg</span><span class="p">]</span>
+</pre></div>
+</div>
+<p>A <code class="docutils literal notranslate"><span class="pre">searxng.msg</span></code> file is a python file that is <em>executed</em> by the
+<a class="reference internal" href="#searx.babel_extract.extract" title="searx.babel_extract.extract"><code class="xref py py-obj docutils literal notranslate"><span class="pre">extract</span></code></a> function. Additional <code class="docutils literal notranslate"><span class="pre">searxng.msg</span></code> files can be added by:</p>
+<ol class="arabic simple">
+<li><p>Adding a <code class="docutils literal notranslate"><span class="pre">searxng.msg</span></code> file in one of the SearXNG python packages and</p></li>
+<li><p>implement a method in <a class="reference internal" href="#searx.babel_extract.extract" title="searx.babel_extract.extract"><code class="xref py py-obj docutils literal notranslate"><span class="pre">extract</span></code></a> that yields messages from this file.</p></li>
+</ol>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.babel_extract.extract">
+<span class="sig-prename descclassname"><span class="pre">searx.babel_extract.</span></span><span class="sig-name descname"><span class="pre">extract</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fileobj</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">keywords</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">comment_tags</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">options</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/babel_extract.html#extract"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.babel_extract.extract" title="Link to this definition">¶</a></dt>
+<dd><p>Extract messages from <code class="docutils literal notranslate"><span class="pre">searxng.msg</span></code> files by a custom <a class="reference external" href="https://babel.pocoo.org/en/latest/messages.html#writing-extraction-methods">extractor</a>.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Custom message extractor (i18n)</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.babel_extract.extract"><code class="docutils literal notranslate"><span class="pre">extract()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="index.html" title="previous chapter">Source-Code</a>
+ <li>Next: <a href="searx.botdetection.html" title="next chapter">Bot Detection</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.babel_extract.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.botdetection.html b/src/searx.botdetection.html
new file mode 100644
index 000000000..7d18d812c
--- /dev/null
+++ b/src/searx.botdetection.html
@@ -0,0 +1,581 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Bot Detection &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="SearXNG Exceptions" href="searx.exceptions.html" />
+ <link rel="prev" title="Custom message extractor (i18n)" href="searx.babel_extract.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.exceptions.html" title="SearXNG Exceptions"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.babel_extract.html" title="Custom message extractor (i18n)"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Bot Detection</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="bot-detection">
+<span id="botdetection"></span><h1>Bot Detection<a class="headerlink" href="#bot-detection" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.botdetection.ip_lists" id="id4">IP lists</a></p>
+<ul>
+<li><p><a class="reference internal" href="#method-ip-lists" id="id5">Method <code class="docutils literal notranslate"><span class="pre">ip_lists</span></code></a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#module-searx.botdetection.ip_limit" id="id6">Rate limit</a></p>
+<ul>
+<li><p><a class="reference internal" href="#method-ip-limit" id="id7">Method <code class="docutils literal notranslate"><span class="pre">ip_limit</span></code></a></p></li>
+<li><p><a class="reference internal" href="#method-link-token" id="id8">Method <code class="docutils literal notranslate"><span class="pre">link_token</span></code></a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#module-searx.botdetection.http_accept" id="id9">Probe HTTP headers</a></p>
+<ul>
+<li><p><a class="reference internal" href="#method-http-accept" id="id10">Method <code class="docutils literal notranslate"><span class="pre">http_accept</span></code></a></p></li>
+<li><p><a class="reference internal" href="#method-http-accept-encoding" id="id11">Method <code class="docutils literal notranslate"><span class="pre">http_accept_encoding</span></code></a></p></li>
+<li><p><a class="reference internal" href="#method-http-accept-language" id="id12">Method <code class="docutils literal notranslate"><span class="pre">http_accept_language</span></code></a></p></li>
+<li><p><a class="reference internal" href="#method-http-connection" id="id13">Method <code class="docutils literal notranslate"><span class="pre">http_connection</span></code></a></p></li>
+<li><p><a class="reference internal" href="#method-http-user-agent" id="id14">Method <code class="docutils literal notranslate"><span class="pre">http_user_agent</span></code></a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#module-searx.botdetection.config" id="id15">Config</a></p></li>
+</ul>
+</nav>
+<p id="botdetection-src"><span id="module-searx.botdetection"></span>Implementations used for bot detection.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.get_network">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.</span></span><span class="sig-name descname"><span class="pre">get_network</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">real_ip</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">IPv4Address</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">IPv6Address</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cfg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.botdetection.config.Config" title="searx.botdetection.config.Config"><span class="pre">config.Config</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">IPv4Network</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">IPv6Network</span></span></span><a class="reference internal" href="../_modules/searx/botdetection/_helpers.html#get_network"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.get_network" title="Link to this definition">¶</a></dt>
+<dd><p>Returns the (client) network of whether the real_ip is part of.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.get_real_ip">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.</span></span><span class="sig-name descname"><span class="pre">get_real_ip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request" title="(in Flask v3.0.x)"><span class="pre">Request</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/botdetection/_helpers.html#get_real_ip"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.get_real_ip" title="Link to this definition">¶</a></dt>
+<dd><p>Returns real IP of the request. Since not all proxies set all the HTTP
+headers and incoming headers can be faked it may happen that the IP cannot
+be determined correctly.</p>
+<aside class="sidebar">
+<p class="sidebar-title"><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request.remote_addr" title="(in Flask v3.0.x)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">flask.Request.remote_addr</span></code></a></p>
+<p>SearXNG uses Werkzeug’s <a class="reference external" href="https://werkzeug.palletsprojects.com/middleware/proxy_fix/">ProxyFix</a> (with it default <code class="docutils literal notranslate"><span class="pre">x_for=1</span></code>).</p>
+</aside>
+<p>This function tries to get the remote IP in the order listed below,
+additional some tests are done and if inconsistencies or errors are
+detected, they are logged.</p>
+<p>The remote IP of the request is taken from (first match):</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For">X-Forwarded-For</a> header</p></li>
+<li><p><a class="reference external" href="https://github.com/searxng/searxng/issues/1237#issuecomment-1147564516">X-real-IP header</a></p></li>
+<li><p><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request.remote_addr" title="(in Flask v3.0.x)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">flask.Request.remote_addr</span></code></a></p></li>
+</ul>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.too_many_requests">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.</span></span><span class="sig-name descname"><span class="pre">too_many_requests</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">network</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">IPv4Network</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">IPv6Network</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">log_msg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">werkzeug.Response</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../_modules/searx/botdetection/_helpers.html#too_many_requests"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.too_many_requests" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a HTTP 429 response object and writes a ERROR message to the
+‘botdetection’ logger. This function is used in part by the filter methods
+to return the default <code class="docutils literal notranslate"><span class="pre">Too</span> <span class="pre">Many</span> <span class="pre">Requests</span></code> response.</p>
+</dd></dl>
+
+<section id="module-searx.botdetection.ip_lists">
+<span id="ip-lists"></span><span id="botdetection-ip-lists"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">IP lists</a><a class="headerlink" href="#module-searx.botdetection.ip_lists" title="Link to this heading">¶</a></h2>
+<section id="method-ip-lists">
+<span id="id1"></span><h3><a class="toc-backref" href="#id5" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">ip_lists</span></code></a><a class="headerlink" href="#method-ip-lists" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">ip_lists</span></code> method implements IP <a class="reference internal" href="#searx.botdetection.ip_lists.block_ip" title="searx.botdetection.ip_lists.block_ip"><code class="xref py py-obj docutils literal notranslate"><span class="pre">block-</span></code></a> and
+<a class="reference internal" href="#searx.botdetection.ip_lists.pass_ip" title="searx.botdetection.ip_lists.pass_ip"><code class="xref py py-obj docutils literal notranslate"><span class="pre">pass-lists</span></code></a>.</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[botdetection.ip_lists]</span>
+
+<span class="n">pass_ip</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="s1">&#39;167.235.158.251&#39;</span><span class="p">,</span><span class="w"> </span><span class="c1"># IPv4 of check.searx.space</span>
+<span class="w"> </span><span class="s1">&#39;192.168.0.0/16&#39;</span><span class="p">,</span><span class="w"> </span><span class="c1"># IPv4 private network</span>
+<span class="w"> </span><span class="s1">&#39;fe80::/10&#39;</span><span class="w"> </span><span class="c1"># IPv6 linklocal</span>
+<span class="p">]</span>
+<span class="n">block_ip</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span>
+<span class="w"> </span><span class="s1">&#39;93.184.216.34&#39;</span><span class="p">,</span><span class="w"> </span><span class="c1"># IPv4 of example.org</span>
+<span class="w"> </span><span class="s1">&#39;257.1.1.1&#39;</span><span class="p">,</span><span class="w"> </span><span class="c1"># invalid IP --&gt; will be ignored, logged in ERROR class</span>
+<span class="p">]</span>
+</pre></div>
+</div>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.ip_lists.block_ip">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_lists.</span></span><span class="sig-name descname"><span class="pre">block_ip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">real_ip</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">IPv4Address</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">IPv6Address</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cfg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.botdetection.config.Config" title="searx.botdetection.config.Config"><span class="pre">config.Config</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Tuple</span><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../_modules/searx/botdetection/ip_lists.html#block_ip"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.ip_lists.block_ip" title="Link to this definition">¶</a></dt>
+<dd><p>Checks if the IP on the subnet is in one of the members of the
+<code class="docutils literal notranslate"><span class="pre">botdetection.ip_lists.block_ip</span></code> list.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.ip_lists.pass_ip">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_lists.</span></span><span class="sig-name descname"><span class="pre">pass_ip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">real_ip</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">IPv4Address</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">IPv6Address</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cfg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.botdetection.config.Config" title="searx.botdetection.config.Config"><span class="pre">config.Config</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Tuple</span><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../_modules/searx/botdetection/ip_lists.html#pass_ip"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.ip_lists.pass_ip" title="Link to this definition">¶</a></dt>
+<dd><p>Checks if the IP on the subnet is in one of the members of the
+<code class="docutils literal notranslate"><span class="pre">botdetection.ip_lists.pass_ip</span></code> list.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_lists.SEARXNG_ORG">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_lists.</span></span><span class="sig-name descname"><span class="pre">SEARXNG_ORG</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">['167.235.158.251',</span> <span class="pre">'2a01:04f8:1c1c:8fc2::/64']</span></em><a class="headerlink" href="#searx.botdetection.ip_lists.SEARXNG_ORG" title="Link to this definition">¶</a></dt>
+<dd><p>Passlist of IPs from the SearXNG organization, e.g. <cite>check.searx.space</cite>.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.botdetection.ip_limit">
+<span id="rate-limit"></span><span id="botdetection-rate-limit"></span><h2><a class="toc-backref" href="#id6" role="doc-backlink">Rate limit</a><a class="headerlink" href="#module-searx.botdetection.ip_limit" title="Link to this heading">¶</a></h2>
+<section id="method-ip-limit">
+<span id="botdetection-ip-limit"></span><h3><a class="toc-backref" href="#id7" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">ip_limit</span></code></a><a class="headerlink" href="#method-ip-limit" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">ip_limit</span></code> method counts request from an IP in <em>sliding windows</em>. If
+there are to many requests in a sliding window, the request is evaluated as a
+bot request. This method requires a redis DB and needs a HTTP <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For">X-Forwarded-For</a>
+header. To take privacy only the hash value of an IP is stored in the redis DB
+and at least for a maximum of 10 minutes.</p>
+<p>The <a class="reference internal" href="#module-searx.botdetection.link_token" title="searx.botdetection.link_token"><code class="xref py py-obj docutils literal notranslate"><span class="pre">link_token</span></code></a> method can be used to investigate whether a request is
+<em>suspicious</em>. To activate the <a class="reference internal" href="#module-searx.botdetection.link_token" title="searx.botdetection.link_token"><code class="xref py py-obj docutils literal notranslate"><span class="pre">link_token</span></code></a> method in the
+<a class="reference internal" href="#module-searx.botdetection.ip_limit" title="searx.botdetection.ip_limit"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ip_limit</span></code></a> method add the following configuration:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[botdetection.ip_limit]</span>
+<span class="n">link_token</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span>
+</pre></div>
+</div>
+<p>If the <a class="reference internal" href="#module-searx.botdetection.link_token" title="searx.botdetection.link_token"><code class="xref py py-obj docutils literal notranslate"><span class="pre">link_token</span></code></a> method is activated and a request is <em>suspicious</em>
+the request rates are reduced:</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.botdetection.ip_limit.BURST_MAX" title="searx.botdetection.ip_limit.BURST_MAX"><code class="xref py py-obj docutils literal notranslate"><span class="pre">BURST_MAX</span></code></a> -&gt; <a class="reference internal" href="#searx.botdetection.ip_limit.BURST_MAX_SUSPICIOUS" title="searx.botdetection.ip_limit.BURST_MAX_SUSPICIOUS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">BURST_MAX_SUSPICIOUS</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.botdetection.ip_limit.LONG_MAX" title="searx.botdetection.ip_limit.LONG_MAX"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LONG_MAX</span></code></a> -&gt; <a class="reference internal" href="#searx.botdetection.ip_limit.LONG_MAX_SUSPICIOUS" title="searx.botdetection.ip_limit.LONG_MAX_SUSPICIOUS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LONG_MAX_SUSPICIOUS</span></code></a></p></li>
+</ul>
+<p>To intercept bots that get their IPs from a range of IPs, there is a
+<a class="reference internal" href="#searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW" title="searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SUSPICIOUS_IP_WINDOW</span></code></a>. In this window the suspicious IPs are stored
+for a longer time. IPs stored in this sliding window have a maximum of
+<a class="reference internal" href="#searx.botdetection.ip_limit.SUSPICIOUS_IP_MAX" title="searx.botdetection.ip_limit.SUSPICIOUS_IP_MAX"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SUSPICIOUS_IP_MAX</span></code></a> accesses before they are blocked. As soon as the IP
+makes a request that is not suspicious, the sliding window for this IP is
+dropped.</p>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.API_MAX">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">API_MAX</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">4</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.API_MAX" title="Link to this definition">¶</a></dt>
+<dd><p>Maximum requests from one IP in the <a class="reference internal" href="#searx.botdetection.ip_limit.API_WONDOW" title="searx.botdetection.ip_limit.API_WONDOW"><code class="xref py py-obj docutils literal notranslate"><span class="pre">API_WONDOW</span></code></a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.API_WONDOW">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">API_WONDOW</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">3600</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.API_WONDOW" title="Link to this definition">¶</a></dt>
+<dd><p>Time (sec) before sliding window for API requests (format != html) expires.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.BURST_MAX">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">BURST_MAX</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">15</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.BURST_MAX" title="Link to this definition">¶</a></dt>
+<dd><p>Maximum requests from one IP in the <a class="reference internal" href="#searx.botdetection.ip_limit.BURST_WINDOW" title="searx.botdetection.ip_limit.BURST_WINDOW"><code class="xref py py-obj docutils literal notranslate"><span class="pre">BURST_WINDOW</span></code></a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.BURST_MAX_SUSPICIOUS">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">BURST_MAX_SUSPICIOUS</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">2</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.BURST_MAX_SUSPICIOUS" title="Link to this definition">¶</a></dt>
+<dd><p>Maximum of suspicious requests from one IP in the <a class="reference internal" href="#searx.botdetection.ip_limit.BURST_WINDOW" title="searx.botdetection.ip_limit.BURST_WINDOW"><code class="xref py py-obj docutils literal notranslate"><span class="pre">BURST_WINDOW</span></code></a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.BURST_WINDOW">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">BURST_WINDOW</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">20</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.BURST_WINDOW" title="Link to this definition">¶</a></dt>
+<dd><p>Time (sec) before sliding window for <em>burst</em> requests expires.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.LONG_MAX">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">LONG_MAX</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">150</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.LONG_MAX" title="Link to this definition">¶</a></dt>
+<dd><p>Maximum requests from one IP in the <a class="reference internal" href="#searx.botdetection.ip_limit.LONG_WINDOW" title="searx.botdetection.ip_limit.LONG_WINDOW"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LONG_WINDOW</span></code></a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.LONG_MAX_SUSPICIOUS">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">LONG_MAX_SUSPICIOUS</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">10</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.LONG_MAX_SUSPICIOUS" title="Link to this definition">¶</a></dt>
+<dd><p>Maximum suspicious requests from one IP in the <a class="reference internal" href="#searx.botdetection.ip_limit.LONG_WINDOW" title="searx.botdetection.ip_limit.LONG_WINDOW"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LONG_WINDOW</span></code></a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.LONG_WINDOW">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">LONG_WINDOW</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">600</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.LONG_WINDOW" title="Link to this definition">¶</a></dt>
+<dd><p>Time (sec) before the longer sliding window expires.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.SUSPICIOUS_IP_MAX">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">SUSPICIOUS_IP_MAX</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">3</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.SUSPICIOUS_IP_MAX" title="Link to this definition">¶</a></dt>
+<dd><p>Maximum requests from one suspicious IP in the <a class="reference internal" href="#searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW" title="searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SUSPICIOUS_IP_WINDOW</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.ip_limit.</span></span><span class="sig-name descname"><span class="pre">SUSPICIOUS_IP_WINDOW</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">2592000</span></em><a class="headerlink" href="#searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW" title="Link to this definition">¶</a></dt>
+<dd><p>Time (sec) before sliding window for one suspicious IP expires.</p>
+</dd></dl>
+
+<section id="method-link-token">
+<span id="module-searx.botdetection.link_token"></span><h3><a class="toc-backref" href="#id8" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">link_token</span></code></a><a class="headerlink" href="#method-link-token" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">link_token</span></code> method evaluates a request as <a class="reference internal" href="#searx.botdetection.link_token.is_suspicious" title="searx.botdetection.link_token.is_suspicious"><code class="xref py py-obj docutils literal notranslate"><span class="pre">suspicious</span></code></a> if the URL <code class="docutils literal notranslate"><span class="pre">/client&lt;token&gt;.css</span></code> is not requested by the
+client. By adding a random component (the token) in the URL, a bot can not send
+a ping by request a static URL.</p>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>This method requires a redis DB and needs a HTTP <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For">X-Forwarded-For</a> header.</p>
+</div>
+<p>To get in use of this method a flask URL route needs to be added:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s1">&#39;/client&lt;token&gt;.css&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="s1">&#39;POST&#39;</span><span class="p">])</span>
+<span class="k">def</span> <span class="nf">client_token</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">link_token</span><span class="o">.</span><span class="n">ping</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">token</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">mimetype</span><span class="o">=</span><span class="s1">&#39;text/css&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>And in the HTML template from flask a stylesheet link is needed (the value of
+<code class="docutils literal notranslate"><span class="pre">link_token</span></code> comes from <a class="reference internal" href="#searx.botdetection.link_token.get_token" title="searx.botdetection.link_token.get_token"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_token</span></code></a>):</p>
+<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span>
+ <span class="na">href</span><span class="o">=</span><span class="s">&quot;{{ url_for(&#39;client_token&#39;, token=link_token) }}&quot;</span>
+ <span class="na">type</span><span class="o">=</span><span class="s">&quot;text/css&quot;</span> <span class="p">/&gt;</span>
+</pre></div>
+</div>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.get_ping_key">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">get_ping_key</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">network</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">IPv4Network</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">IPv6Network</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request" title="(in Flask v3.0.x)"><span class="pre">flask.Request</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/botdetection/link_token.html#get_ping_key"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.link_token.get_ping_key" title="Link to this definition">¶</a></dt>
+<dd><p>Generates a hashed key that fits (more or less) to a <em>WEB-browser
+session</em> in a network.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.get_token">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">get_token</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/botdetection/link_token.html#get_token"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.link_token.get_token" title="Link to this definition">¶</a></dt>
+<dd><p>Returns current token. If there is no currently active token a new token
+is generated randomly and stored in the redis DB.</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="#searx.botdetection.link_token.TOKEN_LIVE_TIME" title="searx.botdetection.link_token.TOKEN_LIVE_TIME"><code class="xref py py-obj docutils literal notranslate"><span class="pre">TOKEN_LIVE_TIME</span></code></a></p></li>
+<li><p><a class="reference internal" href="#searx.botdetection.link_token.TOKEN_KEY" title="searx.botdetection.link_token.TOKEN_KEY"><code class="xref py py-obj docutils literal notranslate"><span class="pre">TOKEN_KEY</span></code></a></p></li>
+</ul>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.is_suspicious">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">is_suspicious</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">network</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">IPv4Network</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">IPv6Network</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request" title="(in Flask v3.0.x)"><span class="pre">flask.Request</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">renew</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/link_token.html#is_suspicious"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.link_token.is_suspicious" title="Link to this definition">¶</a></dt>
+<dd><p>Checks whether a valid ping is exists for this (client) network, if not
+this request is rated as <em>suspicious</em>. If a valid ping exists and argument
+<code class="docutils literal notranslate"><span class="pre">renew</span></code> is <code class="docutils literal notranslate"><span class="pre">True</span></code> the expire time of this ping is reset to
+<a class="reference internal" href="#searx.botdetection.link_token.PING_LIVE_TIME" title="searx.botdetection.link_token.PING_LIVE_TIME"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PING_LIVE_TIME</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.ping">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">ping</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request" title="(in Flask v3.0.x)"><span class="pre">Request</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">token</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/link_token.html#ping"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.link_token.ping" title="Link to this definition">¶</a></dt>
+<dd><p>This function is called by a request to URL <code class="docutils literal notranslate"><span class="pre">/client&lt;token&gt;.css</span></code>. If
+<code class="docutils literal notranslate"><span class="pre">token</span></code> is valid a <a class="reference internal" href="#searx.botdetection.link_token.PING_KEY" title="searx.botdetection.link_token.PING_KEY"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PING_KEY</span></code></a> for the client is stored in the DB.
+The expire time of this ping-key is <a class="reference internal" href="#searx.botdetection.link_token.PING_LIVE_TIME" title="searx.botdetection.link_token.PING_LIVE_TIME"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PING_LIVE_TIME</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.PING_KEY">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">PING_KEY</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'SearXNG_limiter.ping'</span></em><a class="headerlink" href="#searx.botdetection.link_token.PING_KEY" title="Link to this definition">¶</a></dt>
+<dd><p>Prefix of all ping-keys generated by <a class="reference internal" href="#searx.botdetection.link_token.get_ping_key" title="searx.botdetection.link_token.get_ping_key"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_ping_key</span></code></a></p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.PING_LIVE_TIME">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">PING_LIVE_TIME</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">3600</span></em><a class="headerlink" href="#searx.botdetection.link_token.PING_LIVE_TIME" title="Link to this definition">¶</a></dt>
+<dd><p>Livetime (sec) of the ping-key from a client (request)</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.TOKEN_KEY">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">TOKEN_KEY</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'SearXNG_limiter.token'</span></em><a class="headerlink" href="#searx.botdetection.link_token.TOKEN_KEY" title="Link to this definition">¶</a></dt>
+<dd><p>Key for which the current token is stored in the DB</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.link_token.TOKEN_LIVE_TIME">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.link_token.</span></span><span class="sig-name descname"><span class="pre">TOKEN_LIVE_TIME</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">600</span></em><a class="headerlink" href="#searx.botdetection.link_token.TOKEN_LIVE_TIME" title="Link to this definition">¶</a></dt>
+<dd><p>Livetime (sec) of limiter’s CSS token.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.botdetection.http_accept">
+<span id="probe-http-headers"></span><span id="botdetection-probe-headers"></span><h2><a class="toc-backref" href="#id9" role="doc-backlink">Probe HTTP headers</a><a class="headerlink" href="#module-searx.botdetection.http_accept" title="Link to this heading">¶</a></h2>
+<section id="method-http-accept">
+<h3><a class="toc-backref" href="#id10" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">http_accept</span></code></a><a class="headerlink" href="#method-http-accept" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">http_accept</span></code> method evaluates a request as the request of a bot if the
+<a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept">Accept</a> header ..</p>
+<ul class="simple">
+<li><p>did not contain <code class="docutils literal notranslate"><span class="pre">text/html</span></code></p></li>
+</ul>
+</section>
+<section id="method-http-accept-encoding">
+<span id="module-searx.botdetection.http_accept_encoding"></span><h3><a class="toc-backref" href="#id11" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">http_accept_encoding</span></code></a><a class="headerlink" href="#method-http-accept-encoding" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">http_accept_encoding</span></code> method evaluates a request as the request of a
+bot if the <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding">Accept-Encoding</a> header ..</p>
+<ul class="simple">
+<li><p>did not contain <code class="docutils literal notranslate"><span class="pre">gzip</span></code> AND <code class="docutils literal notranslate"><span class="pre">deflate</span></code> (if both values are missed)</p></li>
+<li><p>did not contain <code class="docutils literal notranslate"><span class="pre">text/html</span></code></p></li>
+</ul>
+</section>
+<section id="method-http-accept-language">
+<span id="module-searx.botdetection.http_accept_language"></span><h3><a class="toc-backref" href="#id12" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">http_accept_language</span></code></a><a class="headerlink" href="#method-http-accept-language" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">http_accept_language</span></code> method evaluates a request as the request of a bot
+if the <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent">Accept-Language</a> header is unset.</p>
+</section>
+<section id="method-http-connection">
+<span id="module-searx.botdetection.http_connection"></span><h3><a class="toc-backref" href="#id13" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">http_connection</span></code></a><a class="headerlink" href="#method-http-connection" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">http_connection</span></code> method evaluates a request as the request of a bot if
+the <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection">Connection</a> header is set to <code class="docutils literal notranslate"><span class="pre">close</span></code>.</p>
+</section>
+<section id="method-http-user-agent">
+<span id="module-searx.botdetection.http_user_agent"></span><h3><a class="toc-backref" href="#id14" role="doc-backlink">Method <code class="docutils literal notranslate"><span class="pre">http_user_agent</span></code></a><a class="headerlink" href="#method-http-user-agent" title="Link to this heading">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">http_user_agent</span></code> method evaluates a request as the request of a bot if
+the <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent">User-Agent</a> header is unset or matches the regular expression
+<a class="reference internal" href="#searx.botdetection.http_user_agent.USER_AGENT" title="searx.botdetection.http_user_agent.USER_AGENT"><code class="xref py py-obj docutils literal notranslate"><span class="pre">USER_AGENT</span></code></a>.</p>
+</section>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.botdetection.http_user_agent.USER_AGENT">
+<span class="sig-prename descclassname"><span class="pre">searx.botdetection.http_user_agent.</span></span><span class="sig-name descname"><span class="pre">USER_AGENT</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'(unknown|[Cc][Uu][Rr][Ll]|[wW]get|Scrapy|splash|JavaFX|FeedFetcher|python-requests|Go-http-client|Java|Jakarta|okhttp|HttpClient|Jersey|Python|libwww-perl|Ruby|SynHttpClient|UniversalFeedParser|Googlebot|GoogleImageProxy|bingbot|Baiduspider|yacybot|YandexMobileBot|YandexBot|Yahoo!</span> <span class="pre">Slurp|MJ12bot|AhrefsBot|archive.org_bot|msnbot|MJ12bot|SeznamBot|linkdexbot|Netvibes|SMTBot|zgrab|James</span> <span class="pre">BOT|Sogou|Abonti|Pixray|Spinn3r|SemrushBot|Exabot|ZmEu|BLEXBot|bitlybot|HeadlessChrome|Mozilla/5\\.0\\</span> <span class="pre">\\(compatible;\\</span> <span class="pre">Farside/0\\.1\\.0;\\</span> <span class="pre">\\+https://farside\\.link\\)|.*PetalBot.*)'</span></em><a class="headerlink" href="#searx.botdetection.http_user_agent.USER_AGENT" title="Link to this definition">¶</a></dt>
+<dd><p>Regular expression that matches to <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent">User-Agent</a> from known <em>bots</em></p>
+</dd></dl>
+
+</section>
+<section id="module-searx.botdetection.config">
+<span id="config"></span><span id="botdetection-config"></span><h2><a class="toc-backref" href="#id15" role="doc-backlink">Config</a><a class="headerlink" href="#module-searx.botdetection.config" title="Link to this heading">¶</a></h2>
+<p>Configuration class <a class="reference internal" href="#searx.botdetection.config.Config" title="searx.botdetection.config.Config"><code class="xref py py-class docutils literal notranslate"><span class="pre">Config</span></code></a> with deep-update, schema validation
+and deprecated names.</p>
+<p>The <a class="reference internal" href="#searx.botdetection.config.Config" title="searx.botdetection.config.Config"><code class="xref py py-class docutils literal notranslate"><span class="pre">Config</span></code></a> class implements a configuration that is based on
+structured dictionaries. The configuration schema is defined in a dictionary
+structure and the configuration data is given in a dictionary structure.</p>
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.botdetection.config.SchemaIssue">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.botdetection.config.</span></span><span class="sig-name descname"><span class="pre">SchemaIssue</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">level</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Literal" title="(in Python v3.12)"><span class="pre">Literal</span></a><span class="p"><span class="pre">[</span></span><span class="s"><span class="pre">'warn'</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="s"><span class="pre">'invalid'</span></span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">msg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#SchemaIssue"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.SchemaIssue" title="Link to this definition">¶</a></dt>
+<dd><p>Exception to store and/or raise a message from a schema issue.</p>
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.botdetection.config.</span></span><span class="sig-name descname"><span class="pre">Config</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cfg_schema</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">deprecated</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config" title="Link to this definition">¶</a></dt>
+<dd><p>Base class used for configuration</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config.default">
+<span class="sig-name descname"><span class="pre">default</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config.default"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config.default" title="Link to this definition">¶</a></dt>
+<dd><p>Returns default value of field <code class="docutils literal notranslate"><span class="pre">name</span></code> in <code class="docutils literal notranslate"><span class="pre">self.cfg_schema</span></code>.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config.get">
+<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name:</span> <span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default:</span> <span class="pre">~typing.Any</span> <span class="pre">=</span> <span class="pre">&lt;UNSET&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">replace:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a></span></span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config.get"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config.get" title="Link to this definition">¶</a></dt>
+<dd><p>Returns the value to which <code class="docutils literal notranslate"><span class="pre">name</span></code> points in the configuration.</p>
+<p>If there is no such <code class="docutils literal notranslate"><span class="pre">name</span></code> in the config and the <code class="docutils literal notranslate"><span class="pre">default</span></code> is
+<code class="xref py py-obj docutils literal notranslate"><span class="pre">UNSET</span></code>, a <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#KeyError" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">KeyError</span></code></a> is raised.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config.path">
+<span class="sig-name descname"><span class="pre">path</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name:</span> <span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default=&lt;UNSET&gt;</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config.path"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config.path" title="Link to this definition">¶</a></dt>
+<dd><p>Get a <a class="reference external" href="https://docs.python.org/3/library/pathlib.html#pathlib.Path" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">pathlib.Path</span></code></a> object from a config string.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config.pyobj">
+<span class="sig-name descname"><span class="pre">pyobj</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default=&lt;UNSET&gt;</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config.pyobj"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config.pyobj" title="Link to this definition">¶</a></dt>
+<dd><p>Get python object refered by full qualiffied name (FQN) in the config
+string.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config.set">
+<span class="sig-name descname"><span class="pre">set</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">val</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config.set"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config.set" title="Link to this definition">¶</a></dt>
+<dd><p>Set the value to which <code class="docutils literal notranslate"><span class="pre">name</span></code> points in the configuration.</p>
+<p>If there is no such <code class="docutils literal notranslate"><span class="pre">name</span></code> in the config, a <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#KeyError" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">KeyError</span></code></a> is
+raised.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config.update">
+<span class="sig-name descname"><span class="pre">update</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">upd_cfg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><span class="pre">dict</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config.update"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config.update" title="Link to this definition">¶</a></dt>
+<dd><p>Update this configuration by <code class="docutils literal notranslate"><span class="pre">upd_cfg</span></code>.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.botdetection.config.Config.validate">
+<span class="sig-name descname"><span class="pre">validate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cfg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.12)"><span class="pre">dict</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/botdetection/config.html#Config.validate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.botdetection.config.Config.validate" title="Link to this definition">¶</a></dt>
+<dd><p>Validation of dictionary <code class="docutils literal notranslate"><span class="pre">cfg</span></code> on <code class="xref py py-obj docutils literal notranslate"><span class="pre">Config.SCHEMA</span></code>.
+Validation is done by <a class="reference internal" href="#searx.botdetection.config.Config.validate" title="searx.botdetection.config.Config.validate"><code class="xref py py-obj docutils literal notranslate"><span class="pre">validate</span></code></a>.</p>
+</dd></dl>
+
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Bot Detection</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.botdetection.get_network"><code class="docutils literal notranslate"><span class="pre">get_network()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.botdetection.get_real_ip"><code class="docutils literal notranslate"><span class="pre">get_real_ip()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.botdetection.too_many_requests"><code class="docutils literal notranslate"><span class="pre">too_many_requests()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.botdetection.ip_lists">IP lists</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#method-ip-lists">Method <code class="docutils literal notranslate"><span class="pre">ip_lists</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_lists.block_ip"><code class="docutils literal notranslate"><span class="pre">block_ip()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_lists.pass_ip"><code class="docutils literal notranslate"><span class="pre">pass_ip()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_lists.SEARXNG_ORG"><code class="docutils literal notranslate"><span class="pre">SEARXNG_ORG</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.botdetection.ip_limit">Rate limit</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#method-ip-limit">Method <code class="docutils literal notranslate"><span class="pre">ip_limit</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.API_MAX"><code class="docutils literal notranslate"><span class="pre">API_MAX</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.API_WONDOW"><code class="docutils literal notranslate"><span class="pre">API_WONDOW</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.BURST_MAX"><code class="docutils literal notranslate"><span class="pre">BURST_MAX</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.BURST_MAX_SUSPICIOUS"><code class="docutils literal notranslate"><span class="pre">BURST_MAX_SUSPICIOUS</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.BURST_WINDOW"><code class="docutils literal notranslate"><span class="pre">BURST_WINDOW</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.LONG_MAX"><code class="docutils literal notranslate"><span class="pre">LONG_MAX</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.LONG_MAX_SUSPICIOUS"><code class="docutils literal notranslate"><span class="pre">LONG_MAX_SUSPICIOUS</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.LONG_WINDOW"><code class="docutils literal notranslate"><span class="pre">LONG_WINDOW</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.SUSPICIOUS_IP_MAX"><code class="docutils literal notranslate"><span class="pre">SUSPICIOUS_IP_MAX</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.ip_limit.SUSPICIOUS_IP_WINDOW"><code class="docutils literal notranslate"><span class="pre">SUSPICIOUS_IP_WINDOW</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#method-link-token">Method <code class="docutils literal notranslate"><span class="pre">link_token</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.get_ping_key"><code class="docutils literal notranslate"><span class="pre">get_ping_key()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.get_token"><code class="docutils literal notranslate"><span class="pre">get_token()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.is_suspicious"><code class="docutils literal notranslate"><span class="pre">is_suspicious()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.ping"><code class="docutils literal notranslate"><span class="pre">ping()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.PING_KEY"><code class="docutils literal notranslate"><span class="pre">PING_KEY</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.PING_LIVE_TIME"><code class="docutils literal notranslate"><span class="pre">PING_LIVE_TIME</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.TOKEN_KEY"><code class="docutils literal notranslate"><span class="pre">TOKEN_KEY</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.link_token.TOKEN_LIVE_TIME"><code class="docutils literal notranslate"><span class="pre">TOKEN_LIVE_TIME</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.botdetection.http_accept">Probe HTTP headers</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#method-http-accept">Method <code class="docutils literal notranslate"><span class="pre">http_accept</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#method-http-accept-encoding">Method <code class="docutils literal notranslate"><span class="pre">http_accept_encoding</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#method-http-accept-language">Method <code class="docutils literal notranslate"><span class="pre">http_accept_language</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#method-http-connection">Method <code class="docutils literal notranslate"><span class="pre">http_connection</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#method-http-user-agent">Method <code class="docutils literal notranslate"><span class="pre">http_user_agent</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.http_user_agent.USER_AGENT"><code class="docutils literal notranslate"><span class="pre">USER_AGENT</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.botdetection.config">Config</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.config.SchemaIssue"><code class="docutils literal notranslate"><span class="pre">SchemaIssue</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.botdetection.config.Config"><code class="docutils literal notranslate"><span class="pre">Config</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.botdetection.config.Config.default"><code class="docutils literal notranslate"><span class="pre">Config.default()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.botdetection.config.Config.get"><code class="docutils literal notranslate"><span class="pre">Config.get()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.botdetection.config.Config.path"><code class="docutils literal notranslate"><span class="pre">Config.path()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.botdetection.config.Config.pyobj"><code class="docutils literal notranslate"><span class="pre">Config.pyobj()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.botdetection.config.Config.set"><code class="docutils literal notranslate"><span class="pre">Config.set()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.botdetection.config.Config.update"><code class="docutils literal notranslate"><span class="pre">Config.update()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#searx.botdetection.config.Config.validate"><code class="docutils literal notranslate"><span class="pre">Config.validate()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.babel_extract.html" title="previous chapter">Custom message extractor (i18n)</a>
+ <li>Next: <a href="searx.exceptions.html" title="next chapter">SearXNG Exceptions</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.botdetection.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.exceptions.html b/src/searx.exceptions.html
new file mode 100644
index 000000000..bb5884d06
--- /dev/null
+++ b/src/searx.exceptions.html
@@ -0,0 +1,249 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>SearXNG Exceptions &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Online /info" href="searx.infopage.html" />
+ <link rel="prev" title="Bot Detection" href="searx.botdetection.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.infopage.html" title="Online /info"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.botdetection.html" title="Bot Detection"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">SearXNG Exceptions</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="module-searx.exceptions">
+<span id="searxng-exceptions"></span><span id="searx-exceptions"></span><h1>SearXNG Exceptions<a class="headerlink" href="#module-searx.exceptions" title="Link to this heading">¶</a></h1>
+<p>Exception types raised by SearXNG modules.</p>
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineAPIException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxEngineAPIException</span></span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxEngineAPIException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxEngineAPIException" title="Link to this definition">¶</a></dt>
+<dd><p>The website has returned an application error</p>
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineAccessDeniedException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxEngineAccessDeniedException</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">suspended_time</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">message</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'Access</span> <span class="pre">denied'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxEngineAccessDeniedException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxEngineAccessDeniedException" title="Link to this definition">¶</a></dt>
+<dd><p>The website is blocking the access</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineAccessDeniedException.SUSPEND_TIME_SETTING">
+<span class="sig-name descname"><span class="pre">SUSPEND_TIME_SETTING</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'search.suspended_times.SearxEngineAccessDenied'</span></em><a class="headerlink" href="#searx.exceptions.SearxEngineAccessDeniedException.SUSPEND_TIME_SETTING" title="Link to this definition">¶</a></dt>
+<dd><p>This settings contains the default suspended time (default 86400 sec / 1
+day).</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineCaptchaException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxEngineCaptchaException</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">suspended_time</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">message</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'CAPTCHA'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxEngineCaptchaException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxEngineCaptchaException" title="Link to this definition">¶</a></dt>
+<dd><p>The website has returned a CAPTCHA.</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineCaptchaException.SUSPEND_TIME_SETTING">
+<span class="sig-name descname"><span class="pre">SUSPEND_TIME_SETTING</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'search.suspended_times.SearxEngineCaptcha'</span></em><a class="headerlink" href="#searx.exceptions.SearxEngineCaptchaException.SUSPEND_TIME_SETTING" title="Link to this definition">¶</a></dt>
+<dd><p>This settings contains the default suspended time (default 86400 sec / 1
+day).</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxEngineException</span></span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxEngineException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxEngineException" title="Link to this definition">¶</a></dt>
+<dd><p>Error inside an engine</p>
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineResponseException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxEngineResponseException</span></span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxEngineResponseException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxEngineResponseException" title="Link to this definition">¶</a></dt>
+<dd><p>Impossible to parse the result of an engine</p>
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineTooManyRequestsException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxEngineTooManyRequestsException</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">suspended_time</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">message</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'Too</span> <span class="pre">many</span> <span class="pre">request'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxEngineTooManyRequestsException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxEngineTooManyRequestsException" title="Link to this definition">¶</a></dt>
+<dd><p>The website has returned a Too Many Request status code</p>
+<p>By default, searx stops sending requests to this engine for 1 hour.</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineTooManyRequestsException.SUSPEND_TIME_SETTING">
+<span class="sig-name descname"><span class="pre">SUSPEND_TIME_SETTING</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'search.suspended_times.SearxEngineTooManyRequests'</span></em><a class="headerlink" href="#searx.exceptions.SearxEngineTooManyRequestsException.SUSPEND_TIME_SETTING" title="Link to this definition">¶</a></dt>
+<dd><p>This settings contains the default suspended time (default 3660 sec / 1
+hour).</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxEngineXPathException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxEngineXPathException</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">xpath_spec</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">message</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxEngineXPathException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxEngineXPathException" title="Link to this definition">¶</a></dt>
+<dd><p>Error while getting the result of an XPath expression</p>
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxException</span></span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxException" title="Link to this definition">¶</a></dt>
+<dd><p>Base SearXNG exception.</p>
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxParameterException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxParameterException</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxParameterException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxParameterException" title="Link to this definition">¶</a></dt>
+<dd><p>Raised when query miss a required parameter</p>
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxSettingsException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxSettingsException</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">message</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#Exception" title="(in Python v3.12)"><span class="pre">Exception</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxSettingsException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxSettingsException" title="Link to this definition">¶</a></dt>
+<dd><p>Error while loading the settings</p>
+</dd></dl>
+
+<dl class="py exception">
+<dt class="sig sig-object py" id="searx.exceptions.SearxXPathSyntaxException">
+<em class="property"><span class="pre">exception</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.exceptions.</span></span><span class="sig-name descname"><span class="pre">SearxXPathSyntaxException</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">xpath_spec</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">message</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/exceptions.html#SearxXPathSyntaxException"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.exceptions.SearxXPathSyntaxException" title="Link to this definition">¶</a></dt>
+<dd><p>Syntax error in a XPATH</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">SearXNG Exceptions</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxEngineAPIException"><code class="docutils literal notranslate"><span class="pre">SearxEngineAPIException</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxEngineAccessDeniedException"><code class="docutils literal notranslate"><span class="pre">SearxEngineAccessDeniedException</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.exceptions.SearxEngineAccessDeniedException.SUSPEND_TIME_SETTING"><code class="docutils literal notranslate"><span class="pre">SearxEngineAccessDeniedException.SUSPEND_TIME_SETTING</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxEngineCaptchaException"><code class="docutils literal notranslate"><span class="pre">SearxEngineCaptchaException</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.exceptions.SearxEngineCaptchaException.SUSPEND_TIME_SETTING"><code class="docutils literal notranslate"><span class="pre">SearxEngineCaptchaException.SUSPEND_TIME_SETTING</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxEngineException"><code class="docutils literal notranslate"><span class="pre">SearxEngineException</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxEngineResponseException"><code class="docutils literal notranslate"><span class="pre">SearxEngineResponseException</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxEngineTooManyRequestsException"><code class="docutils literal notranslate"><span class="pre">SearxEngineTooManyRequestsException</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.exceptions.SearxEngineTooManyRequestsException.SUSPEND_TIME_SETTING"><code class="docutils literal notranslate"><span class="pre">SearxEngineTooManyRequestsException.SUSPEND_TIME_SETTING</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxEngineXPathException"><code class="docutils literal notranslate"><span class="pre">SearxEngineXPathException</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxException"><code class="docutils literal notranslate"><span class="pre">SearxException</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxParameterException"><code class="docutils literal notranslate"><span class="pre">SearxParameterException</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxSettingsException"><code class="docutils literal notranslate"><span class="pre">SearxSettingsException</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.exceptions.SearxXPathSyntaxException"><code class="docutils literal notranslate"><span class="pre">SearxXPathSyntaxException</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.botdetection.html" title="previous chapter">Bot Detection</a>
+ <li>Next: <a href="searx.infopage.html" title="next chapter">Online <code class="docutils literal notranslate"><span class="pre">/info</span></code></a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.exceptions.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.infopage.html b/src/searx.infopage.html
new file mode 100644
index 000000000..d7bc3090a
--- /dev/null
+++ b/src/searx.infopage.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Online /info &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Locales" href="searx.locales.html" />
+ <link rel="prev" title="SearXNG Exceptions" href="searx.exceptions.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.locales.html" title="Locales"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.exceptions.html" title="SearXNG Exceptions"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Online <code class="docutils literal notranslate"><span class="pre">/info</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="module-searx.infopage">
+<span id="online-info"></span><span id="searx-infopage"></span><h1>Online <code class="docutils literal notranslate"><span class="pre">/info</span></code><a class="headerlink" href="#module-searx.infopage" title="Link to this heading">¶</a></h1>
+<p>Render SearXNG instance documentation.</p>
+<p>Usage in a Flask app route:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">infopage</span>
+
+<span class="n">_INFO_PAGES</span> <span class="o">=</span> <span class="n">infopage</span><span class="o">.</span><span class="n">InfoPageSet</span><span class="p">(</span><span class="n">infopage</span><span class="o">.</span><span class="n">MistletoePage</span><span class="p">)</span>
+
+<span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s1">&#39;/info/&lt;pagename&gt;&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;GET&#39;</span><span class="p">])</span>
+<span class="k">def</span> <span class="nf">info</span><span class="p">(</span><span class="n">pagename</span><span class="p">):</span>
+
+ <span class="n">locale</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">preferences</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="s1">&#39;locale&#39;</span><span class="p">)</span>
+ <span class="n">page</span> <span class="o">=</span> <span class="n">_INFO_PAGES</span><span class="o">.</span><span class="n">get_page</span><span class="p">(</span><span class="n">pagename</span><span class="p">,</span> <span class="n">locale</span><span class="p">)</span>
+</pre></div>
+</div>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.infopage.InfoPage">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.infopage.</span></span><span class="sig-name descname"><span class="pre">InfoPage</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fname</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/infopage.html#InfoPage"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.infopage.InfoPage" title="Link to this definition">¶</a></dt>
+<dd><p>A page of the <a class="reference internal" href="#searx.infopage.InfoPageSet" title="searx.infopage.InfoPageSet"><code class="xref py py-obj docutils literal notranslate"><span class="pre">online</span> <span class="pre">documentation</span></code></a>.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.infopage.InfoPage.get_ctx">
+<span class="sig-name descname"><span class="pre">get_ctx</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/infopage.html#InfoPage.get_ctx"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.infopage.InfoPage.get_ctx" title="Link to this definition">¶</a></dt>
+<dd><p>Jinja context to render <a class="reference internal" href="#searx.infopage.InfoPage.content" title="searx.infopage.InfoPage.content"><code class="xref py py-obj docutils literal notranslate"><span class="pre">InfoPage.content</span></code></a></p>
+</dd></dl>
+
+<dl class="py property">
+<dt class="sig sig-object py" id="searx.infopage.InfoPage.content">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">content</span></span><a class="headerlink" href="#searx.infopage.InfoPage.content" title="Link to this definition">¶</a></dt>
+<dd><p>Content of the page (rendered in a Jinja context)</p>
+</dd></dl>
+
+<dl class="py property">
+<dt class="sig sig-object py" id="searx.infopage.InfoPage.html">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">html</span></span><a class="headerlink" href="#searx.infopage.InfoPage.html" title="Link to this definition">¶</a></dt>
+<dd><p>Render Markdown (<a class="reference external" href="https://commonmark.org/">CommonMark</a>) to HTML by using <a class="reference external" href="https://github.com/executablebooks/markdown-it-py">markdown-it-py</a>.</p>
+</dd></dl>
+
+<dl class="py property">
+<dt class="sig sig-object py" id="searx.infopage.InfoPage.raw_content">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">raw_content</span></span><a class="headerlink" href="#searx.infopage.InfoPage.raw_content" title="Link to this definition">¶</a></dt>
+<dd><p>Raw content of the page (without any jinja rendering)</p>
+</dd></dl>
+
+<dl class="py property">
+<dt class="sig sig-object py" id="searx.infopage.InfoPage.title">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">title</span></span><a class="headerlink" href="#searx.infopage.InfoPage.title" title="Link to this definition">¶</a></dt>
+<dd><p>Title of the content (without any markup)</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.infopage.InfoPageSet">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.infopage.</span></span><span class="sig-name descname"><span class="pre">InfoPageSet</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">page_class</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Type" title="(in Python v3.12)"><span class="pre">Type</span></a><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#searx.infopage.InfoPage" title="searx.infopage.InfoPage"><span class="pre">InfoPage</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">info_folder</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/infopage.html#InfoPageSet"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.infopage.InfoPageSet" title="Link to this definition">¶</a></dt>
+<dd><p>Cached rendering of the online documentation a SearXNG instance has.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>page_class</strong> (<a class="reference internal" href="#searx.infopage.InfoPage" title="searx.infopage.InfoPage"><code class="xref py py-obj docutils literal notranslate"><span class="pre">InfoPage</span></code></a>) – render online documentation by <a class="reference internal" href="#searx.infopage.InfoPage" title="searx.infopage.InfoPage"><code class="xref py py-obj docutils literal notranslate"><span class="pre">InfoPage</span></code></a> parser.</p></li>
+<li><p><strong>info_folder</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – information directory</p></li>
+</ul>
+</dd>
+</dl>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.infopage.InfoPageSet.get_page">
+<span class="sig-name descname"><span class="pre">get_page</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">pagename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/infopage.html#InfoPageSet.get_page"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.infopage.InfoPageSet.get_page" title="Link to this definition">¶</a></dt>
+<dd><p>Return <code class="docutils literal notranslate"><span class="pre">pagename</span></code> instance of <a class="reference internal" href="#searx.infopage.InfoPage" title="searx.infopage.InfoPage"><code class="xref py py-obj docutils literal notranslate"><span class="pre">InfoPage</span></code></a></p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>pagename</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – name of the page, a value from <a class="reference internal" href="#searx.infopage.InfoPageSet.toc" title="searx.infopage.InfoPageSet.toc"><code class="xref py py-obj docutils literal notranslate"><span class="pre">InfoPageSet.toc</span></code></a></p></li>
+<li><p><strong>locale</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – language of the page, e.g. <code class="docutils literal notranslate"><span class="pre">en</span></code>, <code class="docutils literal notranslate"><span class="pre">zh_Hans_CN</span></code>
+(default: <code class="xref py py-obj docutils literal notranslate"><span class="pre">InfoPageSet.i18n_origin</span></code>)</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.infopage.InfoPageSet.iter_pages">
+<span class="sig-name descname"><span class="pre">iter_pages</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fallback_to_default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/infopage.html#InfoPageSet.iter_pages"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.infopage.InfoPageSet.iter_pages" title="Link to this definition">¶</a></dt>
+<dd><p>Iterate over all pages of the TOC</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.infopage.InfoPageSet.folder">
+<span class="sig-name descname"><span class="pre">folder</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.infopage.InfoPageSet.folder" title="Link to this definition">¶</a></dt>
+<dd><p>location of the Markdown files</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.infopage.InfoPageSet.locale_default">
+<span class="sig-name descname"><span class="pre">locale_default</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.infopage.InfoPageSet.locale_default" title="Link to this definition">¶</a></dt>
+<dd><p>default language</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.infopage.InfoPageSet.locales">
+<span class="sig-name descname"><span class="pre">locales</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.infopage.InfoPageSet.locales" title="Link to this definition">¶</a></dt>
+<dd><p>list of supported languages (aka locales)</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.infopage.InfoPageSet.toc">
+<span class="sig-name descname"><span class="pre">toc</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.infopage.InfoPageSet.toc" title="Link to this definition">¶</a></dt>
+<dd><p>list of articles in the online documentation</p>
+</dd></dl>
+
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Online <code class="docutils literal notranslate"><span class="pre">/info</span></code></a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.infopage.InfoPage"><code class="docutils literal notranslate"><span class="pre">InfoPage</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPage.get_ctx"><code class="docutils literal notranslate"><span class="pre">InfoPage.get_ctx()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPage.content"><code class="docutils literal notranslate"><span class="pre">InfoPage.content</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPage.html"><code class="docutils literal notranslate"><span class="pre">InfoPage.html</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPage.raw_content"><code class="docutils literal notranslate"><span class="pre">InfoPage.raw_content</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPage.title"><code class="docutils literal notranslate"><span class="pre">InfoPage.title</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.infopage.InfoPageSet"><code class="docutils literal notranslate"><span class="pre">InfoPageSet</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPageSet.get_page"><code class="docutils literal notranslate"><span class="pre">InfoPageSet.get_page()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPageSet.iter_pages"><code class="docutils literal notranslate"><span class="pre">InfoPageSet.iter_pages()</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPageSet.folder"><code class="docutils literal notranslate"><span class="pre">InfoPageSet.folder</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPageSet.locale_default"><code class="docutils literal notranslate"><span class="pre">InfoPageSet.locale_default</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPageSet.locales"><code class="docutils literal notranslate"><span class="pre">InfoPageSet.locales</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.infopage.InfoPageSet.toc"><code class="docutils literal notranslate"><span class="pre">InfoPageSet.toc</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.exceptions.html" title="previous chapter">SearXNG Exceptions</a>
+ <li>Next: <a href="searx.locales.html" title="next chapter">Locales</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.infopage.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.locales.html b/src/searx.locales.html
new file mode 100644
index 000000000..c61fe2846
--- /dev/null
+++ b/src/searx.locales.html
@@ -0,0 +1,426 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Locales &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Tor check plugin" href="searx.plugins.tor_check.html" />
+ <link rel="prev" title="Online /info" href="searx.infopage.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.plugins.tor_check.html" title="Tor check plugin"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.infopage.html" title="Online /info"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Locales</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="locales">
+<span id="searx-locales"></span><h1>Locales<a class="headerlink" href="#locales" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#searxngs-locale-data" id="id1">SearXNG’s locale data</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.sxng_locales" id="id2">SearXNG’s locale codes</a></p></li>
+<li><p><a class="reference internal" href="#searxngs-locale-implementations" id="id3">SearXNG’s locale implementations</a></p></li>
+</ul>
+</nav>
+<section id="searxngs-locale-data">
+<span id="module-searx.locales"></span><h2><a class="toc-backref" href="#id1" role="doc-backlink">SearXNG’s locale data</a><a class="headerlink" href="#searxngs-locale-data" title="Link to this heading">¶</a></h2>
+<p>The variables <a class="reference internal" href="#searx.locales.RTL_LOCALES" title="searx.locales.RTL_LOCALES"><code class="xref py py-obj docutils literal notranslate"><span class="pre">RTL_LOCALES</span></code></a> and <a class="reference internal" href="#searx.locales.LOCALE_NAMES" title="searx.locales.LOCALE_NAMES"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LOCALE_NAMES</span></code></a> are loaded from
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/locales.json">git://searx/data/locales.json</a> / see <a class="reference internal" href="#searx.locales.locales_initialize" title="searx.locales.locales_initialize"><code class="xref py py-obj docutils literal notranslate"><span class="pre">locales_initialize</span></code></a> and
+<a class="reference internal" href="../dev/searxng_extra/update.html#update-locales-py"><span class="std std-ref">update_locales.py</span></a>.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>Whenever the value of <a class="reference internal" href="#searx.locales.ADDITIONAL_TRANSLATIONS" title="searx.locales.ADDITIONAL_TRANSLATIONS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ADDITIONAL_TRANSLATIONS</span></code></a> or
+<a class="reference internal" href="#searx.locales.LOCALE_BEST_MATCH" title="searx.locales.LOCALE_BEST_MATCH"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LOCALE_BEST_MATCH</span></code></a> is modified, the
+<a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/data/locales.json">git://searx/data/locales.json</a> needs to be rebuild:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">manage</span> <span class="n">data</span><span class="o">.</span><span class="n">locales</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="module-searx.sxng_locales">
+<span id="searxng-s-locale-codes"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">SearXNG’s locale codes</a><a class="headerlink" href="#module-searx.sxng_locales" title="Link to this heading">¶</a></h2>
+<p>List of SearXNG’s locale codes.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>Don’t modify this file, this file is generated by:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">manage</span> <span class="n">data</span><span class="o">.</span><span class="n">traits</span>
+</pre></div>
+</div>
+</div>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.sxng_locales.sxng_locales">
+<span class="sig-prename descclassname"><span class="pre">searx.sxng_locales.</span></span><span class="sig-name descname"><span class="pre">sxng_locales</span></span><a class="headerlink" href="#searx.sxng_locales.sxng_locales" title="Link to this definition">¶</a></dt>
+<dd><p>A list of five-digit tuples:</p>
+<ol class="arabic simple" start="0">
+<li><p>SearXNG’s internal locale tag (a language or region tag)</p></li>
+<li><p>Name of the language (<a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale.get_language_name" title="(in Babel v2.2)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.core.Locale.get_language_name</span></code></a>)</p></li>
+<li><p>For region tags the name of the region (<a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale.get_territory_name" title="(in Babel v2.2)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.core.Locale.get_territory_name</span></code></a>).
+Empty string for language tags.</p></li>
+<li><p>English language name (from <a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale.english_name" title="(in Babel v2.2)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.core.Locale.english_name</span></code></a>)</p></li>
+<li><p>Unicode flag (emoji) that fits to SearXNG’s internal region tag. Languages
+are represented by a globe (🌐)</p></li>
+</ol>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="s1">&#39;en&#39;</span><span class="p">,</span> <span class="s1">&#39;English&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;English&#39;</span><span class="p">,</span> <span class="s1">&#39;🌐&#39;</span><span class="p">),</span>
+<span class="p">(</span><span class="s1">&#39;en-CA&#39;</span><span class="p">,</span> <span class="s1">&#39;English&#39;</span><span class="p">,</span> <span class="s1">&#39;Canada&#39;</span><span class="p">,</span> <span class="s1">&#39;English&#39;</span><span class="p">,</span> <span class="s1">&#39;🇨🇦&#39;</span><span class="p">),</span>
+<span class="p">(</span><span class="s1">&#39;en-US&#39;</span><span class="p">,</span> <span class="s1">&#39;English&#39;</span><span class="p">,</span> <span class="s1">&#39;United States&#39;</span><span class="p">,</span> <span class="s1">&#39;English&#39;</span><span class="p">,</span> <span class="s1">&#39;🇺🇸&#39;</span><span class="p">),</span>
+<span class="o">..</span>
+<span class="p">(</span><span class="s1">&#39;fr&#39;</span><span class="p">,</span> <span class="s1">&#39;Français&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;French&#39;</span><span class="p">,</span> <span class="s1">&#39;🌐&#39;</span><span class="p">),</span>
+<span class="p">(</span><span class="s1">&#39;fr-BE&#39;</span><span class="p">,</span> <span class="s1">&#39;Français&#39;</span><span class="p">,</span> <span class="s1">&#39;Belgique&#39;</span><span class="p">,</span> <span class="s1">&#39;French&#39;</span><span class="p">,</span> <span class="s1">&#39;🇧🇪&#39;</span><span class="p">),</span>
+<span class="p">(</span><span class="s1">&#39;fr-CA&#39;</span><span class="p">,</span> <span class="s1">&#39;Français&#39;</span><span class="p">,</span> <span class="s1">&#39;Canada&#39;</span><span class="p">,</span> <span class="s1">&#39;French&#39;</span><span class="p">,</span> <span class="s1">&#39;🇨🇦&#39;</span><span class="p">),</span>
+</pre></div>
+</div>
+<dl class="field-list simple">
+</dl>
+</dd></dl>
+
+</section>
+<section id="searxngs-locale-implementations">
+<h2><a class="toc-backref" href="#id3" role="doc-backlink">SearXNG’s locale implementations</a><a class="headerlink" href="#searxngs-locale-implementations" title="Link to this heading">¶</a></h2>
+</section>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.build_engine_locales">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">build_engine_locales</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">tag_list</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><span class="pre">list</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/locales.html#build_engine_locales"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.build_engine_locales" title="Link to this definition">¶</a></dt>
+<dd><p>From a list of locale tags a dictionary is build that can be passed by
+argument <code class="docutils literal notranslate"><span class="pre">engine_locales</span></code> to <a class="reference internal" href="#searx.locales.get_engine_locale" title="searx.locales.get_engine_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_engine_locale</span></code></a>. This function
+is mainly used by <a class="reference internal" href="#searx.locales.match_locale" title="searx.locales.match_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">match_locale</span></code></a> and is similar to what the
+<code class="docutils literal notranslate"><span class="pre">fetch_traits(..)</span></code> function of engines do.</p>
+<p>If there are territory codes in the <code class="docutils literal notranslate"><span class="pre">tag_list</span></code> that have a <em>script code</em>
+additional keys are added to the returned dictionary.</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">locales</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">engine_locales</span> <span class="o">=</span> <span class="n">locales</span><span class="o">.</span><span class="n">build_engine_locales</span><span class="p">([</span><span class="s1">&#39;en&#39;</span><span class="p">,</span> <span class="s1">&#39;en-US&#39;</span><span class="p">,</span> <span class="s1">&#39;zh&#39;</span><span class="p">,</span> <span class="s1">&#39;zh-CN&#39;</span><span class="p">,</span> <span class="s1">&#39;zh-TW&#39;</span><span class="p">])</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">engine_locales</span>
+<span class="go">{</span>
+<span class="go"> &#39;en&#39;: &#39;en&#39;, &#39;en-US&#39;: &#39;en-US&#39;,</span>
+<span class="go"> &#39;zh&#39;: &#39;zh&#39;, &#39;zh-CN&#39;: &#39;zh-CN&#39;, &#39;zh_Hans&#39;: &#39;zh-CN&#39;,</span>
+<span class="go"> &#39;zh-TW&#39;: &#39;zh-TW&#39;, &#39;zh_Hant&#39;: &#39;zh-TW&#39;</span>
+<span class="go">}</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">get_engine_locale</span><span class="p">(</span><span class="s1">&#39;zh-Hans&#39;</span><span class="p">,</span> <span class="n">engine_locales</span><span class="p">)</span>
+<span class="go">&#39;zh-CN&#39;</span>
+</pre></div>
+</div>
+<p>This function is a good example to understand the language/region model
+of SearXNG:</p>
+<blockquote>
+<div><p>SearXNG only distinguishes between <strong>search languages</strong> and <strong>search
+regions</strong>, by adding the <em>script-tags</em>, languages with <em>script-tags</em> can
+be assigned to the <strong>regions</strong> that SearXNG supports.</p>
+</div></blockquote>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.get_engine_locale">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">get_engine_locale</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">searxng_locale</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_locales</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/locales.html#get_engine_locale"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.get_engine_locale" title="Link to this definition">¶</a></dt>
+<dd><p>Return engine’s language (aka locale) string that best fits to argument
+<code class="docutils literal notranslate"><span class="pre">searxng_locale</span></code>.</p>
+<p>Argument <code class="docutils literal notranslate"><span class="pre">engine_locales</span></code> is a python dict that maps <em>SearXNG locales</em> to
+corresponding <em>engine locales</em>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="n">engine</span><span class="o">&gt;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="c1"># SearXNG string : engine-string</span>
+ <span class="s1">&#39;ca-ES&#39;</span> <span class="p">:</span> <span class="s1">&#39;ca_ES&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fr-BE&#39;</span> <span class="p">:</span> <span class="s1">&#39;fr_BE&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fr-CA&#39;</span> <span class="p">:</span> <span class="s1">&#39;fr_CA&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fr-CH&#39;</span> <span class="p">:</span> <span class="s1">&#39;fr_CH&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;fr&#39;</span> <span class="p">:</span> <span class="s1">&#39;fr_FR&#39;</span><span class="p">,</span>
+ <span class="o">...</span>
+ <span class="s1">&#39;pl-PL&#39;</span> <span class="p">:</span> <span class="s1">&#39;pl_PL&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;pt-PT&#39;</span> <span class="p">:</span> <span class="s1">&#39;pt_PT&#39;</span>
+ <span class="o">..</span>
+ <span class="s1">&#39;zh&#39;</span> <span class="p">:</span> <span class="s1">&#39;zh&#39;</span>
+ <span class="s1">&#39;zh_Hans&#39;</span> <span class="p">:</span> <span class="s1">&#39;zh&#39;</span>
+ <span class="s1">&#39;zh_Hant&#39;</span> <span class="p">:</span> <span class="s1">&#39;zh_TW&#39;</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>The <em>SearXNG locale</em> string has to be known by babel!</p>
+</div>
+<p>If there is no direct 1:1 mapping, this functions tries to narrow down
+engine’s language (locale). If no value can be determined by these
+approximation attempts the <code class="docutils literal notranslate"><span class="pre">default</span></code> value is returned.</p>
+<p>Assumptions:</p>
+<ol class="upperalpha simple">
+<li><p>When user select a language the results should be optimized according to
+the selected language.</p></li>
+<li><p>When user select a language and a territory the results should be
+optimized with first priority on territory and second on language.</p></li>
+</ol>
+<p>First approximation rule (<em>by territory</em>):</p>
+<blockquote>
+<div><p>When the user selects a locale with territory (and a language), the
+territory has priority over the language. If any of the official languages
+in the territory is supported by the engine (<code class="docutils literal notranslate"><span class="pre">engine_locales</span></code>) it will
+be used.</p>
+</div></blockquote>
+<p>Second approximation rule (<em>by language</em>):</p>
+<blockquote>
+<div><p>If “First approximation rule” brings no result or the user selects only a
+language without a territory. Check in which territories the language
+has an official status and if one of these territories is supported by the
+engine.</p>
+</div></blockquote>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.get_locale">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">get_locale</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">locale_tag</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">babel.Locale</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../_modules/searx/locales.html#get_locale"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.get_locale" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a <code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.Locale</span></code> object parsed from argument
+<code class="docutils literal notranslate"><span class="pre">locale_tag</span></code></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.get_official_locales">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">get_official_locales</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">territory</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">languages</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">regional</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">de_facto</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#set" title="(in Python v3.12)"><span class="pre">set</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale" title="(in Babel v2.2)"><span class="pre">Locale</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../_modules/searx/locales.html#get_official_locales"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.get_official_locales" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a list of <code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.Locale</span></code> with languages from
+<a class="reference external" href="https://babel.readthedocs.io/en/latest/api/languages.html#babel.languages.get_official_languages" title="(in Babel v2.2)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.languages.get_official_languages</span></code></a>.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>territory</strong> – The territory (country or region) code.</p></li>
+<li><p><strong>languages</strong> – A list of language codes the languages from
+<a class="reference external" href="https://babel.readthedocs.io/en/latest/api/languages.html#babel.languages.get_official_languages" title="(in Babel v2.2)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">babel.languages.get_official_languages</span></code></a> should be in
+(intersection). If this argument is <code class="docutils literal notranslate"><span class="pre">None</span></code>, all official languages in
+this territory are used.</p></li>
+<li><p><strong>regional</strong> – If the regional flag is set, then languages which are
+regionally official are also returned.</p></li>
+<li><p><strong>de_facto</strong> – If the de_facto flag is set to <cite>False</cite>, then languages
+which are “de facto” official are not returned.</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.get_translation_locales">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">get_translation_locales</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><span class="pre">list</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../_modules/searx/locales.html#get_translation_locales"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.get_translation_locales" title="Link to this definition">¶</a></dt>
+<dd><p>Returns the list of transaltion locales (<em>underscore</em>). The list is
+generated from the translation folders in <a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/translations">git://searx/translations</a></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.get_translations">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">get_translations</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/locales.html#get_translations"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.get_translations" title="Link to this definition">¶</a></dt>
+<dd><p>Monkey patch of <a class="reference external" href="https://python-babel.github.io/flask-babel/index.html#flask_babel.get_translations" title="(in Flask-Babel)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">flask_babel.get_translations</span></code></a></p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.language_tag">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">language_tag</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale" title="(in Babel v2.2)"><span class="pre">Locale</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/locales.html#language_tag"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.language_tag" title="Link to this definition">¶</a></dt>
+<dd><p>Returns SearXNG’s language tag from the locale and if exits, the tag
+includes the script name (e.g. en, zh_Hant).</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.locales_initialize">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">locales_initialize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/locales.html#locales_initialize"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.locales_initialize" title="Link to this definition">¶</a></dt>
+<dd><p>Initialize locales environment of the SearXNG session.</p>
+<ul class="simple">
+<li><p>monkey patch <a class="reference external" href="https://python-babel.github.io/flask-babel/index.html#flask_babel.get_translations" title="(in Flask-Babel)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">flask_babel.get_translations</span></code></a> by <a class="reference internal" href="#searx.locales.get_translations" title="searx.locales.get_translations"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_translations</span></code></a></p></li>
+<li><p>init global names <a class="reference internal" href="#searx.locales.LOCALE_NAMES" title="searx.locales.LOCALE_NAMES"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LOCALE_NAMES</span></code></a>, <a class="reference internal" href="#searx.locales.RTL_LOCALES" title="searx.locales.RTL_LOCALES"><code class="xref py py-obj docutils literal notranslate"><span class="pre">RTL_LOCALES</span></code></a></p></li>
+</ul>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.match_locale">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">match_locale</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">searxng_locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">locale_tag_list</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><span class="pre">list</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fallback</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../_modules/searx/locales.html#match_locale"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.match_locale" title="Link to this definition">¶</a></dt>
+<dd><p>Return tag from <code class="docutils literal notranslate"><span class="pre">locale_tag_list</span></code> that best fits to <code class="docutils literal notranslate"><span class="pre">searxng_locale</span></code>.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>searxng_locale</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – SearXNG’s internal representation of locale (de,
+de-DE, fr-BE, zh, zh-CN, zh-TW ..).</p></li>
+<li><p><strong>locale_tag_list</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.12)"><em>list</em></a>) – The list of locale tags to select from</p></li>
+<li><p><strong>fallback</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – fallback locale tag (if unset –&gt; <code class="docutils literal notranslate"><span class="pre">None</span></code>)</p></li>
+</ul>
+</dd>
+</dl>
+<p>The rules to find a match are implemented in <a class="reference internal" href="#searx.locales.get_engine_locale" title="searx.locales.get_engine_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_engine_locale</span></code></a>,
+the <code class="docutils literal notranslate"><span class="pre">engine_locales</span></code> is build up by <a class="reference internal" href="#searx.locales.build_engine_locales" title="searx.locales.build_engine_locales"><code class="xref py py-obj docutils literal notranslate"><span class="pre">build_engine_locales</span></code></a>.</p>
+<div class="admonition hint">
+<p class="admonition-title">Hint</p>
+<p>The <em>SearXNG locale</em> string and the members of <code class="docutils literal notranslate"><span class="pre">locale_tag_list</span></code> has to
+be known by babel! The <a class="reference internal" href="#searx.locales.ADDITIONAL_TRANSLATIONS" title="searx.locales.ADDITIONAL_TRANSLATIONS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ADDITIONAL_TRANSLATIONS</span></code></a> are used in the
+UI and are not known by babel –&gt; will be ignored.</p>
+</div>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.locales.region_tag">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">region_tag</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">locale</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://babel.readthedocs.io/en/latest/api/core.html#babel.core.Locale" title="(in Babel v2.2)"><span class="pre">Locale</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/locales.html#region_tag"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.locales.region_tag" title="Link to this definition">¶</a></dt>
+<dd><p>Returns SearXNG’s region tag from the locale (e.g. zh-TW , en-US).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.locales.ADDITIONAL_TRANSLATIONS">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">ADDITIONAL_TRANSLATIONS</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'dv':</span> <span class="pre">'ދިވެހި</span> <span class="pre">(Dhivehi)',</span> <span class="pre">'oc':</span> <span class="pre">'Occitan',</span> <span class="pre">'pap':</span> <span class="pre">'Papiamento',</span> <span class="pre">'szl':</span> <span class="pre">'Ślōnski</span> <span class="pre">(Silesian)'}</span></em><a class="headerlink" href="#searx.locales.ADDITIONAL_TRANSLATIONS" title="Link to this definition">¶</a></dt>
+<dd><p>Additional languages SearXNG has translations for but not supported by
+python-babel (see <a class="reference internal" href="#searx.locales.locales_initialize" title="searx.locales.locales_initialize"><code class="xref py py-obj docutils literal notranslate"><span class="pre">locales_initialize</span></code></a>).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.locales.LOCALE_BEST_MATCH">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">LOCALE_BEST_MATCH</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'dv':</span> <span class="pre">'si',</span> <span class="pre">'nl-BE':</span> <span class="pre">'nl',</span> <span class="pre">'oc':</span> <span class="pre">'fr-FR',</span> <span class="pre">'pap':</span> <span class="pre">'pt-BR',</span> <span class="pre">'szl':</span> <span class="pre">'pl',</span> <span class="pre">'zh-HK':</span> <span class="pre">'zh-Hant-TW'}</span></em><a class="headerlink" href="#searx.locales.LOCALE_BEST_MATCH" title="Link to this definition">¶</a></dt>
+<dd><p>Map a locale we do not have a translations for to a locale we have a
+translation for. By example: use Taiwan version of the translation for Hong
+Kong.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.locales.LOCALE_NAMES">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">LOCALE_NAMES</span></span><a class="headerlink" href="#searx.locales.LOCALE_NAMES" title="Link to this definition">¶</a></dt>
+<dd><p>Mapping of locales and their description. Locales e.g. ‘fr’ or ‘pt-BR’ (see
+<a class="reference internal" href="#searx.locales.locales_initialize" title="searx.locales.locales_initialize"><code class="xref py py-obj docutils literal notranslate"><span class="pre">locales_initialize</span></code></a>).</p>
+<dl class="field-list simple">
+</dl>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.locales.RTL_LOCALES">
+<span class="sig-prename descclassname"><span class="pre">searx.locales.</span></span><span class="sig-name descname"><span class="pre">RTL_LOCALES</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#set" title="(in Python v3.12)"><span class="pre">set</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'ar',</span> <span class="pre">'fa-IR',</span> <span class="pre">'he'}</span></em><a class="headerlink" href="#searx.locales.RTL_LOCALES" title="Link to this definition">¶</a></dt>
+<dd><p>List of <em>Right-To-Left</em> locales e.g. ‘he’ or ‘fa-IR’ (see
+<a class="reference internal" href="#searx.locales.locales_initialize" title="searx.locales.locales_initialize"><code class="xref py py-obj docutils literal notranslate"><span class="pre">locales_initialize</span></code></a>).</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.infopage.html">Online <code class="docutils literal notranslate"><span class="pre">/info</span></code></a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Locales</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searxngs-locale-data">SearXNG’s locale data</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.sxng_locales">SearXNG’s locale codes</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.sxng_locales.sxng_locales"><code class="docutils literal notranslate"><span class="pre">sxng_locales</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#searxngs-locale-implementations">SearXNG’s locale implementations</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.build_engine_locales"><code class="docutils literal notranslate"><span class="pre">build_engine_locales()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.get_engine_locale"><code class="docutils literal notranslate"><span class="pre">get_engine_locale()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.get_locale"><code class="docutils literal notranslate"><span class="pre">get_locale()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.get_official_locales"><code class="docutils literal notranslate"><span class="pre">get_official_locales()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.get_translation_locales"><code class="docutils literal notranslate"><span class="pre">get_translation_locales()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.get_translations"><code class="docutils literal notranslate"><span class="pre">get_translations()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.language_tag"><code class="docutils literal notranslate"><span class="pre">language_tag()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.locales_initialize"><code class="docutils literal notranslate"><span class="pre">locales_initialize()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.match_locale"><code class="docutils literal notranslate"><span class="pre">match_locale()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.region_tag"><code class="docutils literal notranslate"><span class="pre">region_tag()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.ADDITIONAL_TRANSLATIONS"><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_TRANSLATIONS</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.LOCALE_BEST_MATCH"><code class="docutils literal notranslate"><span class="pre">LOCALE_BEST_MATCH</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.LOCALE_NAMES"><code class="docutils literal notranslate"><span class="pre">LOCALE_NAMES</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.locales.RTL_LOCALES"><code class="docutils literal notranslate"><span class="pre">RTL_LOCALES</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.infopage.html" title="previous chapter">Online <code class="docutils literal notranslate"><span class="pre">/info</span></code></a>
+ <li>Next: <a href="searx.plugins.tor_check.html" title="next chapter">Tor check plugin</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.locales.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.plugins.tor_check.html b/src/searx.plugins.tor_check.html
new file mode 100644
index 000000000..6568f01f9
--- /dev/null
+++ b/src/searx.plugins.tor_check.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Tor check plugin &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Unit converter plugin" href="searx.plugins.unit_converter.html" />
+ <link rel="prev" title="Locales" href="searx.locales.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.plugins.unit_converter.html" title="Unit converter plugin"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.locales.html" title="Locales"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Tor check plugin</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="tor-check-plugin">
+<span id="id1"></span><h1>Tor check plugin<a class="headerlink" href="#tor-check-plugin" title="Link to this heading">¶</a></h1>
+<p id="module-searx.plugins.tor_check">A plugin to check if the ip address of the request is a Tor exit-node if the
+user searches for <code class="docutils literal notranslate"><span class="pre">tor-check</span></code>. It fetches the tor exit node list from
+<a class="reference external" href="https://check.torproject.org/exit-addresses">https://check.torproject.org/exit-addresses</a> and parses all the IPs into a list,
+then checks if the user’s IP address is in it.</p>
+<p>Enable in <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">enabled_plugins</span><span class="p">:</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">..</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">- &#39;Tor check plugin&#39;</span>
+</pre></div>
+</div>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.plugins.tor_check.description">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.tor_check.</span></span><span class="sig-name descname"><span class="pre">description</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'This</span> <span class="pre">plugin</span> <span class="pre">checks</span> <span class="pre">if</span> <span class="pre">the</span> <span class="pre">address</span> <span class="pre">of</span> <span class="pre">the</span> <span class="pre">request</span> <span class="pre">is</span> <span class="pre">a</span> <span class="pre">Tor</span> <span class="pre">exit-node,</span> <span class="pre">and</span> <span class="pre">informs</span> <span class="pre">the</span> <span class="pre">user</span> <span class="pre">if</span> <span class="pre">it</span> <span class="pre">is;</span> <span class="pre">like</span> <span class="pre">check.torproject.org,</span> <span class="pre">but</span> <span class="pre">from</span> <span class="pre">SearXNG.'</span></em><a class="headerlink" href="#searx.plugins.tor_check.description" title="Link to this definition">¶</a></dt>
+<dd><p>Translated description of the plugin.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.plugins.tor_check.name">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.tor_check.</span></span><span class="sig-name descname"><span class="pre">name</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'Tor</span> <span class="pre">check</span> <span class="pre">plugin'</span></em><a class="headerlink" href="#searx.plugins.tor_check.name" title="Link to this definition">¶</a></dt>
+<dd><p>Translated name of the plugin</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.plugins.tor_check.preference_section">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.tor_check.</span></span><span class="sig-name descname"><span class="pre">preference_section</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'query'</span></em><a class="headerlink" href="#searx.plugins.tor_check.preference_section" title="Link to this definition">¶</a></dt>
+<dd><p>The preference section where the plugin is shown.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.plugins.tor_check.query_examples">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.tor_check.</span></span><span class="sig-name descname"><span class="pre">query_examples</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.plugins.tor_check.query_examples" title="Link to this definition">¶</a></dt>
+<dd><p>Query examples shown in the preferences.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.plugins.tor_check.query_keywords">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.tor_check.</span></span><span class="sig-name descname"><span class="pre">query_keywords</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">['tor-check']</span></em><a class="headerlink" href="#searx.plugins.tor_check.query_keywords" title="Link to this definition">¶</a></dt>
+<dd><p>Query keywords shown in the preferences.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Tor check plugin</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.tor_check.description"><code class="docutils literal notranslate"><span class="pre">description</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.tor_check.name"><code class="docutils literal notranslate"><span class="pre">name</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.tor_check.preference_section"><code class="docutils literal notranslate"><span class="pre">preference_section</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.tor_check.query_examples"><code class="docutils literal notranslate"><span class="pre">query_examples</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.tor_check.query_keywords"><code class="docutils literal notranslate"><span class="pre">query_keywords</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.locales.html" title="previous chapter">Locales</a>
+ <li>Next: <a href="searx.plugins.unit_converter.html" title="next chapter">Unit converter plugin</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.plugins.tor_check.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.plugins.unit_converter.html b/src/searx.plugins.unit_converter.html
new file mode 100644
index 000000000..db98926fe
--- /dev/null
+++ b/src/searx.plugins.unit_converter.html
@@ -0,0 +1,211 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Unit converter plugin &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Redis DB" href="searx.redisdb.html" />
+ <link rel="prev" title="Tor check plugin" href="searx.plugins.tor_check.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.redisdb.html" title="Redis DB"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.plugins.tor_check.html" title="Tor check plugin"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Unit converter plugin</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="unit-converter-plugin">
+<span id="id1"></span><h1>Unit converter plugin<a class="headerlink" href="#unit-converter-plugin" title="Link to this heading">¶</a></h1>
+<p id="module-searx.plugins.unit_converter">A plugin for converting measured values from one unit to another unit (a
+unit converter).</p>
+<p>The plugin looks up the symbols (given in the query term) in a list of
+converters, each converter is one item in the list (compare
+<a class="reference internal" href="#searx.plugins.unit_converter.ADDITIONAL_UNITS" title="searx.plugins.unit_converter.ADDITIONAL_UNITS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ADDITIONAL_UNITS</span></code></a>). If the symbols are ambiguous, the matching units
+of measurement are evaluated. The weighting in the evaluation results from the
+sorting of the <a class="reference internal" href="#searx.plugins.unit_converter.symbol_to_si" title="searx.plugins.unit_converter.symbol_to_si"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span> <span class="pre">of</span> <span class="pre">unit</span> <span class="pre">converters</span></code></a>.</p>
+<p>Enable in <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>:</p>
+<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">enabled_plugins</span><span class="p">:</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">..</span>
+<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">- &#39;Unit converter plugin&#39;</span>
+</pre></div>
+</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.plugins.unit_converter.symbol_to_si">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.unit_converter.</span></span><span class="sig-name descname"><span class="pre">symbol_to_si</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/plugins/unit_converter.html#symbol_to_si"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.unit_converter.symbol_to_si" title="Link to this definition">¶</a></dt>
+<dd><p>Generates a list of tuples, each tuple is a measure unit and the fields
+in the tuple are:</p>
+<ol class="arabic simple" start="0">
+<li><p>Symbol of the measure unit (e.g. ‘mi’ for measure unit ‘miles’ Q253276)</p></li>
+<li><p>SI name of the measure unit (e.g. Q11573 for SI unit ‘metre’)</p></li>
+<li><p>Factor to get SI value from measure unit (e.g. 1mi is equal to SI 1m
+multiplied by 1609.344)</p></li>
+<li><p>Factor to get measure value from from SI value (e.g. SI 100m is equal to
+100mi divided by 1609.344)</p></li>
+</ol>
+<p>The returned list is sorted, the first items are created from
+<code class="docutils literal notranslate"><span class="pre">WIKIDATA_UNITS</span></code>, the second group of items is build from
+<a class="reference internal" href="#searx.plugins.unit_converter.ADDITIONAL_UNITS" title="searx.plugins.unit_converter.ADDITIONAL_UNITS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ADDITIONAL_UNITS</span></code></a> and items created from <a class="reference internal" href="#searx.plugins.unit_converter.ALIAS_SYMBOLS" title="searx.plugins.unit_converter.ALIAS_SYMBOLS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ALIAS_SYMBOLS</span></code></a>.</p>
+<p>If you search this list for a symbol, then a match with a symbol from
+Wikidata has the highest weighting (first hit in the list), followed by the
+symbols from the <a class="reference internal" href="#searx.plugins.unit_converter.ADDITIONAL_UNITS" title="searx.plugins.unit_converter.ADDITIONAL_UNITS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ADDITIONAL_UNITS</span></code></a> and the lowest weighting is
+given to the symbols resulting from the aliases <a class="reference internal" href="#searx.plugins.unit_converter.ALIAS_SYMBOLS" title="searx.plugins.unit_converter.ALIAS_SYMBOLS"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ALIAS_SYMBOLS</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.plugins.unit_converter.ADDITIONAL_UNITS">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.unit_converter.</span></span><span class="sig-name descname"><span class="pre">ADDITIONAL_UNITS</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">[{'from_si':</span> <span class="pre">&lt;function</span> <span class="pre">&lt;lambda&gt;&gt;,</span> <span class="pre">'si_name':</span> <span class="pre">'Q11579',</span> <span class="pre">'symbol':</span> <span class="pre">'°C',</span> <span class="pre">'to_si':</span> <span class="pre">&lt;function</span> <span class="pre">&lt;lambda&gt;&gt;},</span> <span class="pre">{'from_si':</span> <span class="pre">&lt;function</span> <span class="pre">&lt;lambda&gt;&gt;,</span> <span class="pre">'si_name':</span> <span class="pre">'Q11579',</span> <span class="pre">'symbol':</span> <span class="pre">'°F',</span> <span class="pre">'to_si':</span> <span class="pre">&lt;function</span> <span class="pre">&lt;lambda&gt;&gt;}]</span></em><a class="headerlink" href="#searx.plugins.unit_converter.ADDITIONAL_UNITS" title="Link to this definition">¶</a></dt>
+<dd><p>Additional items to convert from a measure unit to a SI unit (vice versa).</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;si_name&quot;</span><span class="p">:</span> <span class="s2">&quot;Q11579&quot;</span><span class="p">,</span> <span class="c1"># Wikidata item ID of the SI unit (Kelvin)</span>
+ <span class="s2">&quot;symbol&quot;</span><span class="p">:</span> <span class="s2">&quot;°C&quot;</span><span class="p">,</span> <span class="c1"># symbol of the measure unit</span>
+ <span class="s2">&quot;to_si&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span> <span class="o">+</span> <span class="mf">273.15</span><span class="p">,</span> <span class="c1"># convert measure value (val) to SI unit</span>
+ <span class="s2">&quot;from_si&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">,</span> <span class="c1"># convert SI value (val) measure unit</span>
+<span class="p">},</span>
+<span class="p">{</span>
+ <span class="s2">&quot;si_name&quot;</span><span class="p">:</span> <span class="s2">&quot;Q11573&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;symbol&quot;</span><span class="p">:</span> <span class="s2">&quot;mi&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;to_si&quot;</span><span class="p">:</span> <span class="mf">1609.344</span><span class="p">,</span> <span class="c1"># convert measure value (val) to SI unit</span>
+ <span class="s2">&quot;from_si&quot;</span><span class="p">:</span> <span class="mi">1</span> <span class="o">/</span> <span class="mf">1609.344</span> <span class="c1"># convert SI value (val) measure unit</span>
+<span class="p">},</span>
+</pre></div>
+</div>
+<p>The values of <code class="docutils literal notranslate"><span class="pre">to_si</span></code> and <code class="docutils literal notranslate"><span class="pre">from_si</span></code> can be of <a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.12)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">float</span></code></a> (a multiplier)
+or a <a class="reference external" href="https://docs.python.org/3/glossary.html#term-callable">callable</a> (val in / converted value returned).</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.plugins.unit_converter.ALIAS_SYMBOLS">
+<span class="sig-prename descclassname"><span class="pre">searx.plugins.unit_converter.</span></span><span class="sig-name descname"><span class="pre">ALIAS_SYMBOLS</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{'mi':</span> <span class="pre">('L',),</span> <span class="pre">'°C':</span> <span class="pre">('C',),</span> <span class="pre">'°F':</span> <span class="pre">('F',)}</span></em><a class="headerlink" href="#searx.plugins.unit_converter.ALIAS_SYMBOLS" title="Link to this definition">¶</a></dt>
+<dd><p>Alias symbols for known unit of measure symbols / by example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;°C&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;C&#39;</span><span class="p">,</span> <span class="o">...</span><span class="p">),</span> <span class="c1"># list of alias symbols for °C (Q69362731)</span>
+<span class="s1">&#39;°F&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;F&#39;</span><span class="p">,</span> <span class="o">...</span><span class="p">),</span> <span class="c1"># list of alias symbols for °F (Q99490479)</span>
+<span class="s1">&#39;mi&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;L&#39;</span><span class="p">,),</span> <span class="c1"># list of alias symbols for mi (Q253276)</span>
+</pre></div>
+</div>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Unit converter plugin</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.unit_converter.symbol_to_si"><code class="docutils literal notranslate"><span class="pre">symbol_to_si()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.unit_converter.ADDITIONAL_UNITS"><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_UNITS</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.plugins.unit_converter.ALIAS_SYMBOLS"><code class="docutils literal notranslate"><span class="pre">ALIAS_SYMBOLS</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.plugins.tor_check.html" title="previous chapter">Tor check plugin</a>
+ <li>Next: <a href="searx.redisdb.html" title="next chapter">Redis DB</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.plugins.unit_converter.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.redisdb.html b/src/searx.redisdb.html
new file mode 100644
index 000000000..4c2a42ba3
--- /dev/null
+++ b/src/searx.redisdb.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Redis DB &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Redis Library" href="searx.redislib.html" />
+ <link rel="prev" title="Unit converter plugin" href="searx.plugins.unit_converter.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.redislib.html" title="Redis Library"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.plugins.unit_converter.html" title="Unit converter plugin"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Redis DB</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="redis-db">
+<span id="id1"></span><h1>Redis DB<a class="headerlink" href="#redis-db" title="Link to this heading">¶</a></h1>
+<p id="module-searx.redisdb">Implementation of the redis client (<a class="reference external" href="https://github.com/redis/redis-py">redis-py</a>).</p>
+<p>This implementation uses the <a class="reference internal" href="../admin/settings/settings_redis.html#settings-redis"><span class="std std-ref">redis:</span></a> setup from <code class="docutils literal notranslate"><span class="pre">settings.yml</span></code>.
+A redis DB connect can be tested by:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">searx</span> <span class="kn">import</span> <span class="n">redisdb</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">redisdb</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+<span class="go">True</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">db</span> <span class="o">=</span> <span class="n">redisdb</span><span class="o">.</span><span class="n">client</span><span class="p">()</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">db</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="s2">&quot;bar&quot;</span><span class="p">)</span>
+<span class="go">True</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">db</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;foo&quot;</span><span class="p">)</span>
+<span class="go">b&#39;bar&#39;</span>
+<span class="gp">&gt;&gt;&gt;</span>
+</pre></div>
+</div>
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.redisdb.OLD_REDIS_URL_DEFAULT_URL">
+<span class="sig-prename descclassname"><span class="pre">searx.redisdb.</span></span><span class="sig-name descname"><span class="pre">OLD_REDIS_URL_DEFAULT_URL</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'unix:///usr/local/searxng-redis/run/redis.sock?db=0'</span></em><a class="headerlink" href="#searx.redisdb.OLD_REDIS_URL_DEFAULT_URL" title="Link to this definition">¶</a></dt>
+<dd><p>This was the default Redis URL in settings.yml.</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Redis DB</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redisdb.OLD_REDIS_URL_DEFAULT_URL"><code class="docutils literal notranslate"><span class="pre">OLD_REDIS_URL_DEFAULT_URL</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.plugins.unit_converter.html" title="previous chapter">Unit converter plugin</a>
+ <li>Next: <a href="searx.redislib.html" title="next chapter">Redis Library</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.redisdb.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.redislib.html b/src/searx.redislib.html
new file mode 100644
index 000000000..5779db1eb
--- /dev/null
+++ b/src/searx.redislib.html
@@ -0,0 +1,293 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Redis Library &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Search" href="searx.search.html" />
+ <link rel="prev" title="Redis DB" href="searx.redisdb.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.search.html" title="Search"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.redisdb.html" title="Redis DB"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Redis Library</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="module-searx.redislib">
+<span id="redis-library"></span><span id="searx-redis"></span><h1>Redis Library<a class="headerlink" href="#module-searx.redislib" title="Link to this heading">¶</a></h1>
+<p>A collection of convenient functions and redis/lua scripts.</p>
+<p>This code was partial inspired by the <a class="reference external" href="https://redis.com/blog/bullet-proofing-lua-scripts-in-redispy/">Bullet-Proofing Lua Scripts in RedisPy</a>
+article.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.redislib.drop_counter">
+<span class="sig-prename descclassname"><span class="pre">searx.redislib.</span></span><span class="sig-name descname"><span class="pre">drop_counter</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/redislib.html#drop_counter"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.redislib.drop_counter" title="Link to this definition">¶</a></dt>
+<dd><p>Drop counter with redis key <code class="docutils literal notranslate"><span class="pre">SearXNG_counter_&lt;name&gt;</span></code></p>
+<p>The replacement <code class="docutils literal notranslate"><span class="pre">&lt;name&gt;</span></code> is a <em>secret hash</em> of the value from argument
+<code class="docutils literal notranslate"><span class="pre">name</span></code> (see <a class="reference internal" href="#searx.redislib.incr_counter" title="searx.redislib.incr_counter"><code class="xref py py-func docutils literal notranslate"><span class="pre">incr_counter()</span></code></a> and <a class="reference internal" href="#searx.redislib.incr_sliding_window" title="searx.redislib.incr_sliding_window"><code class="xref py py-func docutils literal notranslate"><span class="pre">incr_sliding_window()</span></code></a>).</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.redislib.incr_counter">
+<span class="sig-prename descclassname"><span class="pre">searx.redislib.</span></span><span class="sig-name descname"><span class="pre">incr_counter</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">limit</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">expire</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/redislib.html#incr_counter"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.redislib.incr_counter" title="Link to this definition">¶</a></dt>
+<dd><p>Increment a counter and return the new value.</p>
+<p>If counter with redis key <code class="docutils literal notranslate"><span class="pre">SearXNG_counter_&lt;name&gt;</span></code> does not exists it is
+created with initial value 1 returned. The replacement <code class="docutils literal notranslate"><span class="pre">&lt;name&gt;</span></code> is a
+<em>secret hash</em> of the value from argument <code class="docutils literal notranslate"><span class="pre">name</span></code> (see
+<a class="reference internal" href="#searx.redislib.secret_hash" title="searx.redislib.secret_hash"><code class="xref py py-func docutils literal notranslate"><span class="pre">secret_hash()</span></code></a>).</p>
+<p>The implementation of the redis counter is the lua script from string
+<code class="xref py py-obj docutils literal notranslate"><span class="pre">INCR_COUNTER</span></code>.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>name</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – name of the counter</p></li>
+<li><p><strong>expire</strong> (int / see <a class="reference external" href="https://redis.io/commands/expire/">EXPIRE</a>) – live-time of the counter in seconds (default <code class="docutils literal notranslate"><span class="pre">None</span></code> means
+infinite).</p></li>
+<li><p><strong>limit</strong> (int / limit is 2^64 see <a class="reference external" href="https://redis.io/commands/incr/">INCR</a>) – limit where the counter stops to increment (default <code class="docutils literal notranslate"><span class="pre">None</span></code>)</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>value of the incremented counter</p>
+</dd>
+</dl>
+<p>A simple demo of a counter with expire time and limit:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">6</span><span class="p">):</span>
+<span class="gp">... </span> <span class="n">i</span><span class="p">,</span> <span class="n">incr_counter</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="c1"># max 3, duration 5 sec</span>
+<span class="gp">... </span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># from the third call on max has been reached</span>
+<span class="gp">...</span>
+<span class="go">(0, 1)</span>
+<span class="go">(1, 2)</span>
+<span class="go">(2, 3)</span>
+<span class="go">(3, 3)</span>
+<span class="go">(4, 3)</span>
+<span class="go">(5, 1)</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.redislib.incr_sliding_window">
+<span class="sig-prename descclassname"><span class="pre">searx.redislib.</span></span><span class="sig-name descname"><span class="pre">incr_sliding_window</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">duration</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/redislib.html#incr_sliding_window"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.redislib.incr_sliding_window" title="Link to this definition">¶</a></dt>
+<dd><p>Increment a sliding-window counter and return the new value.</p>
+<p>If counter with redis key <code class="docutils literal notranslate"><span class="pre">SearXNG_counter_&lt;name&gt;</span></code> does not exists it is
+created with initial value 1 returned. The replacement <code class="docutils literal notranslate"><span class="pre">&lt;name&gt;</span></code> is a
+<em>secret hash</em> of the value from argument <code class="docutils literal notranslate"><span class="pre">name</span></code> (see
+<a class="reference internal" href="#searx.redislib.secret_hash" title="searx.redislib.secret_hash"><code class="xref py py-func docutils literal notranslate"><span class="pre">secret_hash()</span></code></a>).</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>name</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – name of the counter</p></li>
+<li><p><strong>duration</strong> – live-time of the sliding window in seconds</p></li>
+</ul>
+</dd>
+<dt class="field-even">Typeduration<span class="colon">:</span></dt>
+<dd class="field-even"><p>int</p>
+</dd>
+<dt class="field-odd">Returns<span class="colon">:</span></dt>
+<dd class="field-odd"><p>value of the incremented counter</p>
+</dd>
+</dl>
+<p>The implementation of the redis counter is the lua script from string
+<code class="xref py py-obj docutils literal notranslate"><span class="pre">INCR_SLIDING_WINDOW</span></code>. The lua script uses <a class="reference external" href="https://redis.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-5-sorted-sets-in-redis/">sorted sets in Redis</a>
+to implement a sliding window for the redis key <code class="docutils literal notranslate"><span class="pre">SearXNG_counter_&lt;name&gt;</span></code>
+(<a class="reference external" href="https://redis.io/commands/zadd/">ZADD</a>). The current <a class="reference external" href="https://redis.io/commands/time/">TIME</a> is used to score the items in the sorted set and
+the time window is moved by removing items with a score lower current time
+minus <em>duration</em> time (<a class="reference external" href="https://redis.io/commands/zremrangebyscore/">ZREMRANGEBYSCORE</a>).</p>
+<p>The <a class="reference external" href="https://redis.io/commands/expire/">EXPIRE</a> time (the duration of the sliding window) is refreshed on each
+call (increment) and if there is no call in this duration, the sorted
+set expires from the redis DB.</p>
+<p>The return value is the amount of items in the sorted set (<a class="reference external" href="https://redis.io/commands/zcount/">ZCOUNT</a>), what
+means the number of calls in the sliding window.</p>
+<p>A simple demo of the sliding window:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
+<span class="gp">... </span> <span class="n">incr_sliding_window</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c1"># duration 3 sec</span>
+<span class="gp">... </span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># from the third call (second) on the window is moved</span>
+<span class="gp">...</span>
+<span class="go">1</span>
+<span class="go">2</span>
+<span class="go">3</span>
+<span class="go">3</span>
+<span class="go">3</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="c1"># wait until expire</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">incr_sliding_window</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
+<span class="go">1</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.redislib.lua_script_storage">
+<span class="sig-prename descclassname"><span class="pre">searx.redislib.</span></span><span class="sig-name descname"><span class="pre">lua_script_storage</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">script</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/redislib.html#lua_script_storage"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.redislib.lua_script_storage" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a redis <a class="reference external" href="https://redis.readthedocs.io/en/stable/commands.html#redis.commands.core.CoreCommands.register_script" title="(in redis-py v99.99.99)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Script</span></code></a> instance.</p>
+<p>Due to performance reason the <code class="docutils literal notranslate"><span class="pre">Script</span></code> object is instantiated only once
+for a client (<code class="docutils literal notranslate"><span class="pre">client.register_script(..)</span></code>) and is cached in
+<a class="reference internal" href="#searx.redislib.LUA_SCRIPT_STORAGE" title="searx.redislib.LUA_SCRIPT_STORAGE"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LUA_SCRIPT_STORAGE</span></code></a>.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.redislib.purge_by_prefix">
+<span class="sig-prename descclassname"><span class="pre">searx.redislib.</span></span><span class="sig-name descname"><span class="pre">purge_by_prefix</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'SearXNG_'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/redislib.html#purge_by_prefix"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.redislib.purge_by_prefix" title="Link to this definition">¶</a></dt>
+<dd><p>Purge all keys with <code class="docutils literal notranslate"><span class="pre">prefix</span></code> from database.</p>
+<p>Queries all keys in the database by the given prefix and set expire time to
+zero. The default prefix will drop all keys which has been set by SearXNG
+(drops SearXNG schema entirely from database).</p>
+<p>The implementation is the lua script from string <code class="xref py py-obj docutils literal notranslate"><span class="pre">PURGE_BY_PREFIX</span></code>.
+The lua script uses <a class="reference external" href="https://redis.io/commands/expire/">EXPIRE</a> instead of <a class="reference external" href="https://redis.io/commands/del/">DEL</a>: if there are a lot keys to
+delete and/or their values are big, <cite>DEL</cite> could take more time and blocks
+the command loop while <cite>EXPIRE</cite> turns back immediate.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>prefix</strong> – prefix of the key to delete (default: <code class="docutils literal notranslate"><span class="pre">SearXNG_</span></code>)</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.redislib.secret_hash">
+<span class="sig-prename descclassname"><span class="pre">searx.redislib.</span></span><span class="sig-name descname"><span class="pre">secret_hash</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/redislib.html#secret_hash"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.redislib.secret_hash" title="Link to this definition">¶</a></dt>
+<dd><p>Creates a hash of the <code class="docutils literal notranslate"><span class="pre">name</span></code>.</p>
+<p>Combines argument <code class="docutils literal notranslate"><span class="pre">name</span></code> with the <code class="docutils literal notranslate"><span class="pre">secret_key</span></code> from <a class="reference internal" href="../admin/settings/settings_server.html#settings-server"><span class="std std-ref">server:</span></a>. This function can be used to get a more anonymized name of a Redis
+KEY.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>name</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – the name to create a secret hash for</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.redislib.LUA_SCRIPT_STORAGE">
+<span class="sig-prename descclassname"><span class="pre">searx.redislib.</span></span><span class="sig-name descname"><span class="pre">LUA_SCRIPT_STORAGE</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">{}</span></em><a class="headerlink" href="#searx.redislib.LUA_SCRIPT_STORAGE" title="Link to this definition">¶</a></dt>
+<dd><p>A global dictionary to cache client’s <code class="docutils literal notranslate"><span class="pre">Script</span></code> objects, used by
+<a class="reference internal" href="#searx.redislib.lua_script_storage" title="searx.redislib.lua_script_storage"><code class="xref py py-obj docutils literal notranslate"><span class="pre">lua_script_storage</span></code></a></p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Redis Library</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redislib.drop_counter"><code class="docutils literal notranslate"><span class="pre">drop_counter()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redislib.incr_counter"><code class="docutils literal notranslate"><span class="pre">incr_counter()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redislib.incr_sliding_window"><code class="docutils literal notranslate"><span class="pre">incr_sliding_window()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redislib.lua_script_storage"><code class="docutils literal notranslate"><span class="pre">lua_script_storage()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redislib.purge_by_prefix"><code class="docutils literal notranslate"><span class="pre">purge_by_prefix()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redislib.secret_hash"><code class="docutils literal notranslate"><span class="pre">secret_hash()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.redislib.LUA_SCRIPT_STORAGE"><code class="docutils literal notranslate"><span class="pre">LUA_SCRIPT_STORAGE</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.redisdb.html" title="previous chapter">Redis DB</a>
+ <li>Next: <a href="searx.search.html" title="next chapter">Search</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.redislib.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.search.html b/src/searx.search.html
new file mode 100644
index 000000000..28efb6092
--- /dev/null
+++ b/src/searx.search.html
@@ -0,0 +1,220 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Search &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Search processors" href="searx.search.processors.html" />
+ <link rel="prev" title="Redis Library" href="searx.redislib.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.search.processors.html" title="Search processors"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.redislib.html" title="Redis Library"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Search</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="search">
+<span id="searx-search"></span><h1>Search<a class="headerlink" href="#search" title="Link to this heading">¶</a></h1>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.EngineRef">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.</span></span><span class="sig-name descname"><span class="pre">EngineRef</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">category</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/models.html#EngineRef"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.EngineRef" title="Link to this definition">¶</a></dt>
+<dd><p>Reference by names to an engine and category</p>
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.SearchQuery">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.</span></span><span class="sig-name descname"><span class="pre">SearchQuery</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">engineref_list</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#searx.search.EngineRef" title="searx.search.models.EngineRef"><span class="pre">EngineRef</span></a><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lang</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'all'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">safesearch</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pageno</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">time_range</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout_limit</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.12)"><span class="pre">float</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">external_bang</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">redirect_to_first_result</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/models.html#SearchQuery"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.SearchQuery" title="Link to this definition">¶</a></dt>
+<dd><p>container for all the search parameters (query, language, etc…)</p>
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.Search">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.</span></span><span class="sig-name descname"><span class="pre">Search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.search.SearchQuery" title="searx.search.models.SearchQuery"><span class="pre">SearchQuery</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search.html#Search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.Search" title="Link to this definition">¶</a></dt>
+<dd><p>Search information container</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.search.Search.search_query">
+<span class="sig-name descname"><span class="pre">search_query</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference internal" href="#searx.search.SearchQuery" title="searx.search.SearchQuery"><span class="pre">searx.search.SearchQuery</span></a></em><a class="headerlink" href="#searx.search.Search.search_query" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.search.Search.result_container">
+<span class="sig-name descname"><span class="pre">result_container</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">searx.results.ResultContainer</span></em><a class="headerlink" href="#searx.search.Search.result_container" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.search.Search.search">
+<span class="sig-name descname"><span class="pre">search</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">searx.results.ResultContainer</span></span></span><a class="reference internal" href="../_modules/searx/search.html#Search.search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.Search.search" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.SearchWithPlugins">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.</span></span><span class="sig-name descname"><span class="pre">SearchWithPlugins</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.search.SearchQuery" title="searx.search.models.SearchQuery"><span class="pre">SearchQuery</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">ordered_plugin_list</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request" title="(in Flask v3.0.x)"><span class="pre">Request</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search.html#SearchWithPlugins"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.SearchWithPlugins" title="Link to this definition">¶</a></dt>
+<dd><p>Inherit from the Search class, add calls to the plugins.</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.search.SearchWithPlugins.search_query">
+<span class="sig-name descname"><span class="pre">search_query</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference internal" href="#searx.search.SearchQuery" title="searx.search.SearchQuery"><span class="pre">searx.search.SearchQuery</span></a></em><a class="headerlink" href="#searx.search.SearchWithPlugins.search_query" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.search.SearchWithPlugins.result_container">
+<span class="sig-name descname"><span class="pre">result_container</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">searx.results.ResultContainer</span></em><a class="headerlink" href="#searx.search.SearchWithPlugins.result_container" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.search.SearchWithPlugins.ordered_plugin_list">
+<span class="sig-name descname"><span class="pre">ordered_plugin_list</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a></em><a class="headerlink" href="#searx.search.SearchWithPlugins.ordered_plugin_list" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="searx.search.SearchWithPlugins.request">
+<span class="sig-name descname"><span class="pre">request</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">flask.request</span></em><a class="headerlink" href="#searx.search.SearchWithPlugins.request" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.search.SearchWithPlugins.search">
+<span class="sig-name descname"><span class="pre">search</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">searx.results.ResultContainer</span></span></span><a class="reference internal" href="../_modules/searx/search.html#SearchWithPlugins.search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.SearchWithPlugins.search" title="Link to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Search</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.search.EngineRef"><code class="docutils literal notranslate"><span class="pre">EngineRef</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.search.SearchQuery"><code class="docutils literal notranslate"><span class="pre">SearchQuery</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.search.Search"><code class="docutils literal notranslate"><span class="pre">Search</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.Search.search_query"><code class="docutils literal notranslate"><span class="pre">Search.search_query</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.Search.result_container"><code class="docutils literal notranslate"><span class="pre">Search.result_container</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.Search.search"><code class="docutils literal notranslate"><span class="pre">Search.search()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.search.SearchWithPlugins"><code class="docutils literal notranslate"><span class="pre">SearchWithPlugins</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.SearchWithPlugins.search_query"><code class="docutils literal notranslate"><span class="pre">SearchWithPlugins.search_query</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.SearchWithPlugins.result_container"><code class="docutils literal notranslate"><span class="pre">SearchWithPlugins.result_container</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.SearchWithPlugins.ordered_plugin_list"><code class="docutils literal notranslate"><span class="pre">SearchWithPlugins.ordered_plugin_list</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.SearchWithPlugins.request"><code class="docutils literal notranslate"><span class="pre">SearchWithPlugins.request</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.SearchWithPlugins.search"><code class="docutils literal notranslate"><span class="pre">SearchWithPlugins.search()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.redislib.html" title="previous chapter">Redis Library</a>
+ <li>Next: <a href="searx.search.processors.html" title="next chapter">Search processors</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.search.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.search.processors.html b/src/searx.search.processors.html
new file mode 100644
index 000000000..152be2cff
--- /dev/null
+++ b/src/searx.search.processors.html
@@ -0,0 +1,303 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Search processors &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Utility functions for the engines" href="searx.utils.html" />
+ <link rel="prev" title="Search" href="searx.search.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.utils.html" title="Utility functions for the engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searx.search.html" title="Search"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Search processors</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="search-processors">
+<span id="searx-search-processors"></span><h1>Search processors<a class="headerlink" href="#search-processors" title="Link to this heading">¶</a></h1>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#module-searx.search.processors.abstract" id="id1">Abstract processor class</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.search.processors.offline" id="id2">Offline processor</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.search.processors.online" id="id3">Online processor</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.search.processors.online_currency" id="id4">Online currency processor</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.search.processors.online_dictionary" id="id5">Online dictionary processor</a></p></li>
+<li><p><a class="reference internal" href="#module-searx.search.processors.online_url_search" id="id6">Online URL search processor</a></p></li>
+</ul>
+</nav>
+<section id="module-searx.search.processors.abstract">
+<span id="abstract-processor-class"></span><h2><a class="toc-backref" href="#id1" role="doc-backlink">Abstract processor class</a><a class="headerlink" href="#module-searx.search.processors.abstract" title="Link to this heading">¶</a></h2>
+<p>Abstract base classes for engine request processors.</p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.processors.abstract.EngineProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.processors.abstract.</span></span><span class="sig-name descname"><span class="pre">EngineProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/abstract.html#EngineProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.abstract.EngineProcessor" title="Link to this definition">¶</a></dt>
+<dd><p>Base classes used for all types of request processors.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.search.processors.abstract.EngineProcessor.get_params">
+<span class="sig-name descname"><span class="pre">get_params</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_category</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/abstract.html#EngineProcessor.get_params"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.abstract.EngineProcessor.get_params" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a set of (see <a class="reference internal" href="../dev/engines/engine_overview.html#engine-request-arguments"><span class="std std-ref">request params</span></a>) or
+<code class="docutils literal notranslate"><span class="pre">None</span></code> if request is not supported.</p>
+<p>Not supported conditions (<code class="docutils literal notranslate"><span class="pre">None</span></code> is returned):</p>
+<ul class="simple">
+<li><p>A page-number &gt; 1 when engine does not support paging.</p></li>
+<li><p>A time range when the engine does not support time range.</p></li>
+</ul>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.processors.abstract.SuspendedStatus">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.processors.abstract.</span></span><span class="sig-name descname"><span class="pre">SuspendedStatus</span></span><a class="reference internal" href="../_modules/searx/search/processors/abstract.html#SuspendedStatus"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.abstract.SuspendedStatus" title="Link to this definition">¶</a></dt>
+<dd><p>Class to handle suspend state.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.search.processors.offline">
+<span id="offline-processor"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Offline processor</a><a class="headerlink" href="#module-searx.search.processors.offline" title="Link to this heading">¶</a></h2>
+<p>Processors for engine-type: <code class="docutils literal notranslate"><span class="pre">offline</span></code></p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.processors.offline.OfflineProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.processors.offline.</span></span><span class="sig-name descname"><span class="pre">OfflineProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/offline.html#OfflineProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.offline.OfflineProcessor" title="Link to this definition">¶</a></dt>
+<dd><p>Processor class used by <code class="docutils literal notranslate"><span class="pre">offline</span></code> engines</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.search.processors.online">
+<span id="online-processor"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Online processor</a><a class="headerlink" href="#module-searx.search.processors.online" title="Link to this heading">¶</a></h2>
+<p>Processors for engine-type: <code class="docutils literal notranslate"><span class="pre">online</span></code></p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.processors.online.OnlineProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.processors.online.</span></span><span class="sig-name descname"><span class="pre">OnlineProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online.html#OnlineProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online.OnlineProcessor" title="Link to this definition">¶</a></dt>
+<dd><p>Processor class for <code class="docutils literal notranslate"><span class="pre">online</span></code> engines.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.search.processors.online.OnlineProcessor.get_params">
+<span class="sig-name descname"><span class="pre">get_params</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_category</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online.html#OnlineProcessor.get_params"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online.OnlineProcessor.get_params" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a set of <a class="reference internal" href="../dev/engines/engine_overview.html#engine-request-online"><span class="std std-ref">request params</span></a> or <code class="docutils literal notranslate"><span class="pre">None</span></code>
+if request is not supported.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.search.processors.online.default_request_params">
+<span class="sig-prename descclassname"><span class="pre">searx.search.processors.online.</span></span><span class="sig-name descname"><span class="pre">default_request_params</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online.html#default_request_params"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online.default_request_params" title="Link to this definition">¶</a></dt>
+<dd><p>Default request parameters for <code class="docutils literal notranslate"><span class="pre">online</span></code> engines.</p>
+</dd></dl>
+
+</section>
+<section id="module-searx.search.processors.online_currency">
+<span id="online-currency-processor"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Online currency processor</a><a class="headerlink" href="#module-searx.search.processors.online_currency" title="Link to this heading">¶</a></h2>
+<p>Processors for engine-type: <code class="docutils literal notranslate"><span class="pre">online_currency</span></code></p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.processors.online_currency.OnlineCurrencyProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.processors.online_currency.</span></span><span class="sig-name descname"><span class="pre">OnlineCurrencyProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online_currency.html#OnlineCurrencyProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online_currency.OnlineCurrencyProcessor" title="Link to this definition">¶</a></dt>
+<dd><p>Processor class used by <code class="docutils literal notranslate"><span class="pre">online_currency</span></code> engines.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params">
+<span class="sig-name descname"><span class="pre">get_params</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_category</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online_currency.html#OnlineCurrencyProcessor.get_params"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a set of <a class="reference internal" href="../dev/engines/engine_overview.html#engine-request-online-currency"><span class="std std-ref">request params</span></a>
+or <code class="docutils literal notranslate"><span class="pre">None</span></code> if search query does not match to <code class="xref py py-obj docutils literal notranslate"><span class="pre">parser_re</span></code>.</p>
+</dd></dl>
+
+</dd></dl>
+
+</section>
+<section id="module-searx.search.processors.online_dictionary">
+<span id="online-dictionary-processor"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Online dictionary processor</a><a class="headerlink" href="#module-searx.search.processors.online_dictionary" title="Link to this heading">¶</a></h2>
+<p>Processors for engine-type: <code class="docutils literal notranslate"><span class="pre">online_dictionary</span></code></p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.processors.online_dictionary.OnlineDictionaryProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.processors.online_dictionary.</span></span><span class="sig-name descname"><span class="pre">OnlineDictionaryProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online_dictionary.html#OnlineDictionaryProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online_dictionary.OnlineDictionaryProcessor" title="Link to this definition">¶</a></dt>
+<dd><p>Processor class used by <code class="docutils literal notranslate"><span class="pre">online_dictionary</span></code> engines.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params">
+<span class="sig-name descname"><span class="pre">get_params</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_category</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online_dictionary.html#OnlineDictionaryProcessor.get_params"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a set of <a class="reference internal" href="../dev/engines/engine_overview.html#engine-request-online-dictionary"><span class="std std-ref">request params</span></a> or
+<code class="docutils literal notranslate"><span class="pre">None</span></code> if search query does not match to <code class="xref py py-obj docutils literal notranslate"><span class="pre">parser_re</span></code>.</p>
+</dd></dl>
+
+</dd></dl>
+
+</section>
+<section id="module-searx.search.processors.online_url_search">
+<span id="online-url-search-processor"></span><h2><a class="toc-backref" href="#id6" role="doc-backlink">Online URL search processor</a><a class="headerlink" href="#module-searx.search.processors.online_url_search" title="Link to this heading">¶</a></h2>
+<p>Processors for engine-type: <code class="docutils literal notranslate"><span class="pre">online_url_search</span></code></p>
+<dl class="py class">
+<dt class="sig sig-object py" id="searx.search.processors.online_url_search.OnlineUrlSearchProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.search.processors.online_url_search.</span></span><span class="sig-name descname"><span class="pre">OnlineUrlSearchProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">engine</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online_url_search.html#OnlineUrlSearchProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online_url_search.OnlineUrlSearchProcessor" title="Link to this definition">¶</a></dt>
+<dd><p>Processor class used by <code class="docutils literal notranslate"><span class="pre">online_url_search</span></code> engines.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params">
+<span class="sig-name descname"><span class="pre">get_params</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">search_query</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine_category</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/search/processors/online_url_search.html#OnlineUrlSearchProcessor.get_params"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params" title="Link to this definition">¶</a></dt>
+<dd><p>Returns a set of <a class="reference internal" href="../dev/engines/engine_overview.html#engine-request-online"><span class="std std-ref">request params</span></a> or <code class="docutils literal notranslate"><span class="pre">None</span></code> if
+search query does not match to <code class="xref py py-obj docutils literal notranslate"><span class="pre">re_search_urls</span></code>.</p>
+</dd></dl>
+
+</dd></dl>
+
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Search processors</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.search.processors.abstract">Abstract processor class</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.abstract.EngineProcessor"><code class="docutils literal notranslate"><span class="pre">EngineProcessor</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.search.processors.abstract.EngineProcessor.get_params"><code class="docutils literal notranslate"><span class="pre">EngineProcessor.get_params()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.abstract.SuspendedStatus"><code class="docutils literal notranslate"><span class="pre">SuspendedStatus</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.search.processors.offline">Offline processor</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.offline.OfflineProcessor"><code class="docutils literal notranslate"><span class="pre">OfflineProcessor</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.search.processors.online">Online processor</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.online.OnlineProcessor"><code class="docutils literal notranslate"><span class="pre">OnlineProcessor</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.search.processors.online.OnlineProcessor.get_params"><code class="docutils literal notranslate"><span class="pre">OnlineProcessor.get_params()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.online.default_request_params"><code class="docutils literal notranslate"><span class="pre">default_request_params()</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.search.processors.online_currency">Online currency processor</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.online_currency.OnlineCurrencyProcessor"><code class="docutils literal notranslate"><span class="pre">OnlineCurrencyProcessor</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.search.processors.online_currency.OnlineCurrencyProcessor.get_params"><code class="docutils literal notranslate"><span class="pre">OnlineCurrencyProcessor.get_params()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.search.processors.online_dictionary">Online dictionary processor</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.online_dictionary.OnlineDictionaryProcessor"><code class="docutils literal notranslate"><span class="pre">OnlineDictionaryProcessor</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.search.processors.online_dictionary.OnlineDictionaryProcessor.get_params"><code class="docutils literal notranslate"><span class="pre">OnlineDictionaryProcessor.get_params()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#module-searx.search.processors.online_url_search">Online URL search processor</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#searx.search.processors.online_url_search.OnlineUrlSearchProcessor"><code class="docutils literal notranslate"><span class="pre">OnlineUrlSearchProcessor</span></code></a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#searx.search.processors.online_url_search.OnlineUrlSearchProcessor.get_params"><code class="docutils literal notranslate"><span class="pre">OnlineUrlSearchProcessor.get_params()</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="searx.utils.html">Utility functions for the engines</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.search.html" title="previous chapter">Search</a>
+ <li>Next: <a href="searx.utils.html" title="next chapter">Utility functions for the engines</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.search.processors.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/src/searx.utils.html b/src/searx.utils.html
new file mode 100644
index 000000000..bd2d91204
--- /dev/null
+++ b/src/searx.utils.html
@@ -0,0 +1,600 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Utility functions for the engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="prev" title="Search processors" href="searx.search.processors.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searx.search.processors.html" title="Search processors"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Source-Code</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Utility functions for the engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="module-searx.utils">
+<span id="utility-functions-for-the-engines"></span><span id="searx-utils"></span><h1>Utility functions for the engines<a class="headerlink" href="#module-searx.utils" title="Link to this heading">¶</a></h1>
+<p>Utility functions for the engines</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.convert_str_to_int">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">convert_str_to_int</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">number_str</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#convert_str_to_int"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.convert_str_to_int" title="Link to this definition">¶</a></dt>
+<dd><p>Convert number_str to int or 0 if number_str is not a number.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.detect_language">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">detect_language</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">text</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">threshold</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.12)"><span class="pre">float</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0.3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">only_search_languages</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#detect_language"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.detect_language" title="Link to this definition">¶</a></dt>
+<dd><p>Detect the language of the <code class="docutils literal notranslate"><span class="pre">text</span></code> parameter.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>text</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><em>str</em></a>) – The string whose language is to be detected.</p></li>
+<li><p><strong>threshold</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.12)"><em>float</em></a>) – Threshold filters the returned labels by a threshold
+on probability. A choice of 0.3 will return labels with at least 0.3
+probability.</p></li>
+<li><p><strong>only_search_languages</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><em>bool</em></a>) – If <code class="docutils literal notranslate"><span class="pre">True</span></code>, returns only supported
+SearXNG search languages. see <code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.languages</span></code></p></li>
+</ul>
+</dd>
+<dt class="field-even">Return type<span class="colon">:</span></dt>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)">str</a>, None</p>
+</dd>
+<dt class="field-odd">Returns<span class="colon">:</span></dt>
+<dd class="field-odd"><p>The detected language code or <code class="docutils literal notranslate"><span class="pre">None</span></code>. See below.</p>
+</dd>
+<dt class="field-even">Raises<span class="colon">:</span></dt>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ValueError" title="(in Python v3.12)"><strong>ValueError</strong></a> – If <code class="docutils literal notranslate"><span class="pre">text</span></code> is not a string.</p>
+</dd>
+</dl>
+<p>The language detection is done by using <a class="reference external" href="https://github.com/searxng/fasttext-predict">a fork</a> of the <a class="reference external" href="https://fasttext.cc/">fastText</a> library
+(<a class="reference external" href="https://pypi.org/project/fasttext/">python fasttext</a>). <a class="reference external" href="https://fasttext.cc/">fastText</a> distributes the <a class="reference external" href="https://fasttext.cc/docs/en/language-identification.html">language identification
+model</a>, for reference:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://arxiv.org/abs/1612.03651">FastText.zip: Compressing text classification models</a></p></li>
+<li><p><a class="reference external" href="https://arxiv.org/abs/1607.01759">Bag of Tricks for Efficient Text Classification</a></p></li>
+</ul>
+<p>The <a class="reference external" href="https://fasttext.cc/docs/en/language-identification.html">language identification model</a> support the language codes
+(ISO-639-3):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">af</span> <span class="n">als</span> <span class="n">am</span> <span class="n">an</span> <span class="n">ar</span> <span class="n">arz</span> <span class="k">as</span> <span class="n">ast</span> <span class="n">av</span> <span class="n">az</span> <span class="n">azb</span> <span class="n">ba</span> <span class="n">bar</span> <span class="n">bcl</span> <span class="n">be</span> <span class="n">bg</span> <span class="n">bh</span> <span class="n">bn</span> <span class="n">bo</span> <span class="n">bpy</span> <span class="n">br</span> <span class="n">bs</span>
+<span class="n">bxr</span> <span class="n">ca</span> <span class="n">cbk</span> <span class="n">ce</span> <span class="n">ceb</span> <span class="n">ckb</span> <span class="n">co</span> <span class="n">cs</span> <span class="n">cv</span> <span class="n">cy</span> <span class="n">da</span> <span class="n">de</span> <span class="n">diq</span> <span class="n">dsb</span> <span class="n">dty</span> <span class="n">dv</span> <span class="n">el</span> <span class="n">eml</span> <span class="n">en</span> <span class="n">eo</span> <span class="n">es</span>
+<span class="n">et</span> <span class="n">eu</span> <span class="n">fa</span> <span class="n">fi</span> <span class="n">fr</span> <span class="n">frr</span> <span class="n">fy</span> <span class="n">ga</span> <span class="n">gd</span> <span class="n">gl</span> <span class="n">gn</span> <span class="n">gom</span> <span class="n">gu</span> <span class="n">gv</span> <span class="n">he</span> <span class="n">hi</span> <span class="n">hif</span> <span class="n">hr</span> <span class="n">hsb</span> <span class="n">ht</span> <span class="n">hu</span> <span class="n">hy</span> <span class="n">ia</span>
+<span class="nb">id</span> <span class="n">ie</span> <span class="n">ilo</span> <span class="n">io</span> <span class="ow">is</span> <span class="n">it</span> <span class="n">ja</span> <span class="n">jbo</span> <span class="n">jv</span> <span class="n">ka</span> <span class="n">kk</span> <span class="n">km</span> <span class="n">kn</span> <span class="n">ko</span> <span class="n">krc</span> <span class="n">ku</span> <span class="n">kv</span> <span class="n">kw</span> <span class="n">ky</span> <span class="n">la</span> <span class="n">lb</span> <span class="n">lez</span> <span class="n">li</span>
+<span class="n">lmo</span> <span class="n">lo</span> <span class="n">lrc</span> <span class="n">lt</span> <span class="n">lv</span> <span class="n">mai</span> <span class="n">mg</span> <span class="n">mhr</span> <span class="nb">min</span> <span class="n">mk</span> <span class="n">ml</span> <span class="n">mn</span> <span class="n">mr</span> <span class="n">mrj</span> <span class="n">ms</span> <span class="n">mt</span> <span class="n">mwl</span> <span class="n">my</span> <span class="n">myv</span> <span class="n">mzn</span> <span class="n">nah</span>
+<span class="n">nap</span> <span class="n">nds</span> <span class="n">ne</span> <span class="n">new</span> <span class="n">nl</span> <span class="n">nn</span> <span class="n">no</span> <span class="n">oc</span> <span class="ow">or</span> <span class="n">os</span> <span class="n">pa</span> <span class="n">pam</span> <span class="n">pfl</span> <span class="n">pl</span> <span class="n">pms</span> <span class="n">pnb</span> <span class="n">ps</span> <span class="n">pt</span> <span class="n">qu</span> <span class="n">rm</span> <span class="n">ro</span> <span class="n">ru</span>
+<span class="n">rue</span> <span class="n">sa</span> <span class="n">sah</span> <span class="n">sc</span> <span class="n">scn</span> <span class="n">sco</span> <span class="n">sd</span> <span class="n">sh</span> <span class="n">si</span> <span class="n">sk</span> <span class="n">sl</span> <span class="n">so</span> <span class="n">sq</span> <span class="n">sr</span> <span class="n">su</span> <span class="n">sv</span> <span class="n">sw</span> <span class="n">ta</span> <span class="n">te</span> <span class="n">tg</span> <span class="n">th</span> <span class="n">tk</span> <span class="n">tl</span>
+<span class="n">tr</span> <span class="n">tt</span> <span class="n">tyv</span> <span class="n">ug</span> <span class="n">uk</span> <span class="n">ur</span> <span class="n">uz</span> <span class="n">vec</span> <span class="n">vep</span> <span class="n">vi</span> <span class="n">vls</span> <span class="n">vo</span> <span class="n">wa</span> <span class="n">war</span> <span class="n">wuu</span> <span class="n">xal</span> <span class="n">xmf</span> <span class="n">yi</span> <span class="n">yo</span> <span class="n">yue</span> <span class="n">zh</span>
+</pre></div>
+</div>
+<p>By using <code class="docutils literal notranslate"><span class="pre">only_search_languages=True</span></code> the <a class="reference external" href="https://fasttext.cc/docs/en/language-identification.html">language identification model</a>
+is harmonized with the SearXNG’s language (locale) model. General
+conditions of SearXNG’s locale model are:</p>
+<ol class="loweralpha simple">
+<li><p>SearXNG’s locale of a query is passed to the
+<a class="reference internal" href="searx.locales.html#searx.locales.get_engine_locale" title="searx.locales.get_engine_locale"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.locales.get_engine_locale</span></code></a> to get a language and/or region
+code that is used by an engine.</p></li>
+<li><p>Most of SearXNG’s engines do not support all the languages from <a class="reference external" href="https://fasttext.cc/docs/en/language-identification.html">language
+identification model</a> and there is also a discrepancy in the ISO-639-3
+(fasttext) and ISO-639-2 (SearXNG)handling. Further more, in SearXNG the
+locales like <code class="docutils literal notranslate"><span class="pre">zh-TH</span></code> (<code class="docutils literal notranslate"><span class="pre">zh-CN</span></code>) are mapped to <code class="docutils literal notranslate"><span class="pre">zh_Hant</span></code>
+(<code class="docutils literal notranslate"><span class="pre">zh_Hans</span></code>) while the <a class="reference external" href="https://fasttext.cc/docs/en/language-identification.html">language identification model</a> reduce both to
+<code class="docutils literal notranslate"><span class="pre">zh</span></code>.</p></li>
+</ol>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.dict_subset">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">dict_subset</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dictionary</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.MutableMapping" title="(in Python v3.12)"><span class="pre">MutableMapping</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">properties</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Set" title="(in Python v3.12)"><span class="pre">Set</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#dict_subset"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.dict_subset" title="Link to this definition">¶</a></dt>
+<dd><p>Extract a subset of a dict</p>
+<dl>
+<dt>Examples:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">dict_subset</span><span class="p">({</span><span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="s1">&#39;b&#39;</span><span class="p">,</span> <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="s1">&#39;c&#39;</span><span class="p">},</span> <span class="p">[</span><span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="s1">&#39;C&#39;</span><span class="p">])</span>
+<span class="go">{&#39;A&#39;: &#39;a&#39;, &#39;C&#39;: &#39;c&#39;}</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="o">&gt;&gt;</span> <span class="n">dict_subset</span><span class="p">({</span><span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="s1">&#39;b&#39;</span><span class="p">,</span> <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="s1">&#39;c&#39;</span><span class="p">},</span> <span class="p">[</span><span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="s1">&#39;D&#39;</span><span class="p">])</span>
+<span class="go">{&#39;A&#39;: &#39;a&#39;}</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.ecma_unescape">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">ecma_unescape</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">string</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#ecma_unescape"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.ecma_unescape" title="Link to this definition">¶</a></dt>
+<dd><p>Python implementation of the unescape javascript function</p>
+<p><a class="reference external" href="https://www.ecma-international.org/ecma-262/6.0/#sec-unescape-string">https://www.ecma-international.org/ecma-262/6.0/#sec-unescape-string</a>
+<a class="reference external" href="https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/unescape">https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/unescape</a></p>
+<dl>
+<dt>Examples:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">ecma_unescape</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%u</span><span class="s1">5409&#39;</span><span class="p">)</span>
+<span class="go">&#39;吉&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">ecma_unescape</span><span class="p">(</span><span class="s1">&#39;%20&#39;</span><span class="p">)</span>
+<span class="go">&#39; &#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">ecma_unescape</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%F</span><span class="s1">3&#39;</span><span class="p">)</span>
+<span class="go">&#39;ó&#39;</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.eval_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">eval_xpath</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">element</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ElementBase</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">xpath_spec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">XPath</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/utils.html#eval_xpath"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.eval_xpath" title="Link to this definition">¶</a></dt>
+<dd><p>Equivalent of element.xpath(xpath_str) but compile xpath_str once for all.
+See <a class="reference external" href="https://lxml.de/xpathxslt.html#xpath-return-values">https://lxml.de/xpathxslt.html#xpath-return-values</a></p>
+<dl class="simple">
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>element (ElementBase): [description]</p></li>
+<li><p>xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>result (bool, float, list, str): Results.</p></li>
+</ul>
+</dd>
+<dt>Raises:</dt><dd><ul class="simple">
+<li><p>TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</p></li>
+<li><p>SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</p></li>
+<li><p>SearxEngineXPathException: Raise when the XPath can’t be evaluated.</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.eval_xpath_getindex">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">eval_xpath_getindex</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">elements:</span> <span class="pre">~lxml.etree.ElementBase</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">xpath_spec:</span> <span class="pre">str</span> <span class="pre">|</span> <span class="pre">~lxml.etree.XPath</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">index:</span> <span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default=&lt;searx.utils._NotSetClass</span> <span class="pre">object&gt;</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/utils.html#eval_xpath_getindex"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.eval_xpath_getindex" title="Link to this definition">¶</a></dt>
+<dd><p>Call eval_xpath_list then get one element using the index parameter.
+If the index does not exist, either raise an exception is default is not set,
+other return the default value (can be None).</p>
+<dl class="simple">
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>elements (ElementBase): lxml element to apply the xpath.</p></li>
+<li><p>xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath.</p></li>
+<li><p>index (int): index to get</p></li>
+<li><p>default (Object, optional): Defaults if index doesn’t exist.</p></li>
+</ul>
+</dd>
+<dt>Raises:</dt><dd><ul class="simple">
+<li><p>TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</p></li>
+<li><p>SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</p></li>
+<li><p>SearxEngineXPathException: if the index is not found. Also see eval_xpath.</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>result (bool, float, list, str): Results.</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.eval_xpath_list">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">eval_xpath_list</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">element</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ElementBase</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">xpath_spec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">XPath</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_len</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/utils.html#eval_xpath_list"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.eval_xpath_list" title="Link to this definition">¶</a></dt>
+<dd><p>Same as eval_xpath, check if the result is a list</p>
+<dl class="simple">
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>element (ElementBase): [description]</p></li>
+<li><p>xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath</p></li>
+<li><p>min_len (int, optional): [description]. Defaults to None.</p></li>
+</ul>
+</dd>
+<dt>Raises:</dt><dd><ul class="simple">
+<li><p>TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</p></li>
+<li><p>SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</p></li>
+<li><p>SearxEngineXPathException: raise if the result is not a list</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>result (bool, float, list, str): Results.</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.extract_text">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">extract_text</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">xpath_results</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">allow_none</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#extract_text"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.extract_text" title="Link to this definition">¶</a></dt>
+<dd><p>Extract text from a lxml result</p>
+<ul class="simple">
+<li><p>if xpath_results is list, extract the text from each result and concat the list</p></li>
+<li><p>if xpath_results is a xml element, extract all the text node from it
+( text_content() method from lxml )</p></li>
+<li><p>if xpath_results is a string element, then it’s already done</p></li>
+</ul>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.extract_url">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">extract_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">xpath_results</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">base_url</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#extract_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.extract_url" title="Link to this definition">¶</a></dt>
+<dd><p>Extract and normalize URL from lxml Element</p>
+<dl>
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>xpath_results (Union[List[html.HtmlElement], html.HtmlElement]): lxml Element(s)</p></li>
+<li><p>base_url (str): Base URL</p></li>
+</ul>
+</dd>
+<dt>Example:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">search_url</span><span class="p">):</span>
+<span class="gp">&gt;&gt;&gt; </span> <span class="k">return</span> <span class="n">searx</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">extract_url</span><span class="p">(</span><span class="n">html</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="n">search_url</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">(</span><span class="s1">&#39;&lt;span id=&quot;42&quot;&gt;https://example.com&lt;/span&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;http://example.com/&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">(</span><span class="s1">&#39;https://example.com&#39;</span><span class="p">,</span> <span class="s1">&#39;http://example.com/&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">(</span><span class="s1">&#39;//example.com&#39;</span><span class="p">,</span> <span class="s1">&#39;http://example.com/&#39;</span><span class="p">)</span>
+<span class="go">&#39;http://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">(</span><span class="s1">&#39;//example.com&#39;</span><span class="p">,</span> <span class="s1">&#39;https://example.com/&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">(</span><span class="s1">&#39;/path?a=1&#39;</span><span class="p">,</span> <span class="s1">&#39;https://example.com&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/path?a=1&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;https://example.com&#39;</span><span class="p">)</span>
+<span class="go">raise lxml.etree.ParserError</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">searx</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">extract_url</span><span class="p">([],</span> <span class="s1">&#39;https://example.com&#39;</span><span class="p">)</span>
+<span class="go">raise ValueError</span>
+</pre></div>
+</div>
+</dd>
+<dt>Raises:</dt><dd><ul class="simple">
+<li><p>ValueError</p></li>
+<li><p>lxml.etree.ParserError</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>str: normalized URL</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.gen_useragent">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">gen_useragent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">os_string</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#gen_useragent"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.gen_useragent" title="Link to this definition">¶</a></dt>
+<dd><p>Return a random browser User Agent</p>
+<p>See searx/data/useragents.json</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.get_engine_from_settings">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">get_engine_from_settings</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Dict" title="(in Python v3.12)"><span class="pre">Dict</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#get_engine_from_settings"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.get_engine_from_settings" title="Link to this definition">¶</a></dt>
+<dd><p>Return engine configuration from settings.yml of a given engine name</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.get_torrent_size">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">get_torrent_size</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filesize</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">filesize_multiplier</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#get_torrent_size"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.get_torrent_size" title="Link to this definition">¶</a></dt>
+<dd><dl>
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>filesize (str): size</p></li>
+<li><p>filesize_multiplier (str): TB, GB, …. TiB, GiB…</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>int: number of bytes</p></li>
+</ul>
+</dd>
+<dt>Example:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">get_torrent_size</span><span class="p">(</span><span class="s1">&#39;5&#39;</span><span class="p">,</span> <span class="s1">&#39;GB&#39;</span><span class="p">)</span>
+<span class="go">5368709120</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">get_torrent_size</span><span class="p">(</span><span class="s1">&#39;3.14&#39;</span><span class="p">,</span> <span class="s1">&#39;MiB&#39;</span><span class="p">)</span>
+<span class="go">3140000</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.get_xpath">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">get_xpath</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">xpath_spec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">XPath</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">XPath</span></span></span><a class="reference internal" href="../_modules/searx/utils.html#get_xpath"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.get_xpath" title="Link to this definition">¶</a></dt>
+<dd><p>Return cached compiled XPath</p>
+<p>There is no thread lock.
+Worst case scenario, xpath_str is compiled more than one time.</p>
+<dl class="simple">
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>result (bool, float, list, str): Results.</p></li>
+</ul>
+</dd>
+<dt>Raises:</dt><dd><ul class="simple">
+<li><p>TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath</p></li>
+<li><p>SearxXPathSyntaxException: Raise when there is a syntax error in the XPath</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.html_to_text">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">html_to_text</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">html_str</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#html_to_text"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.html_to_text" title="Link to this definition">¶</a></dt>
+<dd><p>Extract text from a HTML string</p>
+<dl>
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>html_str (str): string HTML</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>str: extracted text</p></li>
+</ul>
+</dd>
+<dt>Examples:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">html_to_text</span><span class="p">(</span><span class="s1">&#39;Example &lt;span id=&quot;42&quot;&gt;#2&lt;/span&gt;&#39;</span><span class="p">)</span>
+<span class="go">&#39;Example #2&#39;</span>
+</pre></div>
+</div>
+<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">html_to_text</span><span class="p">(</span><span class="s1">&#39;&lt;style&gt;.span { color: red; }&lt;/style&gt;&lt;span&gt;Example&lt;/span&gt;&#39;</span><span class="p">)</span>
+<span class="go">&#39;Example&#39;</span>
+</pre></div>
+</div>
+<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">html_to_text</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;regexp: (?&lt;![a-zA-Z]&#39;</span><span class="p">)</span>
+<span class="go">&#39;regexp: (?&lt;![a-zA-Z]&#39;</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.humanize_bytes">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">humanize_bytes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">size</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">precision</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/utils.html#humanize_bytes"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.humanize_bytes" title="Link to this definition">¶</a></dt>
+<dd><p>Determine the <em>human readable</em> value of bytes on 1024 base (1KB=1024B).</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.int_or_zero">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">int_or_zero</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">num</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.List" title="(in Python v3.12)"><span class="pre">List</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><span class="pre">int</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#int_or_zero"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.int_or_zero" title="Link to this definition">¶</a></dt>
+<dd><p>Convert num to int or 0. num can be either a str or a list.
+If num is a list, the first element is converted to int (or return 0 if the list is empty).
+If num is a str, see convert_str_to_int</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.is_valid_lang">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">is_valid_lang</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">lang</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Tuple" title="(in Python v3.12)"><span class="pre">Tuple</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><span class="pre">bool</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.12)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#is_valid_lang"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.is_valid_lang" title="Link to this definition">¶</a></dt>
+<dd><p>Return language code and name if lang describe a language.</p>
+<dl>
+<dt>Examples:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">is_valid_lang</span><span class="p">(</span><span class="s1">&#39;zz&#39;</span><span class="p">)</span>
+<span class="go">None</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">is_valid_lang</span><span class="p">(</span><span class="s1">&#39;uk&#39;</span><span class="p">)</span>
+<span class="go">(True, &#39;uk&#39;, &#39;ukrainian&#39;)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">is_valid_lang</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;uk&#39;</span><span class="p">)</span>
+<span class="go">(True, &#39;uk&#39;, &#39;ukrainian&#39;)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">is_valid_lang</span><span class="p">(</span><span class="s1">&#39;en&#39;</span><span class="p">)</span>
+<span class="go">(True, &#39;en&#39;, &#39;english&#39;)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">searx</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">is_valid_lang</span><span class="p">(</span><span class="s1">&#39;Español&#39;</span><span class="p">)</span>
+<span class="go">(True, &#39;es&#39;, &#39;spanish&#39;)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">searx</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">is_valid_lang</span><span class="p">(</span><span class="s1">&#39;Spanish&#39;</span><span class="p">)</span>
+<span class="go">(True, &#39;es&#39;, &#39;spanish&#39;)</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.js_variable_to_python">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">js_variable_to_python</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">js_variable</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/searx/utils.html#js_variable_to_python"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.js_variable_to_python" title="Link to this definition">¶</a></dt>
+<dd><p>Convert a javascript variable into JSON and then load the value</p>
+<p>It does not deal with all cases, but it is good enough for now.
+chompjs has a better implementation.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.markdown_to_text">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">markdown_to_text</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">markdown_str</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#markdown_to_text"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.markdown_to_text" title="Link to this definition">¶</a></dt>
+<dd><p>Extract text from a Markdown string</p>
+<dl>
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>markdown_str (str): string Markdown</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>str: extracted text</p></li>
+</ul>
+</dd>
+<dt>Examples:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">markdown_to_text</span><span class="p">(</span><span class="s1">&#39;[example](https://example.com)&#39;</span><span class="p">)</span>
+<span class="go">&#39;example&#39;</span>
+</pre></div>
+</div>
+<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">markdown_to_text</span><span class="p">(</span><span class="s1">&#39;## Headline&#39;</span><span class="p">)</span>
+<span class="go">&#39;Headline&#39;</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.normalize_url">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">normalize_url</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">base_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#normalize_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.normalize_url" title="Link to this definition">¶</a></dt>
+<dd><p>Normalize URL: add protocol, join URL with base_url, add trailing slash if there is no path</p>
+<dl>
+<dt>Args:</dt><dd><ul class="simple">
+<li><p>url (str): Relative URL</p></li>
+<li><p>base_url (str): Base URL, it must be an absolute URL.</p></li>
+</ul>
+</dd>
+<dt>Example:</dt><dd><div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">normalize_url</span><span class="p">(</span><span class="s1">&#39;https://example.com&#39;</span><span class="p">,</span> <span class="s1">&#39;http://example.com/&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">normalize_url</span><span class="p">(</span><span class="s1">&#39;//example.com&#39;</span><span class="p">,</span> <span class="s1">&#39;http://example.com/&#39;</span><span class="p">)</span>
+<span class="go">&#39;http://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">normalize_url</span><span class="p">(</span><span class="s1">&#39;//example.com&#39;</span><span class="p">,</span> <span class="s1">&#39;https://example.com/&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">normalize_url</span><span class="p">(</span><span class="s1">&#39;/path?a=1&#39;</span><span class="p">,</span> <span class="s1">&#39;https://example.com&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/path?a=1&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">normalize_url</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;https://example.com&#39;</span><span class="p">)</span>
+<span class="go">&#39;https://example.com/&#39;</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">normalize_url</span><span class="p">(</span><span class="s1">&#39;/test&#39;</span><span class="p">,</span> <span class="s1">&#39;/path&#39;</span><span class="p">)</span>
+<span class="go">raise ValueError</span>
+</pre></div>
+</div>
+</dd>
+<dt>Raises:</dt><dd><ul class="simple">
+<li><p>lxml.etree.ParserError</p></li>
+</ul>
+</dd>
+<dt>Returns:</dt><dd><ul class="simple">
+<li><p>str: normalized URL</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.searx_useragent">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">searx_useragent</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#searx_useragent"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.searx_useragent" title="Link to this definition">¶</a></dt>
+<dd><p>Return the searx User Agent</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="searx.utils.to_string">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">to_string</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Any" title="(in Python v3.12)"><span class="pre">Any</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.12)"><span class="pre">str</span></a></span></span><a class="reference internal" href="../_modules/searx/utils.html#to_string"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.utils.to_string" title="Link to this definition">¶</a></dt>
+<dd><p>Convert obj to its string representation.</p>
+</dd></dl>
+
+<dl class="py data">
+<dt class="sig sig-object py" id="searx.utils.SEARCH_LANGUAGE_CODES">
+<span class="sig-prename descclassname"><span class="pre">searx.utils.</span></span><span class="sig-name descname"><span class="pre">SEARCH_LANGUAGE_CODES</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">frozenset({'af',</span> <span class="pre">'ar',</span> <span class="pre">'be',</span> <span class="pre">'bg',</span> <span class="pre">'ca',</span> <span class="pre">'cs',</span> <span class="pre">'da',</span> <span class="pre">'de',</span> <span class="pre">'el',</span> <span class="pre">'en',</span> <span class="pre">'es',</span> <span class="pre">'et',</span> <span class="pre">'fa',</span> <span class="pre">'fi',</span> <span class="pre">'fr',</span> <span class="pre">'he',</span> <span class="pre">'hi',</span> <span class="pre">'hr',</span> <span class="pre">'hu',</span> <span class="pre">'id',</span> <span class="pre">'it',</span> <span class="pre">'ja',</span> <span class="pre">'kn',</span> <span class="pre">'ko',</span> <span class="pre">'lt',</span> <span class="pre">'lv',</span> <span class="pre">'ml',</span> <span class="pre">'mr',</span> <span class="pre">'ms',</span> <span class="pre">'nb',</span> <span class="pre">'nl',</span> <span class="pre">'pl',</span> <span class="pre">'pt',</span> <span class="pre">'ro',</span> <span class="pre">'ru',</span> <span class="pre">'sk',</span> <span class="pre">'sl',</span> <span class="pre">'sv',</span> <span class="pre">'ta',</span> <span class="pre">'th',</span> <span class="pre">'tr',</span> <span class="pre">'uk',</span> <span class="pre">'ur',</span> <span class="pre">'vi',</span> <span class="pre">'zh'})</span></em><a class="headerlink" href="#searx.utils.SEARCH_LANGUAGE_CODES" title="Link to this definition">¶</a></dt>
+<dd><p>Languages supported by most searxng engines (<a class="reference internal" href="searx.locales.html#searx.sxng_locales.sxng_locales" title="searx.sxng_locales.sxng_locales"><code class="xref py py-obj docutils literal notranslate"><span class="pre">searx.sxng_locales.sxng_locales</span></code></a>).</p>
+</dd></dl>
+
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">Source-Code</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searx.babel_extract.html">Custom message extractor (i18n)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.botdetection.html">Bot Detection</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.exceptions.html">SearXNG Exceptions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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="searx.locales.html">Locales</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.tor_check.html">Tor check plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.plugins.unit_converter.html">Unit converter plugin</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redisdb.html">Redis DB</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.redislib.html">Redis Library</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.html">Search</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searx.search.processors.html">Search processors</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Utility functions for the engines</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.convert_str_to_int"><code class="docutils literal notranslate"><span class="pre">convert_str_to_int()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.detect_language"><code class="docutils literal notranslate"><span class="pre">detect_language()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.dict_subset"><code class="docutils literal notranslate"><span class="pre">dict_subset()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.ecma_unescape"><code class="docutils literal notranslate"><span class="pre">ecma_unescape()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.eval_xpath"><code class="docutils literal notranslate"><span class="pre">eval_xpath()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.eval_xpath_getindex"><code class="docutils literal notranslate"><span class="pre">eval_xpath_getindex()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.eval_xpath_list"><code class="docutils literal notranslate"><span class="pre">eval_xpath_list()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.extract_text"><code class="docutils literal notranslate"><span class="pre">extract_text()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.extract_url"><code class="docutils literal notranslate"><span class="pre">extract_url()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.gen_useragent"><code class="docutils literal notranslate"><span class="pre">gen_useragent()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.get_engine_from_settings"><code class="docutils literal notranslate"><span class="pre">get_engine_from_settings()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.get_torrent_size"><code class="docutils literal notranslate"><span class="pre">get_torrent_size()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.get_xpath"><code class="docutils literal notranslate"><span class="pre">get_xpath()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.html_to_text"><code class="docutils literal notranslate"><span class="pre">html_to_text()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.humanize_bytes"><code class="docutils literal notranslate"><span class="pre">humanize_bytes()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.int_or_zero"><code class="docutils literal notranslate"><span class="pre">int_or_zero()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.is_valid_lang"><code class="docutils literal notranslate"><span class="pre">is_valid_lang()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.js_variable_to_python"><code class="docutils literal notranslate"><span class="pre">js_variable_to_python()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.markdown_to_text"><code class="docutils literal notranslate"><span class="pre">markdown_to_text()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.normalize_url"><code class="docutils literal notranslate"><span class="pre">normalize_url()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.searx_useragent"><code class="docutils literal notranslate"><span class="pre">searx_useragent()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.to_string"><code class="docutils literal notranslate"><span class="pre">to_string()</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searx.utils.SEARCH_LANGUAGE_CODES"><code class="docutils literal notranslate"><span class="pre">SEARCH_LANGUAGE_CODES</span></code></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">Source-Code</a>
+ <ul>
+ <li>Previous: <a href="searx.search.processors.html" title="previous chapter">Search processors</a>
+ </ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/src/searx.utils.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/user/about.html b/user/about.html
new file mode 100644
index 000000000..d9c37a62b
--- /dev/null
+++ b/user/about.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>About SearXNG &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Why use a private instance?" href="../own-instance.html" />
+ <link rel="prev" title="Configured Engines" href="configured_engines.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../own-instance.html" title="Why use a private instance?"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="configured_engines.html" title="Configured Engines"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">User information</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">About SearXNG</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="about-searxng">
+<span id="about-searxng"></span><h1>About SearXNG<a class="headerlink" href="#about-searxng" title="Link to this heading">¶</a></h1>
+<p>SearXNG is a <a class="reference external" href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other
+<code class="docutils literal notranslate"><span class="pre">search</span> <span class="pre">engines</span></code> while not storing information about
+its users.</p>
+<p>The SearXNG project is driven by an open community, come join us on Matrix if
+you have questions or just want to chat about SearXNG at <a class="reference external" href="https://matrix.to/#/#searxng:matrix.org">#searxng:matrix.org</a></p>
+<p>Make SearXNG better.</p>
+<ul class="simple">
+<li><p>You can improve SearXNG translations at <a class="reference external" href="https://translate.codeberg.org/projects/searxng/">Weblate</a>, or…</p></li>
+<li><p>Track development, send contributions, and report issues at <a class="reference external" href="https://github.com/searxng/searxng">SearXNG sources</a>.</p></li>
+<li><p>To get further information, visit SearXNG’s project documentation at <a class="reference external" href="https://docs.searxng.org/">SearXNG
+docs</a>.</p></li>
+</ul>
+<section id="why-use-it">
+<h2>Why use it?<a class="headerlink" href="#why-use-it" title="Link to this heading">¶</a></h2>
+<ul class="simple">
+<li><p>SearXNG may not offer you as personalized results as Google, but it doesn’t
+generate a profile about you.</p></li>
+<li><p>SearXNG doesn’t care about what you search for, never shares anything with a
+third-party, and it can’t be used to compromise you.</p></li>
+<li><p>SearXNG is free software, the code is 100% open, and everyone is welcome to
+make it better.</p></li>
+</ul>
+<p>If you do care about privacy, want to be a conscious user, or otherwise believe
+in digital freedom, make SearXNG your default search engine or run it on your
+own server!</p>
+</section>
+<section id="how-do-i-set-it-as-the-default-search-engine">
+<h2>How do I set it as the default search engine?<a class="headerlink" href="#how-do-i-set-it-as-the-default-search-engine" title="Link to this heading">¶</a></h2>
+<p>SearXNG supports <a class="reference external" href="https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md">OpenSearch</a>. For more information on changing your default
+search engine, see your browser’s documentation:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox">Firefox</a></p></li>
+<li><p><a class="reference external" href="https://support.microsoft.com/en-us/help/4028574/microsoft-edge-change-the-default-search-engine">Microsoft Edge</a> - Behind the link, you will also find some useful instructions
+for Chrome and Safari.</p></li>
+<li><p><a class="reference external" href="https://www.chromium.org/tab-to-search">Chromium</a>-based browsers only add websites that the user navigates to without
+a path.</p></li>
+</ul>
+<p>When adding a search engine, there must be no duplicates with the same name. If
+you encounter a problem where you cannot add the search engine, you can either:</p>
+<ul class="simple">
+<li><p>remove the duplicate (default name: SearXNG) or</p></li>
+<li><p>contact the owner to give the instance a different name than the default.</p></li>
+</ul>
+</section>
+<section id="how-does-it-work">
+<h2>How does it work?<a class="headerlink" href="#how-does-it-work" title="Link to this heading">¶</a></h2>
+<p>SearXNG is a fork from the well-known <a class="reference external" href="https://github.com/searx/searx">searx</a> <a class="reference external" href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a> which was
+inspired by the <a class="reference external" href="https://beniz.github.io/seeks/">Seeks project</a>. It provides basic privacy by mixing your
+queries with searches on other platforms without storing search data. SearXNG
+can be added to your browser’s search bar; moreover, it can be set as the
+default search engine.</p>
+<p>The <code class="docutils literal notranslate"><span class="pre">stats</span> <span class="pre">page</span></code> contains some useful anonymous usage
+statistics about the engines used.</p>
+</section>
+<section id="how-can-i-make-it-my-own">
+<h2>How can I make it my own?<a class="headerlink" href="#how-can-i-make-it-my-own" title="Link to this heading">¶</a></h2>
+<p>SearXNG appreciates your concern regarding logs, so take the code from the
+<a class="reference external" href="https://github.com/searxng/searxng">SearXNG sources</a> and run it yourself!</p>
+<p>Add your instance to this <a class="reference external" href="https://searx.space">list of public
+instances</a> to help other people
+reclaim their privacy and make the internet freer. The more decentralized the
+internet is, the more freedom we have!</p>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">User information</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html">Search syntax</a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html">Configured Engines</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">About SearXNG</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#why-use-it">Why use it?</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#how-do-i-set-it-as-the-default-search-engine">How do I set it as the default search engine?</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#how-does-it-work">How does it work?</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#how-can-i-make-it-my-own">How can I make it my own?</a></li>
+</ul>
+</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"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">User information</a>
+ <ul>
+ <li>Previous: <a href="configured_engines.html" title="previous chapter">Configured Engines</a>
+ <li>Next: <a href="../own-instance.html" title="next chapter">Why use a private instance?</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/user/about.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/user/configured_engines.html b/user/configured_engines.html
new file mode 100644
index 000000000..f3d0cd592
--- /dev/null
+++ b/user/configured_engines.html
@@ -0,0 +1,3175 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Configured Engines &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="About SearXNG" href="about.html" />
+ <link rel="prev" title="Search syntax" href="search-syntax.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="about.html" title="About SearXNG"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="search-syntax.html" title="Search syntax"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">User information</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Configured Engines</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="configured-engines">
+<span id="id1"></span><h1>Configured Engines<a class="headerlink" href="#configured-engines" title="Link to this heading">¶</a></h1>
+<aside class="sidebar">
+<p class="sidebar-title">Further reading ..</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../admin/settings/settings_categories_as_tabs.html#settings-categories-as-tabs"><span class="std std-ref">categories_as_tabs:</span></a></p></li>
+<li><p><a class="reference internal" href="../dev/engines/engine_overview.html#engines-dev"><span class="std std-ref">Engine Overview</span></a></p></li>
+<li><p><a class="reference internal" href="../admin/settings/settings_engine.html#settings-engine"><span class="std std-ref">engine:</span></a></p></li>
+<li><p><a class="reference internal" href="../dev/engines/engine_overview.html#general-engine-configuration"><span class="std std-ref">General Engine Configuration</span></a></p></li>
+</ul>
+</aside>
+<p>SearXNG supports 199 search engines of which
+86 are enabled by default.</p>
+<p>Engines can be assigned to multiple <a class="reference internal" href="../admin/settings/settings_engine.html#engine-categories"><span class="std std-ref">categories</span></a>.
+The UI displays the tabs that are configured in <a class="reference internal" href="../admin/settings/settings_categories_as_tabs.html#settings-categories-as-tabs"><span class="std std-ref">categories_as_tabs</span></a>. In addition to these UI categories (also
+called <em>tabs</em>), engines can be queried by their name or the categories they
+belong to, by using a <a class="reference internal" href="search-syntax.html#search-syntax"><span class="std std-ref">!bing syntax</span></a>.</p>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#tab-general" id="id19">tab <code class="docutils literal notranslate"><span class="pre">!general</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#group-translate" id="id20">group <code class="docutils literal notranslate"><span class="pre">!translate</span></code></a></p></li>
+<li><p><a class="reference internal" href="#group-web" id="id21">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></p></li>
+<li><p><a class="reference internal" href="#group-wikimedia" id="id22">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a></p></li>
+<li><p><a class="reference internal" href="#without-further-subgrouping" id="id23">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-images" id="id24">tab <code class="docutils literal notranslate"><span class="pre">!images</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#id2" id="id25">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id3" id="id26">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-videos" id="id27">tab <code class="docutils literal notranslate"><span class="pre">!videos</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#id4" id="id28">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id5" id="id29">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-news" id="id30">tab <code class="docutils literal notranslate"><span class="pre">!news</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#id6" id="id31">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id7" id="id32">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id8" id="id33">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-map" id="id34">tab <code class="docutils literal notranslate"><span class="pre">!map</span></code></a></p></li>
+<li><p><a class="reference internal" href="#tab-music" id="id35">tab <code class="docutils literal notranslate"><span class="pre">!music</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#group-lyrics" id="id36">group <code class="docutils literal notranslate"><span class="pre">!lyrics</span></code></a></p></li>
+<li><p><a class="reference internal" href="#group-radio" id="id37">group <code class="docutils literal notranslate"><span class="pre">!radio</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id10" id="id38">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-it" id="id39">tab <code class="docutils literal notranslate"><span class="pre">!it</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#group-packages" id="id40">group <code class="docutils literal notranslate"><span class="pre">!packages</span></code></a></p></li>
+<li><p><a class="reference internal" href="#group-q-a" id="id41">group <code class="docutils literal notranslate"><span class="pre">!q&amp;a</span></code></a></p></li>
+<li><p><a class="reference internal" href="#group-repos" id="id42">group <code class="docutils literal notranslate"><span class="pre">!repos</span></code></a></p></li>
+<li><p><a class="reference internal" href="#group-software-wikis" id="id43">group <code class="docutils literal notranslate"><span class="pre">!software_wikis</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id13" id="id44">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-science" id="id45">tab <code class="docutils literal notranslate"><span class="pre">!science</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#group-scientific-publications" id="id46">group <code class="docutils literal notranslate"><span class="pre">!scientific_publications</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id14" id="id47">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id16" id="id48">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-files" id="id49">tab <code class="docutils literal notranslate"><span class="pre">!files</span></code></a></p>
+<ul>
+<li><p><a class="reference internal" href="#group-apps" id="id50">group <code class="docutils literal notranslate"><span class="pre">!apps</span></code></a></p></li>
+<li><p><a class="reference internal" href="#id17" id="id51">without further subgrouping</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#tab-social-media" id="id52">tab <code class="docutils literal notranslate"><span class="pre">!social_media</span></code></a></p></li>
+</ul>
+</nav>
+<section id="tab-general">
+<h2><a class="toc-backref" href="#id19" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!general</span></code></a><a class="headerlink" href="#tab-general" title="Link to this heading">¶</a></h2>
+<section id="group-translate">
+<h3><a class="toc-backref" href="#id20" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!translate</span></code></a><a class="headerlink" href="#group-translate" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://dictzone.com/">dictzone</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!dc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/dictzone.py">dictzone</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>100</p></td>
+<td colspan="4"><p> not applicable (online_dictionary)</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://libretranslate.com">libretranslate</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!lt</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/libretranslate.py">libretranslate</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td colspan="4"><p> not applicable (online_dictionary)</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://lingva.ml">lingva</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!lv</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/lingva.py">lingva</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td colspan="4"><p> not applicable (online_dictionary)</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://codeberg.org/aryak/mozhi">mozhi</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mz</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/mozhi.py">mozhi</a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td colspan="4"><p> not applicable (online_dictionary)</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://mymemory.translated.net/">mymemory translated</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!tl</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/translated.py">translated</a></p></td>
+<td></td>
+<td><p>5.0</p></td>
+<td><p>100</p></td>
+<td colspan="4"><p> not applicable (online_dictionary)</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="group-web">
+<h3><a class="toc-backref" href="#id21" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a><a class="headerlink" href="#group-web" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.bing.com">bing</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bi</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/bing.html#module-searx.engines.bing" title="searx.engines.bing"><code class="xref py py-mod docutils literal notranslate"><span class="pre">bing</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://search.brave.com/">brave</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!br</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/brave.html#module-searx.engines.brave" title="searx.engines.brave"><code class="xref py py-mod docutils literal notranslate"><span class="pre">brave</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://lite.duckduckgo.com/lite/">duckduckgo</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ddg</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo" title="searx.engines.duckduckgo"><code class="xref py py-mod docutils literal notranslate"><span class="pre">duckduckgo</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.google.com">google</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!go</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/google.html#module-searx.engines.google" title="searx.engines.google"><code class="xref py py-mod docutils literal notranslate"><span class="pre">google</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.mojeek.com/">mojeek</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mjk</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://presearch.io">presearch</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ps</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/presearch.html#module-searx.engines.presearch" title="searx.engines.presearch"><code class="xref py py-mod docutils literal notranslate"><span class="pre">presearch</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://presearch.io">presearch videos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!psvid</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/presearch.html#module-searx.engines.presearch" title="searx.engines.presearch"><code class="xref py py-mod docutils literal notranslate"><span class="pre">presearch</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.qwant.com/">qwant</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!qw</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/qwant.html#module-searx.engines.qwant" title="searx.engines.qwant"><code class="xref py py-mod docutils literal notranslate"><span class="pre">qwant</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://startpage.com">startpage</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!sp</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/startpage.html#module-searx.engines.startpage" title="searx.engines.startpage"><code class="xref py py-mod docutils literal notranslate"><span class="pre">startpage</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>6.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://wiby.me/">wiby</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wib</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://search.yahoo.com/">yahoo</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yh</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/yahoo.html#module-searx.engines.yahoo" title="searx.engines.yahoo"><code class="xref py py-mod docutils literal notranslate"><span class="pre">yahoo</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.seznam.cz/">seznam</a>
+(CZ)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!szn</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/seznam.py">seznam</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://search.goo.ne.jp">goo</a>
+(JA)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!goo</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.naver.com/">naver</a>
+(KO)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!nvr</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="group-wikimedia">
+<h3><a class="toc-backref" href="#id22" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a><a class="headerlink" href="#group-wikimedia" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.wikibooks.org/">wikibooks</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wb</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>0.5</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.wikiquote.org/">wikiquote</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wq</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>0.5</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.wikisource.org/">wikisource</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ws</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>0.5</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://species.wikimedia.org/">wikispecies</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wsp</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.wikiversity.org/">wikiversity</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wv</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>0.5</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.wikivoyage.org/">wikivoyage</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wy</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>0.5</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="without-further-subgrouping">
+<h3><a class="toc-backref" href="#id23" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#without-further-subgrouping" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://alexandria.org/">alexandria</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!alx</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>1.5</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.ask.com/">ask</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ask</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/ask.py">ask</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://crowdview.ai/">crowdview</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!cv</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://curlie.org/">curlie</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!cl</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://duckduckgo.com/">currency</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!cc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/currency_convert.py">currency_convert</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>100</p></td>
+<td colspan="4"><p> not applicable (online_currency)</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://duckduckgo.com/">ddg definitions</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ddd</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_definitions" title="searx.engines.duckduckgo_definitions"><code class="xref py py-mod docutils literal notranslate"><span class="pre">duckduckgo_definitions</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>2</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://github.com/mwmbl/mwmbl">mwmbl</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mwm</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/mwmbl.html#module-searx.engines.mwmbl" title="searx.engines.mwmbl"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mwmbl</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://searchmysite.net">searchmysite</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!sms</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://stract.com/">stract</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!str</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/stract.py">stract</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://tineye.com">tineye</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!tin</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online_url_search/tineye.html#module-searx.engines.tineye" title="searx.engines.tineye"><code class="xref py py-mod docutils literal notranslate"><span class="pre">tineye</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>9.0</p></td>
+<td><p>1</p></td>
+<td colspan="4"><p> not applicable (online_url_search)</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://wikidata.org/">wikidata</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wd</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/wikipedia.html#module-searx.engines.wikidata" title="searx.engines.wikidata"><code class="xref py py-mod docutils literal notranslate"><span class="pre">wikidata</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>2</p></td>
+<td></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.wikipedia.org/">wikipedia</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wp</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/wikipedia.html#module-searx.engines.wikipedia" title="searx.engines.wikipedia"><code class="xref py py-mod docutils literal notranslate"><span class="pre">wikipedia</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.wolframalpha.com/">wolframalpha</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wa</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wolframalpha_noapi.py">wolframalpha_noapi</a></p></td>
+<td><p>y</p></td>
+<td><p>6.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://yacy.net/">yacy</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ya</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/yacy.html#module-searx.engines.yacy" title="searx.engines.yacy"><code class="xref py py-mod docutils literal notranslate"><span class="pre">yacy</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://yep.com/">yep</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yep</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/yep.py">yep</a></p></td>
+<td><p>y</p></td>
+<td><p>5</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.bahn.de">bahnhof</a>
+(DE)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bf</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.bpb.de">bpb</a>
+(DE)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bpb</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/bpb.html#module-searx.engines.bpb" title="searx.engines.bpb"><code class="xref py py-mod docutils literal notranslate"><span class="pre">bpb</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://tagesschau.de">tagesschau</a>
+(DE)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ts</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/tagesschau.html#module-searx.engines.tagesschau" title="searx.engines.tagesschau"><code class="xref py py-mod docutils literal notranslate"><span class="pre">tagesschau</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://wikimini.org/">wikimini</a>
+(FR)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wkmn</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-images">
+<h2><a class="toc-backref" href="#id24" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!images</span></code></a><a class="headerlink" href="#tab-images" title="Link to this heading">¶</a></h2>
+<section id="id2">
+<h3><a class="toc-backref" href="#id25" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a><a class="headerlink" href="#id2" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.bing.com/images">bing images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bii</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/bing.html#module-searx.engines.bing_images" title="searx.engines.bing_images"><code class="xref py py-mod docutils literal notranslate"><span class="pre">bing_images</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://search.brave.com/">brave.images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!brimg</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/brave.html#module-searx.engines.brave" title="searx.engines.brave"><code class="xref py py-mod docutils literal notranslate"><span class="pre">brave</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://duckduckgo.com/">duckduckgo images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ddi</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_extra" title="searx.engines.duckduckgo_extra"><code class="xref py py-mod docutils literal notranslate"><span class="pre">duckduckgo_extra</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://images.google.com">google images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!goi</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/google.html#module-searx.engines.google_images" title="searx.engines.google_images"><code class="xref py py-mod docutils literal notranslate"><span class="pre">google_images</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://presearch.io">presearch images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!psimg</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/presearch.html#module-searx.engines.presearch" title="searx.engines.presearch"><code class="xref py py-mod docutils literal notranslate"><span class="pre">presearch</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.qwant.com/">qwant images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!qwi</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/qwant.html#module-searx.engines.qwant" title="searx.engines.qwant"><code class="xref py py-mod docutils literal notranslate"><span class="pre">qwant</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id3">
+<h3><a class="toc-backref" href="#id26" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#id3" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://1x.com/">1x</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!1x</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/www1x.py">www1x</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.artic.edu">artic</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!arc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/artic.py">artic</a></p></td>
+<td></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.deviantart.com/">deviantart</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!da</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/deviantart.py">deviantart</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.flickr.com">flickr</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!fl</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/flickr_noapi.py">flickr_noapi</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://frinkiac.com">frinkiac</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!frk</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/frinkiac.py">frinkiac</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://imgur.com/">imgur</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!img</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/imgur.py">imgur</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.loc.gov/pictures/">library of congress</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!loc</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/loc.html#module-searx.engines.loc" title="searx.engines.loc"><code class="xref py py-mod docutils literal notranslate"><span class="pre">loc</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://fonts.google.com/icons">material icons</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mi</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/material_icons.py">material_icons</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://wordpress.org/openverse/">openverse</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!opv</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/openverse.py">openverse</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.pinterest.com/">pinterest</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!pin</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/pinterest.py">pinterest</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.svgrepo.com">svgrepo</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!svg</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/svgrepo.py">svgrepo</a></p></td>
+<td><p>y</p></td>
+<td><p>10.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://unsplash.com">unsplash</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!us</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/unsplash.py">unsplash</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://wallhaven.cc/">wallhaven</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wh</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/wallhaven.html#module-searx.engines.wallhaven" title="searx.engines.wallhaven"><code class="xref py py-mod docutils literal notranslate"><span class="pre">wallhaven</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://commons.wikimedia.org/">wikicommons.images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wikicommons.py">wikicommons</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://yacy.net/">yacy images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yai</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/yacy.html#module-searx.engines.yacy" title="searx.engines.yacy"><code class="xref py py-mod docutils literal notranslate"><span class="pre">yacy</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://yep.com/">yep images</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yepi</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/yep.py">yep</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://seekr.com/">seekr images</a>
+(EN)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!seimg</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/seekr.html#module-searx.engines.seekr" title="searx.engines.seekr"><code class="xref py py-mod docutils literal notranslate"><span class="pre">seekr</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-videos">
+<h2><a class="toc-backref" href="#id27" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!videos</span></code></a><a class="headerlink" href="#tab-videos" title="Link to this heading">¶</a></h2>
+<section id="id4">
+<h3><a class="toc-backref" href="#id28" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a><a class="headerlink" href="#id4" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.bing.com/videos">bing videos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!biv</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/bing.html#module-searx.engines.bing_videos" title="searx.engines.bing_videos"><code class="xref py py-mod docutils literal notranslate"><span class="pre">bing_videos</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://search.brave.com/">brave.videos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!brvid</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/brave.html#module-searx.engines.brave" title="searx.engines.brave"><code class="xref py py-mod docutils literal notranslate"><span class="pre">brave</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://duckduckgo.com/">duckduckgo videos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ddv</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_extra" title="searx.engines.duckduckgo_extra"><code class="xref py py-mod docutils literal notranslate"><span class="pre">duckduckgo_extra</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.google.com">google videos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gov</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/google.html#module-searx.engines.google_videos" title="searx.engines.google_videos"><code class="xref py py-mod docutils literal notranslate"><span class="pre">google_videos</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.qwant.com/">qwant videos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!qwv</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/qwant.html#module-searx.engines.qwant" title="searx.engines.qwant"><code class="xref py py-mod docutils literal notranslate"><span class="pre">qwant</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id5">
+<h3><a class="toc-backref" href="#id29" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#id5" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.bilibili.com">bilibili</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bil</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/bilibili.py">bilibili</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.dailymotion.com">dailymotion</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!dm</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/dailymotion.html#module-searx.engines.dailymotion" title="searx.engines.dailymotion"><code class="xref py py-mod docutils literal notranslate"><span class="pre">dailymotion</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://play.google.com/">google play movies</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gpm</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/google_play.py">google_play</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://api.invidious.io/">invidious</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!iv</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/invidious.py">invidious</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://live.space">livespace</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ls</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/livespace.py">livespace</a></p></td>
+<td><p>y</p></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://media.ccc.de">media.ccc.de</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!c3tv</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/ccc_media.py">ccc_media</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://odysee.com/">odysee</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!od</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/odysee.html#module-searx.engines.odysee" title="searx.engines.odysee"><code class="xref py py-mod docutils literal notranslate"><span class="pre">odysee</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://joinpeertube.org">peertube</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ptb</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/peertube.html#module-searx.engines.peertube" title="searx.engines.peertube"><code class="xref py py-mod docutils literal notranslate"><span class="pre">peertube</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>6.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://github.com/TeamPiped/Piped/">piped</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ppd</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/piped.html#module-searx.engines.piped" title="searx.engines.piped"><code class="xref py py-mod docutils literal notranslate"><span class="pre">piped</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://rumble.com/">rumble</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ru</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/rumble.py">rumble</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://sepiasearch.org">sepiasearch</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!sep</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/peertube.html#module-searx.engines.sepiasearch" title="searx.engines.sepiasearch"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sepiasearch</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://vimeo.com/">vimeo</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!vm</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/vimeo.py">vimeo</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://commons.wikimedia.org/">wikicommons.videos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wcv</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wikicommons.py">wikicommons</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.youtube.com/">youtube</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yt</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/youtube_noapi.py">youtube_noapi</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://mediathekviewweb.de/">mediathekviewweb</a>
+(DE)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mvw</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/mediathekviewweb.py">mediathekviewweb</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://seekr.com/">seekr videos</a>
+(EN)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!sevid</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/seekr.html#module-searx.engines.seekr" title="searx.engines.seekr"><code class="xref py py-mod docutils literal notranslate"><span class="pre">seekr</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.ina.fr/">ina</a>
+(FR)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!in</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/ina.py">ina</a></p></td>
+<td><p>y</p></td>
+<td><p>6.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-news">
+<h2><a class="toc-backref" href="#id30" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!news</span></code></a><a class="headerlink" href="#tab-news" title="Link to this heading">¶</a></h2>
+<section id="id6">
+<h3><a class="toc-backref" href="#id31" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a><a class="headerlink" href="#id6" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://duckduckgo.com/">duckduckgo news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ddn</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/duckduckgo.html#module-searx.engines.duckduckgo_extra" title="searx.engines.duckduckgo_extra"><code class="xref py py-mod docutils literal notranslate"><span class="pre">duckduckgo_extra</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://presearch.io">presearch news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!psnews</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/presearch.html#module-searx.engines.presearch" title="searx.engines.presearch"><code class="xref py py-mod docutils literal notranslate"><span class="pre">presearch</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id7">
+<h3><a class="toc-backref" href="#id32" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a><a class="headerlink" href="#id7" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.wikinews.org/">wikinews</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wn</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id8">
+<h3><a class="toc-backref" href="#id33" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#id8" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.bing.com/news">bing news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bin</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/bing.html#module-searx.engines.bing_news" title="searx.engines.bing_news"><code class="xref py py-mod docutils literal notranslate"><span class="pre">bing_news</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://search.brave.com/">brave.news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!brnews</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/brave.html#module-searx.engines.brave" title="searx.engines.brave"><code class="xref py py-mod docutils literal notranslate"><span class="pre">brave</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://news.google.com">google news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gon</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/google.html#module-searx.engines.google_news" title="searx.engines.google_news"><code class="xref py py-mod docutils literal notranslate"><span class="pre">google_news</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.qwant.com/">qwant news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!qwn</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/qwant.html#module-searx.engines.qwant" title="searx.engines.qwant"><code class="xref py py-mod docutils literal notranslate"><span class="pre">qwant</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://news.yahoo.com">yahoo news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yhn</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/yahoo_news.py">yahoo_news</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://yep.com/">yep news</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yepn</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/yep.py">yep</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://tagesschau.de">tagesschau</a>
+(DE)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ts</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/tagesschau.html#module-searx.engines.tagesschau" title="searx.engines.tagesschau"><code class="xref py py-mod docutils literal notranslate"><span class="pre">tagesschau</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://seekr.com/">seekr news</a>
+(EN)</p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!senews</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/seekr.html#module-searx.engines.seekr" title="searx.engines.seekr"><code class="xref py py-mod docutils literal notranslate"><span class="pre">seekr</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-map">
+<h2><a class="toc-backref" href="#id34" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!map</span></code></a><a class="headerlink" href="#tab-map" title="Link to this heading">¶</a></h2>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.apple.com/maps/">apple maps</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!apm</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/apple_maps.py">apple_maps</a></p></td>
+<td><p>y</p></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.openstreetmap.org/">openstreetmap</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!osm</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/openstreetmap.py">openstreetmap</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://photon.komoot.io">photon</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ph</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/photon.py">photon</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="tab-music">
+<h2><a class="toc-backref" href="#id35" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!music</span></code></a><a class="headerlink" href="#tab-music" title="Link to this heading">¶</a></h2>
+<section id="group-lyrics">
+<h3><a class="toc-backref" href="#id36" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!lyrics</span></code></a><a class="headerlink" href="#group-lyrics" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://genius.com/">genius</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gen</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/genius.py">genius</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="group-radio">
+<h3><a class="toc-backref" href="#id37" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!radio</span></code></a><a class="headerlink" href="#group-radio" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.radio-browser.info/">radio browser</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!rb</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/radio_browser.html#module-searx.engines.radio_browser" title="searx.engines.radio_browser"><code class="xref py py-mod docutils literal notranslate"><span class="pre">radio_browser</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id10">
+<h3><a class="toc-backref" href="#id38" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#id10" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://bandcamp.com/">bandcamp</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/bandcamp.py">bandcamp</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://deezer.com">deezer</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!dz</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/deezer.py">deezer</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://gpodder.net">gpodder</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gpod</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://api.invidious.io/">invidious</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!iv</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/invidious.py">invidious</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.mixcloud.com/">mixcloud</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/mixcloud.py">mixcloud</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://github.com/TeamPiped/Piped/">piped.music</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ppdm</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/piped.html#module-searx.engines.piped" title="searx.engines.piped"><code class="xref py py-mod docutils literal notranslate"><span class="pre">piped</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://soundcloud.com">soundcloud</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!sc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/soundcloud.py">soundcloud</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://commons.wikimedia.org/">wikicommons.audio</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wca</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wikicommons.py">wikicommons</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.youtube.com/">youtube</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!yt</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/youtube_noapi.py">youtube_noapi</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-it">
+<h2><a class="toc-backref" href="#id39" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!it</span></code></a><a class="headerlink" href="#tab-it" title="Link to this heading">¶</a></h2>
+<section id="group-packages">
+<h3><a class="toc-backref" href="#id40" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!packages</span></code></a><a class="headerlink" href="#group-packages" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://hub.docker.com">docker hub</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!dh</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/docker_hub.py">docker_hub</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://hex.pm/">hex</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!hex</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/hex.py">hex</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://hoogle.haskell.org/">hoogle</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ho</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://lib.rs">lib.rs</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!lrs</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/lib_rs.py">lib_rs</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://metacpan.org/">metacpan</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!cpan</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/metacpan.py">metacpan</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://npms.io/">npm</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!npm</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/npm.py">npm</a></p></td>
+<td><p>y</p></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://packagist.org">packagist</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!pack</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://pkg.go.dev/">pkg.go.dev</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!pgo</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/pkg_go_dev.py">pkg_go_dev</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://pub.dev/">pub.dev</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!pd</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://pypi.org">pypi</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!pypi</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/pypi.py">pypi</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://rubygems.org/">rubygems</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!rbg</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://voidlinux.org/packages/">voidlinux</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!void</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/void.html#module-searx.engines.voidlinux" title="searx.engines.voidlinux"><code class="xref py py-mod docutils literal notranslate"><span class="pre">voidlinux</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="group-q-a">
+<h3><a class="toc-backref" href="#id41" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!q&amp;a</span></code></a><a class="headerlink" href="#group-q-a" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://stackexchange.com">askubuntu</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ubuntu</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/stackexchange.py">stackexchange</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://stackexchange.com">stackoverflow</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!st</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/stackexchange.py">stackexchange</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://stackexchange.com">superuser</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!su</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/stackexchange.py">stackexchange</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="group-repos">
+<h3><a class="toc-backref" href="#id42" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!repos</span></code></a><a class="headerlink" href="#group-repos" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://bitbucket.org/">bitbucket</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bb</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://codeberg.org/">codeberg</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!cb</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://github.com/">github</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gh</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/github.py">github</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://about.gitlab.com/">gitlab</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gl</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td><p>y</p></td>
+<td><p>10.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://sr.ht">sourcehut</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!srht</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="group-software-wikis">
+<h3><a class="toc-backref" href="#id43" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!software_wikis</span></code></a><a class="headerlink" href="#group-software-wikis" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://wiki.archlinux.org/">arch linux wiki</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!al</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/archlinux.html#module-searx.engines.archlinux" title="searx.engines.archlinux"><code class="xref py py-mod docutils literal notranslate"><span class="pre">archlinux</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://directory.fsf.org/">free software directory</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!fsd</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://wiki.gentoo.org/">gentoo</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ge</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/gentoo.py">gentoo</a></p></td>
+<td></td>
+<td><p>10.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id13">
+<h3><a class="toc-backref" href="#id44" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#id13" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="{}">anaconda</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!conda</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>6.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://en.cppreference.com/">cppreference</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!cpp</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/cppreference.py">cppreference</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://habr.com/">habrahabr</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!habr</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://news.ycombinator.com/">hackernews</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!hn</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/hackernews.py">hackernews</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://lobste.rs/">lobste.rs</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!lo</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.mankier.com/">mankier</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!man</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://developer.mozilla.org">mdn</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mdn</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://searchcode.com/">searchcode code</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!scc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/searchcode_code.py">searchcode_code</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-science">
+<h2><a class="toc-backref" href="#id45" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!science</span></code></a><a class="headerlink" href="#tab-science" title="Link to this heading">¶</a></h2>
+<section id="group-scientific-publications">
+<h3><a class="toc-backref" href="#id46" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!scientific_publications</span></code></a><a class="headerlink" href="#group-scientific-publications" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://arxiv.org">arxiv</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!arx</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/arxiv.py">arxiv</a></p></td>
+<td></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.crossref.org/">crossref</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!cr</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/crossref.py">crossref</a></p></td>
+<td><p>y</p></td>
+<td><p>30</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://scholar.google.com">google scholar</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gos</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/google.html#module-searx.engines.google_scholar" title="searx.engines.google_scholar"><code class="xref py py-mod docutils literal notranslate"><span class="pre">google_scholar</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://scholar.archive.org/">internetarchivescholar</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!ias</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/internet_archive_scholar.py">internet_archive_scholar</a></p></td>
+<td></td>
+<td><p>15.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.ncbi.nlm.nih.gov/pubmed/">pubmed</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!pub</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/pubmed.py">pubmed</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.semanticscholar.org/">semantic scholar</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!se</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/semantic_scholar.py">semantic_scholar</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id14">
+<h3><a class="toc-backref" href="#id47" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a><a class="headerlink" href="#id14" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://species.wikimedia.org/">wikispecies</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wsp</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/mediawiki.html#module-searx.engines.mediawiki" title="searx.engines.mediawiki"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mediawiki</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id16">
+<h3><a class="toc-backref" href="#id48" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#id16" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.openaire.eu/">openairedatasets</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!oad</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.openaire.eu/">openairepublications</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!oap</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/json_engine.py">json_engine</a></p></td>
+<td></td>
+<td><p>5.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.ebi.ac.uk/pdbe">pdbe</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!pdb</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/pdbe.py">pdbe</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-files">
+<h2><a class="toc-backref" href="#id49" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!files</span></code></a><a class="headerlink" href="#tab-files" title="Link to this heading">¶</a></h2>
+<section id="group-apps">
+<h3><a class="toc-backref" href="#id50" role="doc-backlink">group <code class="docutils literal notranslate"><span class="pre">!apps</span></code></a><a class="headerlink" href="#group-apps" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.apkmirror.com">apk mirror</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!apkm</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/apkmirror.py">apkmirror</a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.apple.com/app-store/">apple app store</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!aps</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/apple_app_store.py">apple_app_store</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://f-droid.org/">fdroid</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!fd</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/fdroid.py">fdroid</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://play.google.com/">google play apps</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!gpa</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/google_play.py">google_play</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="id17">
+<h3><a class="toc-backref" href="#id51" role="doc-backlink">without further subgrouping</a><a class="headerlink" href="#id17" title="Link to this heading">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://1337x.to/">1337x</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!1337x</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/1337x.py">1337x</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://annas-archive.org/">annas archive</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!aa</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/annas_archive.html#module-searx.engines.annas_archive" title="searx.engines.annas_archive"><code class="xref py py-mod docutils literal notranslate"><span class="pre">annas_archive</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://bt4gprx.com">bt4g</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bt4g</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/bt4g.html#module-searx.engines.bt4g" title="searx.engines.bt4g"><code class="xref py py-mod docutils literal notranslate"><span class="pre">bt4g</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td><p>y</p></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://btdig.com">btdigg</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!bt</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/btdigg.py">btdigg</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://kickasstorrents.to">kickass</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!kc</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/kickass.py">kickass</a></p></td>
+<td></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://libgen.fun/">library genesis</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!lg</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>7.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://nyaa.si/">nyaa</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!nt</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/nyaa.py">nyaa</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://openrepos.net/">openrepos</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!or</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/xpath.html#module-searx.engines.xpath" title="searx.engines.xpath"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xpath</span></code></a></p></td>
+<td><p>y</p></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://thepiratebay.org">piratebay</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!tpb</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/piratebay.py">piratebay</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.solidtorrents.to/">solidtorrents</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!solid</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/solidtorrents.py">solidtorrents</a></p></td>
+<td></td>
+<td><p>4.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.tokyotosho.info/">tokyotoshokan</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!tt</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/tokyotoshokan.py">tokyotoshokan</a></p></td>
+<td><p>y</p></td>
+<td><p>6.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://commons.wikimedia.org/">wikicommons.files</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!wcf</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/wikicommons.py">wikicommons</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://zlibrary-global.se">z-library</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!zlib</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/zlibrary.html#module-searx.engines.zlibrary" title="searx.engines.zlibrary"><code class="xref py py-mod docutils literal notranslate"><span class="pre">zlibrary</span></code></a></p></td>
+<td></td>
+<td><p>7.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+<section id="tab-social-media">
+<h2><a class="toc-backref" href="#id52" role="doc-backlink">tab <code class="docutils literal notranslate"><span class="pre">!social_media</span></code></a><a class="headerlink" href="#tab-social-media" title="Link to this heading">¶</a></h2>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 35.7%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+<col style="width: 3.6%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head stub" colspan="6"><p> Engines configured by default (in <a class="reference internal" href="../dev/engines/engine_overview.html#engine-settings"><span class="std std-ref">settings.yml</span></a>)</p></th>
+<th class="head" colspan="4"><p> <a class="reference internal" href="../dev/engines/engine_overview.html#engine-file"><span class="std std-ref">Supported features</span></a></p></th>
+</tr>
+<tr class="row-even"><th class="head stub"><p>Name</p></th>
+<th class="head"><p>!bang</p></th>
+<th class="head"><p>Module</p></th>
+<th class="head"><p>Disabled</p></th>
+<th class="head"><p>Timeout</p></th>
+<th class="head"><p>Weight</p></th>
+<th class="head"><p>Paging</p></th>
+<th class="head"><p>Locale</p></th>
+<th class="head"><p>Safe search</p></th>
+<th class="head"><p>Time range</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://9gag.com/">9gag</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!9g</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/9gag.py">9gag</a></p></td>
+<td><p>y</p></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://lemmy.ml/">lemmy comments</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!lecom</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/lemmy.html#module-searx.engines.lemmy" title="searx.engines.lemmy"><code class="xref py py-mod docutils literal notranslate"><span class="pre">lemmy</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://lemmy.ml/">lemmy communities</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!leco</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/lemmy.html#module-searx.engines.lemmy" title="searx.engines.lemmy"><code class="xref py py-mod docutils literal notranslate"><span class="pre">lemmy</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://lemmy.ml/">lemmy posts</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!lepo</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/lemmy.html#module-searx.engines.lemmy" title="searx.engines.lemmy"><code class="xref py py-mod docutils literal notranslate"><span class="pre">lemmy</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://lemmy.ml/">lemmy users</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!leus</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/lemmy.html#module-searx.engines.lemmy" title="searx.engines.lemmy"><code class="xref py py-mod docutils literal notranslate"><span class="pre">lemmy</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td><p>y</p></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://joinmastodon.org/">mastodon hashtags</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mah</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/mastodon.html#module-searx.engines.mastodon" title="searx.engines.mastodon"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mastodon</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://joinmastodon.org/">mastodon users</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!mau</span></code></p></td>
+<td><p><a class="reference internal" href="../dev/engines/online/mastodon.html#module-searx.engines.mastodon" title="searx.engines.mastodon"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mastodon</span></code></a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-even"><th class="stub"><p><a class="reference external" href="https://www.reddit.com/">reddit</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!re</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/reddit.py">reddit</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr class="row-odd"><th class="stub"><p><a class="reference external" href="https://www.tootfinder.ch">tootfinder</a></p></th>
+<td><p><code class="docutils literal notranslate"><span class="pre">!toot</span></code></p></td>
+<td><p><a class="reference external" href="https://github.com/searxng/searxng/blob/master/searx/engines/tootfinder.py">tootfinder</a></p></td>
+<td></td>
+<td><p>3.0</p></td>
+<td><p>1</p></td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">User information</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html">Search syntax</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Configured Engines</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#tab-general">tab <code class="docutils literal notranslate"><span class="pre">!general</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#group-translate">group <code class="docutils literal notranslate"><span class="pre">!translate</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#group-web">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#group-wikimedia">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#without-further-subgrouping">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-images">tab <code class="docutils literal notranslate"><span class="pre">!images</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#id2">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id3">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-videos">tab <code class="docutils literal notranslate"><span class="pre">!videos</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#id4">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id5">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-news">tab <code class="docutils literal notranslate"><span class="pre">!news</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#id6">group <code class="docutils literal notranslate"><span class="pre">!web</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id7">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id8">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-map">tab <code class="docutils literal notranslate"><span class="pre">!map</span></code></a></li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-music">tab <code class="docutils literal notranslate"><span class="pre">!music</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#group-lyrics">group <code class="docutils literal notranslate"><span class="pre">!lyrics</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#group-radio">group <code class="docutils literal notranslate"><span class="pre">!radio</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id10">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-it">tab <code class="docutils literal notranslate"><span class="pre">!it</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#group-packages">group <code class="docutils literal notranslate"><span class="pre">!packages</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#group-q-a">group <code class="docutils literal notranslate"><span class="pre">!q&amp;a</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#group-repos">group <code class="docutils literal notranslate"><span class="pre">!repos</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#group-software-wikis">group <code class="docutils literal notranslate"><span class="pre">!software_wikis</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id13">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-science">tab <code class="docutils literal notranslate"><span class="pre">!science</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#group-scientific-publications">group <code class="docutils literal notranslate"><span class="pre">!scientific_publications</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id14">group <code class="docutils literal notranslate"><span class="pre">!wikimedia</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id16">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-files">tab <code class="docutils literal notranslate"><span class="pre">!files</span></code></a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#group-apps">group <code class="docutils literal notranslate"><span class="pre">!apps</span></code></a></li>
+<li class="toctree-l4"><a class="reference internal" href="#id17">without further subgrouping</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#tab-social-media">tab <code class="docutils literal notranslate"><span class="pre">!social_media</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="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"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">User information</a>
+ <ul>
+ <li>Previous: <a href="search-syntax.html" title="previous chapter">Search syntax</a>
+ <li>Next: <a href="about.html" title="next chapter">About SearXNG</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/user/configured_engines.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/user/index.html b/user/index.html
new file mode 100644
index 000000000..952daac12
--- /dev/null
+++ b/user/index.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>User information &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Search syntax" href="search-syntax.html" />
+ <link rel="prev" title="Welcome to SearXNG" href="../index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="search-syntax.html" title="Search syntax"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../index.html" title="Welcome to SearXNG"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">User information</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="user-information">
+<h1>User information<a class="headerlink" href="#user-information" title="Link to this heading">¶</a></h1>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="search-syntax.html">Search syntax</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html#select-engine-and-category"><code class="docutils literal notranslate"><span class="pre">!</span></code> select engine and category</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html#select-language"><code class="docutils literal notranslate"><span class="pre">:</span></code> select language</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html#bang-external-bangs"><code class="docutils literal notranslate"><span class="pre">!!&lt;bang&gt;</span></code> external bangs</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html#automatic-redirect"><code class="docutils literal notranslate"><span class="pre">!!</span></code> automatic redirect</a></li>
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html#special-queries">Special Queries</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="configured_engines.html">Configured Engines</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-general">tab <code class="docutils literal notranslate"><span class="pre">!general</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-images">tab <code class="docutils literal notranslate"><span class="pre">!images</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-videos">tab <code class="docutils literal notranslate"><span class="pre">!videos</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-news">tab <code class="docutils literal notranslate"><span class="pre">!news</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-map">tab <code class="docutils literal notranslate"><span class="pre">!map</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-music">tab <code class="docutils literal notranslate"><span class="pre">!music</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-it">tab <code class="docutils literal notranslate"><span class="pre">!it</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-science">tab <code class="docutils literal notranslate"><span class="pre">!science</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-files">tab <code class="docutils literal notranslate"><span class="pre">!files</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html#tab-social-media">tab <code class="docutils literal notranslate"><span class="pre">!social_media</span></code></a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="about.html">About SearXNG</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="about.html#why-use-it">Why use it?</a></li>
+<li class="toctree-l2"><a class="reference internal" href="about.html#how-do-i-set-it-as-the-default-search-engine">How do I set it as the default search engine?</a></li>
+<li class="toctree-l2"><a class="reference internal" href="about.html#how-does-it-work">How does it work?</a></li>
+<li class="toctree-l2"><a class="reference internal" href="about.html#how-can-i-make-it-my-own">How can I make it my own?</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="current reference internal" href="#">User information</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="search-syntax.html">Search syntax</a></li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html">Configured Engines</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li>Previous: <a href="../index.html" title="previous chapter">Welcome to SearXNG</a>
+ <li>Next: <a href="search-syntax.html" title="next chapter">Search syntax</a>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/user/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/user/search-syntax.html b/user/search-syntax.html
new file mode 100644
index 000000000..a4a8a6009
--- /dev/null
+++ b/user/search-syntax.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Search syntax &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Configured Engines" href="configured_engines.html" />
+ <link rel="prev" title="User information" href="index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="configured_engines.html" title="Configured Engines"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="User information"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">User information</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Search syntax</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="search-syntax">
+<span id="search-syntax"></span><h1>Search syntax<a class="headerlink" href="#search-syntax" title="Link to this heading">¶</a></h1>
+<p>SearXNG comes with a search syntax by with you can modify the categories,
+engines, languages and more. See the <code class="docutils literal notranslate"><span class="pre">preferences</span></code> for
+the list of engines, categories and languages.</p>
+<section id="select-engine-and-category">
+<h2><code class="docutils literal notranslate"><span class="pre">!</span></code> select engine and category<a class="headerlink" href="#select-engine-and-category" title="Link to this heading">¶</a></h2>
+<p>To set category and/or engine names use a <code class="docutils literal notranslate"><span class="pre">!</span></code> prefix. To give a few examples:</p>
+<ul class="simple">
+<li><p>search in Wikipedia for <strong>paris</strong></p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">!wp</span> <span class="pre">paris</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">!wikipedia</span> <span class="pre">paris</span></code></p></li>
+</ul>
+</li>
+<li><p>search in category <strong>map</strong> for <strong>paris</strong></p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">!map</span> <span class="pre">paris</span></code></p></li>
+</ul>
+</li>
+<li><p>image search</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">!images</span> <span class="pre">Wau</span> <span class="pre">Holland</span></code></p></li>
+</ul>
+</li>
+</ul>
+<p>Abbreviations of the engines and languages are also accepted. Engine/category
+modifiers are chain able and inclusive. E.g. with <code class="docutils literal notranslate"><span class="pre">!map</span> <span class="pre">!ddg</span> <span class="pre">!wp</span> <span class="pre">paris</span></code> search in map category and DuckDuckGo and Wikipedia for <strong>paris</strong>.</p>
+</section>
+<section id="select-language">
+<h2><code class="docutils literal notranslate"><span class="pre">:</span></code> select language<a class="headerlink" href="#select-language" title="Link to this heading">¶</a></h2>
+<p>To select language filter use a <code class="docutils literal notranslate"><span class="pre">:</span></code> prefix. To give an example:</p>
+<ul class="simple">
+<li><p>search Wikipedia by a custom language</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">:fr</span> <span class="pre">!wp</span> <span class="pre">Wau</span> <span class="pre">Holland</span></code></p></li>
+</ul>
+</li>
+</ul>
+</section>
+<section id="bang-external-bangs">
+<h2><code class="docutils literal notranslate"><span class="pre">!!&lt;bang&gt;</span></code> external bangs<a class="headerlink" href="#bang-external-bangs" title="Link to this heading">¶</a></h2>
+<p>SearXNG supports the external bangs from <a class="reference external" href="https://duckduckgo.com/bang">DuckDuckGo</a>. To directly jump to a
+external search page use the <code class="docutils literal notranslate"><span class="pre">!!</span></code> prefix. To give an example:</p>
+<ul class="simple">
+<li><p>search Wikipedia by a custom language</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">!!wfr</span> <span class="pre">Wau</span> <span class="pre">Holland</span></code></p></li>
+</ul>
+</li>
+</ul>
+<p>Please note, your search will be performed directly in the external search
+engine, SearXNG cannot protect your privacy on this.</p>
+</section>
+<section id="automatic-redirect">
+<h2><code class="docutils literal notranslate"><span class="pre">!!</span></code> automatic redirect<a class="headerlink" href="#automatic-redirect" title="Link to this heading">¶</a></h2>
+<p>When mentioning <code class="docutils literal notranslate"><span class="pre">!!</span></code> within the search query (separated by spaces), you will
+automatically be redirected to the first result. This behavior is comparable to
+the “Feeling Lucky” feature from DuckDuckGo. To give an example:</p>
+<ul class="simple">
+<li><p>search for a query and get redirected to the first result</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">!!</span> <span class="pre">Wau</span> <span class="pre">Holland</span></code></p></li>
+</ul>
+</li>
+</ul>
+<p>Please keep in mind that the result you are being redirected to can’t become
+verified for being trustworthy, SearXNG cannot protect your personal privacy
+when using this feature. Use it at your own risk.</p>
+</section>
+<section id="special-queries">
+<h2>Special Queries<a class="headerlink" href="#special-queries" title="Link to this heading">¶</a></h2>
+<p>In the <code class="docutils literal notranslate"><span class="pre">preferences</span></code> page you find keywords for
+<em>special queries</em>. To give a few examples:</p>
+<ul class="simple">
+<li><p>generate a random UUID</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">random</span> <span class="pre">uuid</span></code></p></li>
+</ul>
+</li>
+<li><p>find the average</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">avg</span> <span class="pre">123</span> <span class="pre">548</span> <span class="pre">2.04</span> <span class="pre">24.2</span></code></p></li>
+</ul>
+</li>
+<li><p>show <em>user agent</em> of your browser (needs to be activated)</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">user-agent</span></code></p></li>
+</ul>
+</li>
+<li><p>convert strings to different hash digests (needs to be activated)</p>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">md5</span> <span class="pre">lorem</span> <span class="pre">ipsum</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">sha512</span> <span class="pre">lorem</span> <span class="pre">ipsum</span></code></p></li>
+</ul>
+</li>
+</ul>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">User information</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Search syntax</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#select-engine-and-category"><code class="docutils literal notranslate"><span class="pre">!</span></code> select engine and category</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#select-language"><code class="docutils literal notranslate"><span class="pre">:</span></code> select language</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#bang-external-bangs"><code class="docutils literal notranslate"><span class="pre">!!&lt;bang&gt;</span></code> external bangs</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#automatic-redirect"><code class="docutils literal notranslate"><span class="pre">!!</span></code> automatic redirect</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#special-queries">Special Queries</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="configured_engines.html">Configured Engines</a></li>
+<li class="toctree-l2"><a class="reference internal" href="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"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../utils/index.html">DevOps tooling box</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">User information</a>
+ <ul>
+ <li>Previous: <a href="index.html" title="previous chapter">User information</a>
+ <li>Next: <a href="configured_engines.html" title="next chapter">Configured Engines</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/user/search-syntax.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/utils/index.html b/utils/index.html
new file mode 100644
index 000000000..b1f60b5a9
--- /dev/null
+++ b/utils/index.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>DevOps tooling box &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="utils/searxng.sh" href="searxng.sh.html" />
+ <link rel="prev" title="searxng_extra/standalone_searx.py" href="../dev/searxng_extra/standalone_searx.py.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="searxng.sh.html" title="utils/searxng.sh"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="../dev/searxng_extra/standalone_searx.py.html" title="searxng_extra/standalone_searx.py"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">DevOps tooling box</a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="devops-tooling-box">
+<span id="toolboxing"></span><span id="searx-utils"></span><h1>DevOps tooling box<a class="headerlink" href="#devops-tooling-box" title="Link to this heading">¶</a></h1>
+<p>In the folder <a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/">git://utils/</a> we maintain some tools useful for administrators
+and developers.</p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="searxng.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searxng.sh.html#install">Install</a></li>
+<li class="toctree-l2"><a class="reference internal" href="searxng.sh.html#command-help">Command Help</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="lxc.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a><ul>
+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#install-lxd">Install LXD</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#searxng-lxc-suite">SearXNG LXC suite</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#setup-searxng-buildhost">Setup SearXNG buildhost</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#command-help">Command Help</a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html#searxng-suite-config">SearXNG suite config</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<section id="common-command-environments">
+<h2>Common command environments<a class="headerlink" href="#common-command-environments" title="Link to this heading">¶</a></h2>
+<p>The scripts in our tooling box often dispose of common environments:</p>
+<dl id="force-timeout">
+<dt><code class="docutils literal notranslate"><span class="pre">FORCE_TIMEOUT</span></code><span class="classifier">environment</span></dt><dd><p>Sets timeout for interactive prompts. If you want to run a script in batch
+job, with defaults choices, set <code class="docutils literal notranslate"><span class="pre">FORCE_TIMEOUT=0</span></code>. By example; to install a
+SearXNG server and nginx proxy on all containers of the <a class="reference internal" href="lxc.sh.html#lxc-searxng-env"><span class="std std-ref">SearXNG suite</span></a> use:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="o">-</span><span class="n">H</span> <span class="o">./</span><span class="n">utils</span><span class="o">/</span><span class="n">lxc</span><span class="o">.</span><span class="n">sh</span> <span class="n">cmd</span> <span class="o">--</span> <span class="n">FORCE_TIMEOUT</span><span class="o">=</span><span class="mi">0</span> <span class="o">./</span><span class="n">utils</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">sh</span> <span class="n">install</span> <span class="nb">all</span>
+<span class="n">sudo</span> <span class="o">-</span><span class="n">H</span> <span class="o">./</span><span class="n">utils</span><span class="o">/</span><span class="n">lxc</span><span class="o">.</span><span class="n">sh</span> <span class="n">cmd</span> <span class="o">--</span> <span class="n">FORCE_TIMEOUT</span><span class="o">=</span><span class="mi">0</span> <span class="o">./</span><span class="n">utils</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">sh</span> <span class="n">install</span> <span class="n">nginx</span>
+</pre></div>
+</div>
+</dd>
+</dl>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">DevOps tooling box</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="searxng.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="#common-command-environments">Common command environments</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li>Previous: <a href="../dev/searxng_extra/standalone_searx.py.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">searxng_extra/standalone_searx.py</span></code></a>
+ <li>Next: <a href="searxng.sh.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/utils/index.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/utils/lxc.sh.html b/utils/lxc.sh.html
new file mode 100644
index 000000000..88856a56a
--- /dev/null
+++ b/utils/lxc.sh.html
@@ -0,0 +1,520 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>utils/lxc.sh &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="Source-Code" href="../src/index.html" />
+ <link rel="prev" title="utils/searxng.sh" href="searxng.sh.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="../src/index.html" title="Source-Code"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="searxng.sh.html" title="utils/searxng.sh"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">DevOps tooling box</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="utils-lxc-sh">
+<span id="lxc-sh"></span><h1><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code><a class="headerlink" href="#utils-lxc-sh" title="Link to this heading">¶</a></h1>
+<p>With the use of <em>Linux Containers</em> (<a class="reference external" href="https://linuxcontainers.org/lxc/introduction/">LXC</a>) we can scale our tasks over a stack of
+containers, what we call the: <em>lxc suite</em>. The <a class="reference internal" href="#lxc-searxng-env"><span class="std std-ref">SearXNG suite config</span></a> is
+loaded by default, every time you start the <code class="docutils literal notranslate"><span class="pre">lxc.sh</span></code> script (<em>you do not need
+to care about</em>).</p>
+<aside class="sidebar">
+<p class="sidebar-title">further reading</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://snapcraft.io">snap</a>, <a class="reference external" href="https://snapcraft.io/lxd">snapcraft LXD</a></p></li>
+<li><p><a class="reference external" href="https://linuxcontainers.org/lxc/introduction/">LXC</a>, <a class="reference external" href="https://linuxcontainers.org/lxd/introduction/">LXD</a></p></li>
+<li><p><a class="reference external" href="https://uk.images.linuxcontainers.org/">LXC/LXD Image Server</a></p></li>
+<li><p><a class="reference external" href="https://github.com/lxc/lxd">LXD&#64;github</a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#install-lxd" id="id5">Install LXD</a></p>
+<ul>
+<li><p><a class="reference internal" href="#internet-connectivity-docker" id="id6">Internet Connectivity &amp; Docker</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#searxng-lxc-suite" id="id7">SearXNG LXC suite</a></p>
+<ul>
+<li><p><a class="reference internal" href="#running-commands" id="id8">Running commands</a></p></li>
+<li><p><a class="reference internal" href="#good-to-know" id="id9">Good to know</a></p></li>
+<li><p><a class="reference internal" href="#install-suite" id="id10">Install suite</a></p></li>
+<li><p><a class="reference internal" href="#clean-up" id="id11">Clean up</a></p></li>
+</ul>
+</li>
+<li><p><a class="reference internal" href="#setup-searxng-buildhost" id="id12">Setup SearXNG buildhost</a></p></li>
+<li><p><a class="reference internal" href="#command-help" id="id13">Command Help</a></p></li>
+<li><p><a class="reference internal" href="#searxng-suite-config" id="id14">SearXNG suite config</a></p></li>
+</ul>
+</nav>
+<section id="install-lxd">
+<span id="lxd-install"></span><h2><a class="toc-backref" href="#id5" role="doc-backlink">Install LXD</a><a class="headerlink" href="#install-lxd" title="Link to this heading">¶</a></h2>
+<p>Before you can start with containers, you need to install and initiate <a class="reference external" href="https://linuxcontainers.org/lxd/introduction/">LXD</a>
+once:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ snap install lxd
+$ lxd init --auto
+</pre></div>
+</div>
+<p>To make use of the containers from the <em>SearXNG suite</em>, you have to build the
+<a class="reference internal" href="#lxc-sh-help"><span class="std std-ref">LXC suite containers</span></a> initial. But be warned, <strong>this might
+take some time</strong>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh build
+</pre></div>
+</div>
+<aside class="sidebar">
+<p class="sidebar-title">hint</p>
+<p>If you have issues with the internet connectivity of your containers read
+section <a class="reference internal" href="#internet-connectivity-docker"><span class="std std-ref">Internet Connectivity &amp; Docker</span></a>.</p>
+</aside>
+<p>A cup of coffee later, your LXC suite is build up and you can run whatever task
+you want / in a selected or even in all <a class="reference internal" href="#lxc-sh-help"><span class="std std-ref">LXC suite containers</span></a>.</p>
+<section id="internet-connectivity-docker">
+<span id="id1"></span><h3><a class="toc-backref" href="#id6" role="doc-backlink">Internet Connectivity &amp; Docker</a><a class="headerlink" href="#internet-connectivity-docker" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/docker/for-linux/issues/103">Docker blocking network of existing LXC containers</a></p></li>
+<li><p><a class="reference external" href="https://fralef.me/docker-and-iptables.html">Docker and IPtables (fralef.me)</a></p></li>
+<li><p><a class="reference external" href="https://docs.docker.com/network/iptables/#docker-on-a-router/">Docker and iptables (docker.com)</a></p></li>
+</ul>
+</aside>
+<p>There is a conflict in the <code class="docutils literal notranslate"><span class="pre">iptables</span></code> setup of Docker &amp; LXC. If you have
+docker installed, you may find that the internet connectivity of your LXD
+containers no longer work.</p>
+<p>Whenever docker is started (reboot) it sets the iptables policy for the
+<code class="docutils literal notranslate"><span class="pre">FORWARD</span></code> chain to <code class="docutils literal notranslate"><span class="pre">DROP</span></code> <a class="reference external" href="https://docs.docker.com/network/iptables/#docker-on-a-router">[ref]</a>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H iptables-save | grep FORWARD
+:FORWARD ACCEPT [7048:7851230]
+:FORWARD DROP [7048:7851230]
+</pre></div>
+</div>
+<p>A handy solution of this problem might be to reset the policy for the
+<code class="docutils literal notranslate"><span class="pre">FORWARD</span></code> chain after the network has been initialized. For this create a
+file in the <code class="docutils literal notranslate"><span class="pre">if-up</span></code> section of the network (<code class="docutils literal notranslate"><span class="pre">/etc/network/if-up.d/iptable</span></code>)
+and insert the following lines:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="ch">#!/bin/sh</span>
+<span class="n">iptables</span> <span class="o">-</span><span class="n">F</span> <span class="n">FORWARD</span>
+<span class="n">iptables</span> <span class="o">-</span><span class="n">P</span> <span class="n">FORWARD</span> <span class="n">ACCEPT</span>
+</pre></div>
+</div>
+<p>Don’t forget to set the execution bit:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">chmod</span> <span class="n">ugo</span><span class="o">+</span><span class="n">x</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">network</span><span class="o">/</span><span class="k">if</span><span class="o">-</span><span class="n">up</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">iptable</span>
+</pre></div>
+</div>
+<p>Reboot your system and check the iptables rules:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H iptables-save | grep FORWARD
+:FORWARD ACCEPT [7048:7851230]
+:FORWARD ACCEPT [7048:7851230]
+</pre></div>
+</div>
+</section>
+</section>
+<section id="searxng-lxc-suite">
+<span id="id2"></span><h2><a class="toc-backref" href="#id7" role="doc-backlink">SearXNG LXC suite</a><a class="headerlink" href="#searxng-lxc-suite" title="Link to this heading">¶</a></h2>
+<p>The intention of the <em>SearXNG LXC suite</em> is to build up a suite of containers
+for development tasks or <a class="reference internal" href="#setup-searxng-buildhost"><span class="std std-ref">buildhosts</span></a> with a very
+small set of simple commands. At the end of the <code class="docutils literal notranslate"><span class="pre">--help</span></code> output the SearXNG
+suite from the <a class="reference internal" href="#lxc-searxng-env"><span class="std std-ref">SearXNG suite config</span></a> is introduced:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh --help
+...
+LXC suite: searxng
+ Suite includes installation of SearXNG
+ images: ubu2004 ubu2204 fedora35 archlinux
+ containers: searxng-ubu2004 searxng-ubu2204 searxng-fedora35 searxng-archlinux
+</pre></div>
+</div>
+<p>As shown above there are images and containers build up on this images. To show
+more info about the containers in the <em>SearXNG LXC suite</em> call <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">suite</span></code>.
+If this is the first time you make use of the SearXNG LXC suite, no containers
+are installed and the output is:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh show suite
+
+LXC suite (searxng-*)
+=====================
+
++------+-------+------+------+------+-----------+
+| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
++------+-------+------+------+------+-----------+
+
+WARN: container searxng-ubu2004 does not yet exists
+WARN: container searxng-ubu2204 does not yet exists
+WARN: container searxng-fedora35 does not yet exists
+WARN: container searxng-archlinux does not yet exists
+</pre></div>
+</div>
+<p>If you do not want to run a command or a build in all containers, <strong>you can
+build just one</strong>. Here by example in the container that is build upon the
+<em>archlinux</em> image:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh build searxng-archlinux
+$ sudo -H ./utils/lxc.sh cmd searxng-archlinux pwd
+</pre></div>
+</div>
+<p>Otherwise, to apply a command to all containers you can use:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh build
+$ sudo -H ./utils/lxc.sh cmd -- ls -la .
+</pre></div>
+</div>
+<section id="running-commands">
+<h3><a class="toc-backref" href="#id8" role="doc-backlink">Running commands</a><a class="headerlink" href="#running-commands" title="Link to this heading">¶</a></h3>
+<p><strong>Inside containers, you can run scripts</strong> from the <a class="reference internal" href="index.html#toolboxing"><span class="std std-ref">DevOps tooling box</span></a> or run
+what ever command you need. By example, to start a bash use:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh cmd searxng-archlinux bash
+INFO: [searxng-archlinux] bash
+[root@searxng-archlinux SearXNG]#
+</pre></div>
+</div>
+</section>
+<section id="good-to-know">
+<span id="id3"></span><h3><a class="toc-backref" href="#id9" role="doc-backlink">Good to know</a><a class="headerlink" href="#good-to-know" title="Link to this heading">¶</a></h3>
+<p>Each container shares the root folder of the repository and the command
+<code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span> <span class="pre">cmd</span></code> <strong>handle relative path names transparent</strong>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ pwd
+/share/SearXNG
+
+$ sudo -H ./utils/lxc.sh cmd searxng-archlinux pwd
+INFO: [searxng-archlinux] pwd
+/share/SearXNG
+</pre></div>
+</div>
+<p>The path <code class="docutils literal notranslate"><span class="pre">/share/SearXNG</span></code> will be different on your HOST system. The commands
+in the container are executed by the <code class="docutils literal notranslate"><span class="pre">root</span></code> inside of the container. Compare
+output of:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ ls -li Makefile
+47712402 -rw-rw-r-- 1 markus markus 2923 Apr 19 13:52 Makefile
+
+$ sudo -H ./utils/lxc.sh cmd searxng-archlinux ls -li Makefile
+INFO: [searxng-archlinux] ls -li Makefile
+47712402 -rw-rw-r-- 1 root root 2923 Apr 19 11:52 Makefile
+...
+</pre></div>
+</div>
+<p>Since the path <code class="docutils literal notranslate"><span class="pre">/share/SearXNG</span></code> of the HOST system is wrapped into the
+container under the same name, the shown <code class="docutils literal notranslate"><span class="pre">Makefile</span></code> (inode <code class="docutils literal notranslate"><span class="pre">47712402</span></code>) in
+the output is always the identical <code class="docutils literal notranslate"><span class="pre">/share/SearXNG/Makefile</span></code> from the HOST
+system. In the example shown above the owner of the path in the container is
+the <code class="docutils literal notranslate"><span class="pre">root</span></code> user of the container (and the timezone in the container is
+different to HOST system).</p>
+</section>
+<section id="install-suite">
+<span id="lxc-sh-install-suite"></span><h3><a class="toc-backref" href="#id10" role="doc-backlink">Install suite</a><a class="headerlink" href="#install-suite" title="Link to this heading">¶</a></h3>
+<aside class="sidebar">
+<p class="sidebar-title">further read</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../dev/lxcdev.html#working-in-containers"><span class="std std-ref">In containers, work as usual</span></a></p></li>
+<li><p><a class="reference internal" href="index.html#force-timeout"><span class="std std-ref">FORCE_TIMEOUT</span></a></p></li>
+</ul>
+</aside>
+<p>To install the complete <a class="reference internal" href="#lxc-searxng-env"><span class="std std-ref">SearXNG suite</span></a> into <strong>all</strong> <a class="reference external" href="https://linuxcontainers.org/lxc/introduction/">LXC</a>
+containers leave the container argument empty and run:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh build
+$ sudo -H ./utils/lxc.sh install suite
+</pre></div>
+</div>
+<p>To <em>build &amp; install</em> suite only in one container you can use by example:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh build searxng-archlinux
+$ sudo -H ./utils/lxc.sh install suite searxng-archlinux
+</pre></div>
+</div>
+<p>The command above installs a SearXNG suite (see <a class="reference internal" href="../admin/installation-scripts.html#installation-scripts"><span class="std std-ref">Installation Script</span></a>).
+To <a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">install a nginx</span></a> reverse proxy (or alternatively
+use <a class="reference internal" href="../admin/installation-apache.html#installation-apache"><span class="std std-ref">apache</span></a>):</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
+</pre></div>
+</div>
+<p>Same operation just in one container of the suite:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh cmd searxng-archlinux FORCE_TIMEOUT=0 ./utils/searxng.sh install nginx
+</pre></div>
+</div>
+<p>The <a class="reference internal" href="index.html#force-timeout"><span class="std std-ref">FORCE_TIMEOUT</span></a> environment is set to zero to run the
+script without user interaction.</p>
+<p>To get the IP (URL) of the SearXNG service in the containers use <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">suite</span></code>
+command. To test instances from containers just open the URLs in your
+WEB-Browser:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo ./utils/lxc.sh show suite | grep SEARXNG_URL
+
+[searxng-ubu2110] SEARXNG_URL : http://n.n.n.170/searxng
+[searxng-ubu2004] SEARXNG_URL : http://n.n.n.160/searxng
+[searxnggfedora35] SEARXNG_URL : http://n.n.n.150/searxng
+[searxng-archlinux] SEARXNG_URL : http://n.n.n.140/searxng
+</pre></div>
+</div>
+</section>
+<section id="clean-up">
+<h3><a class="toc-backref" href="#id11" role="doc-backlink">Clean up</a><a class="headerlink" href="#clean-up" title="Link to this heading">¶</a></h3>
+<p>If there comes the time you want to <strong>get rid off all</strong> the containers and
+<strong>clean up local images</strong> just type:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo -H ./utils/lxc.sh remove
+$ sudo -H ./utils/lxc.sh remove images
+</pre></div>
+</div>
+</section>
+</section>
+<section id="setup-searxng-buildhost">
+<span id="id4"></span><h2><a class="toc-backref" href="#id12" role="doc-backlink">Setup SearXNG buildhost</a><a class="headerlink" href="#setup-searxng-buildhost" title="Link to this heading">¶</a></h2>
+<p>You can <strong>install the SearXNG buildhost environment</strong> into one or all containers.
+The installation procedure to set up a <a class="reference internal" href="../admin/buildhosts.html#buildhosts"><span class="std std-ref">build host</span></a> takes its
+time. Installation in all containers will take more time (time for another cup
+of coffee).</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="o">-</span><span class="n">H</span> <span class="o">./</span><span class="n">utils</span><span class="o">/</span><span class="n">lxc</span><span class="o">.</span><span class="n">sh</span> <span class="n">cmd</span> <span class="o">--</span> <span class="o">./</span><span class="n">utils</span><span class="o">/</span><span class="n">searxng</span><span class="o">.</span><span class="n">sh</span> <span class="n">install</span> <span class="n">buildhost</span>
+</pre></div>
+</div>
+<p>To build (live) documentation inside a <a class="reference external" href="https://www.archlinux.org/">archlinux</a> container:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="o">-</span><span class="n">H</span> <span class="o">./</span><span class="n">utils</span><span class="o">/</span><span class="n">lxc</span><span class="o">.</span><span class="n">sh</span> <span class="n">cmd</span> <span class="n">searxng</span><span class="o">-</span><span class="n">archlinux</span> <span class="n">make</span> <span class="n">docs</span><span class="o">.</span><span class="n">clean</span> <span class="n">docs</span><span class="o">.</span><span class="n">live</span>
+<span class="o">...</span>
+<span class="p">[</span><span class="n">I</span> <span class="mi">200331</span> <span class="mi">15</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">42</span> <span class="n">server</span><span class="p">:</span><span class="mi">296</span><span class="p">]</span> <span class="n">Serving</span> <span class="n">on</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="mf">0.0.0.0</span><span class="p">:</span><span class="mi">8080</span>
+</pre></div>
+</div>
+<p>To get IP of the container and the port number <em>live docs</em> is listening:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sudo ./utils/lxc.sh show suite | grep docs.live
+...
+[searxng-archlinux] INFO: (eth0) docs.live: http://n.n.n.140:8080/
+</pre></div>
+</div>
+</section>
+<section id="command-help">
+<span id="lxc-sh-help"></span><h2><a class="toc-backref" href="#id13" role="doc-backlink">Command Help</a><a class="headerlink" href="#command-help" title="Link to this heading">¶</a></h2>
+<p>The <code class="docutils literal notranslate"><span class="pre">--help</span></code> output of the script is largely self-explanatory:</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>usage::
+ lxc.sh build [containers|&lt;name&gt;]
+ lxc.sh copy [images]
+ lxc.sh remove [containers|&lt;name&gt;|images]
+ lxc.sh [start|stop] [containers|&lt;name&gt;]
+ lxc.sh show [images|suite|info|config [&lt;name&gt;]]
+ lxc.sh cmd [--|&lt;name&gt;] &#39;...&#39;
+ lxc.sh install [suite|base [&lt;name&gt;]]
+
+build
+ :containers: build, launch all containers and &#39;install base&#39; packages
+ :&lt;name&gt;: build, launch container &lt;name&gt; and &#39;install base&#39; packages
+copy:
+ :images: copy remote images of the suite into local storage
+remove
+ :containers: delete all &#39;containers&#39; or only &lt;container-name&gt;
+ :images: delete local images of the suite
+start/stop
+ :containers: start/stop all &#39;containers&#39; from the suite
+ :&lt;name&gt;: start/stop container &lt;name&gt; from suite
+show
+ :info: show info of all (or &lt;name&gt;) containers from LXC suite
+ :config: show config of all (or &lt;name&gt;) containers from the LXC suite
+ :suite: show services of all (or &lt;name&gt;) containers from the LXC suite
+ :images: show information of local images
+cmd
+ use single quotes to evaluate in container&#39;s bash, e.g.: &#39;echo $(hostname)&#39;
+ -- run command &#39;...&#39; in all containers of the LXC suite
+ :&lt;name&gt;: run command &#39;...&#39; in container &lt;name&gt;
+install
+ :base: prepare LXC; install basic packages
+ :suite: install LXC searxng suite into all (or &lt;name&gt;) containers
+
+LXC suite: searxng
+ Suite includes installation of SearXNG
+ images: ubu2004 ubu2204 fedora35 archlinux
+ containers: searxng-ubu2004 searxng-ubu2204 searxng-fedora35 searxng-archlinux
+</pre></div>
+</div>
+</section>
+<section id="searxng-suite-config">
+<span id="lxc-searxng-env"></span><h2><a class="toc-backref" href="#id14" role="doc-backlink">SearXNG suite config</a><a class="headerlink" href="#searxng-suite-config" title="Link to this heading">¶</a></h2>
+<p>The SearXNG suite is defined in the file <a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/lxc-searxng.env">git://utils/lxc-searxng.env</a>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-</span>
+<span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
+<span class="c1"># shellcheck shell=bash</span>
+
+<span class="c1"># This file is a setup of a LXC suite. It is sourced from different context, do</span>
+<span class="c1"># not manipulate the environment directly, implement functions and manipulate</span>
+<span class="c1"># environment only in subshells.</span>
+
+lxc_set_suite_env<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+
+<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">LXC_SUITE_NAME</span><span class="o">=</span><span class="s2">&quot;searxng&quot;</span>
+
+<span class="w"> </span><span class="c1"># name of https://images.linuxcontainers.org</span>
+<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">LINUXCONTAINERS_ORG_NAME</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">LINUXCONTAINERS_ORG_NAME</span><span class="k">:-</span><span class="nv">images</span><span class="si">}</span><span class="s2">&quot;</span>
+<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">LXC_HOST_PREFIX</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_SUITE_NAME</span><span class="k">:-</span><span class="nv">searx</span><span class="si">}</span><span class="s2">&quot;</span>
+<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">LXC_SUITE</span><span class="o">=(</span>
+
+<span class="w"> </span><span class="c1"># end of standard support see https://wiki.ubuntu.com/Releases</span>
+<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:ubuntu/20.04&quot;</span><span class="w"> </span><span class="s2">&quot;ubu2004&quot;</span><span class="w"> </span><span class="c1"># LTS EOSS April 2025</span>
+<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:ubuntu/22.04&quot;</span><span class="w"> </span><span class="s2">&quot;ubu2204&quot;</span><span class="w"> </span><span class="c1"># LTS EOSS April 2027</span>
+
+<span class="w"> </span><span class="c1"># EOL see https://fedoraproject.org/wiki/Releases</span>
+<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:fedora/35&quot;</span><span class="w"> </span><span class="s2">&quot;fedora35&quot;</span>
+
+<span class="w"> </span><span class="c1"># rolling releases see https://www.archlinux.org/releng/releases/</span>
+<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$LINUXCONTAINERS_ORG_NAME</span><span class="s2">:archlinux&quot;</span><span class="w"> </span><span class="s2">&quot;archlinux&quot;</span>
+<span class="w"> </span><span class="o">)</span>
+<span class="o">}</span>
+
+lxc_suite_install_info<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+<span class="w"> </span><span class="o">(</span>
+<span class="w"> </span>lxc_set_suite_env
+<span class="w"> </span>cat<span class="w"> </span><span class="s">&lt;&lt;EOF</span>
+<span class="s">LXC suite: ${LXC_SUITE_NAME}</span>
+<span class="s"> Suite includes installation of SearXNG</span>
+<span class="s"> images: ${LOCAL_IMAGES[*]}</span>
+<span class="s"> containers: ${CONTAINERS[*]}</span>
+<span class="s">EOF</span>
+<span class="w"> </span><span class="o">)</span>
+<span class="o">}</span>
+
+lxc_suite_install<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+<span class="w"> </span><span class="o">(</span>
+<span class="w"> </span>lxc_set_suite_env
+<span class="w"> </span><span class="nv">FORCE_TIMEOUT</span><span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_REPO_ROOT</span><span class="si">}</span><span class="s2">/utils/searxng.sh&quot;</span><span class="w"> </span>install<span class="w"> </span>all
+<span class="w"> </span>rst_title<span class="w"> </span><span class="s2">&quot;Suite installation finished (</span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">)&quot;</span><span class="w"> </span>part
+<span class="w"> </span><span class="k">if</span><span class="w"> </span>ask_yn<span class="w"> </span><span class="s2">&quot;Developer install? (wraps source from HOST into the running instance)&quot;</span><span class="w"> </span>Yn<span class="p">;</span><span class="w"> </span><span class="k">then</span>
+<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_REPO_ROOT</span><span class="si">}</span><span class="s2">/utils/searxng.sh&quot;</span><span class="w"> </span>searxng.install.link_src<span class="w"> </span><span class="s2">&quot;</span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span><span class="s2">&quot;</span>
+<span class="w"> </span><span class="k">fi</span>
+<span class="w"> </span>lxc_suite_info
+<span class="w"> </span><span class="nb">echo</span>
+<span class="w"> </span><span class="o">)</span>
+<span class="o">}</span>
+
+lxc_suite_info<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+<span class="w"> </span><span class="o">(</span>
+<span class="w"> </span>lxc_set_suite_env
+<span class="w"> </span><span class="k">for</span><span class="w"> </span>ip<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="k">$(</span>global_IPs<span class="k">)</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="k">do</span>
+<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">[[</span><span class="w"> </span><span class="nv">$ip</span><span class="w"> </span><span class="o">=</span>~<span class="w"> </span>.*:.*<span class="w"> </span><span class="o">]]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
+<span class="w"> </span>info_msg<span class="w"> </span><span class="s2">&quot;(</span><span class="si">${</span><span class="nv">ip</span><span class="p">%|*</span><span class="si">}</span><span class="s2">) IPv6: http://[</span><span class="si">${</span><span class="nv">ip</span><span class="p">#*|</span><span class="si">}</span><span class="s2">]&quot;</span>
+<span class="w"> </span><span class="k">else</span>
+<span class="w"> </span><span class="c1"># IPv4:</span>
+<span class="w"> </span><span class="c1"># shellcheck disable=SC2034,SC2031</span>
+<span class="w"> </span>info_msg<span class="w"> </span><span class="s2">&quot;(</span><span class="si">${</span><span class="nv">ip</span><span class="p">%|*</span><span class="si">}</span><span class="s2">) docs-live: http://</span><span class="si">${</span><span class="nv">ip</span><span class="p">#*|</span><span class="si">}</span><span class="s2">:8080/&quot;</span>
+<span class="w"> </span><span class="k">fi</span>
+<span class="w"> </span><span class="k">done</span>
+<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">LXC_REPO_ROOT</span><span class="si">}</span><span class="s2">/utils/searxng.sh&quot;</span><span class="w"> </span>searxng.instance.env
+<span class="w"> </span><span class="o">)</span>
+<span class="o">}</span>
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">DevOps tooling box</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="searxng.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#install-lxd">Install LXD</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#internet-connectivity-docker">Internet Connectivity &amp; Docker</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#searxng-lxc-suite">SearXNG LXC suite</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#running-commands">Running commands</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#good-to-know">Good to know</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#install-suite">Install suite</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#clean-up">Clean up</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#setup-searxng-buildhost">Setup SearXNG buildhost</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#command-help">Command Help</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#searxng-suite-config">SearXNG suite config</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="index.html#common-command-environments">Common command environments</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">DevOps tooling box</a>
+ <ul>
+ <li>Previous: <a href="searxng.sh.html" title="previous chapter"><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a>
+ <li>Next: <a href="../src/index.html" title="next chapter">Source-Code</a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/utils/lxc.sh.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/utils/searxng.sh.html b/utils/searxng.sh.html
new file mode 100644
index 000000000..042c65860
--- /dev/null
+++ b/utils/searxng.sh.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>utils/searxng.sh &#8212; SearXNG Documentation (2024.5.10+ffb1001f8)</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=4f649999" />
+ <link rel="stylesheet" type="text/css" href="../_static/searxng.css?v=52e4ff28" />
+ <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
+ <script src="../_static/documentation_options.js?v=ae3a6ae6"></script>
+ <script src="../_static/doctools.js?v=9a2dae69"></script>
+ <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <link rel="index" title="Index" href="../genindex.html" />
+ <link rel="search" title="Search" href="../search.html" />
+ <link rel="next" title="utils/lxc.sh" href="lxc.sh.html" />
+ <link rel="prev" title="DevOps tooling box" href="index.html" />
+ </head><body>
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="lxc.sh.html" title="utils/lxc.sh"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="DevOps tooling box"
+ accesskey="P">previous</a> |</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">SearXNG Documentation (2024.5.10+ffb1001f8)</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">DevOps tooling box</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a></li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body" role="main">
+
+ <section id="utils-searxng-sh">
+<span id="searxng-sh"></span><h1><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code><a class="headerlink" href="#utils-searxng-sh" title="Link to this heading">¶</a></h1>
+<p>To simplify the installation and maintenance of a SearXNG instance you can use the
+script <a class="reference external" href="https://github.com/searxng/searxng/blob/master/utils/searxng.sh">git://utils/searxng.sh</a>.</p>
+<aside class="sidebar">
+<p class="sidebar-title">further reading</p>
+<ul class="simple">
+<li><p><a class="reference internal" href="../admin/architecture.html#architecture"><span class="std std-ref">Architecture</span></a></p></li>
+<li><p><a class="reference internal" href="../admin/installation.html#installation"><span class="std std-ref">Installation</span></a></p></li>
+<li><p><a class="reference internal" href="../admin/installation-nginx.html#installation-nginx"><span class="std std-ref">NGINX</span></a></p></li>
+<li><p><a class="reference internal" href="../admin/installation-apache.html#installation-apache"><span class="std std-ref">Apache</span></a></p></li>
+</ul>
+</aside>
+<nav class="contents local" id="contents">
+<ul class="simple">
+<li><p><a class="reference internal" href="#install" id="id1">Install</a></p></li>
+<li><p><a class="reference internal" href="#command-help" id="id2">Command Help</a></p></li>
+</ul>
+</nav>
+<section id="install">
+<h2><a class="toc-backref" href="#id1" role="doc-backlink">Install</a><a class="headerlink" href="#install" title="Link to this heading">¶</a></h2>
+<p>In most cases you will install SearXNG simply by running the command:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>-H<span class="w"> </span>./utils/searx.sh<span class="w"> </span>install<span class="w"> </span>all
+</pre></div>
+</div>
+<p>The installation is described in chapter <a class="reference internal" href="../admin/installation-searxng.html#installation-basic"><span class="std std-ref">Step by step installation</span></a>.</p>
+</section>
+<section id="command-help">
+<span id="searxng-sh-overview"></span><h2><a class="toc-backref" href="#id2" role="doc-backlink">Command Help</a><a class="headerlink" href="#command-help" title="Link to this heading">¶</a></h2>
+<p>The <code class="docutils literal notranslate"><span class="pre">--help</span></code> output of the script is largely self-explanatory:</p>
+<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>usage:
+ searxng.sh install [all|user|pyenv|settings|uwsgi|redis|nginx|apache|searxng-src|packages|buildhost]
+ searxng.sh remove [all|user|pyenv|settings|uwsgi|redis|nginx|apache]
+ searxng.sh instance [cmd|update|check|localtest|inspect]
+install|remove:
+ all : complete (de-) installation of the SearXNG service
+ user : service user &#39;searxng&#39; (/usr/local/searxng)
+ pyenv : virtualenv (python) in /usr/local/searxng/searx-pyenv
+ settings : settings from /etc/searxng/settings.yml
+ uwsgi : SearXNG&#39;s uWSGI app searxng.ini
+ redis : build &amp; install or remove a local redis server /usr/local/searxng-redis/run/redis.sock
+ nginx : HTTP site /etc/nginx/default.apps-available/searxng.conf
+ apache : HTTP site /etc/apache2/sites-available/searxng.conf
+install:
+ searxng-src : clone https://github.com/searxng/searxng into /usr/local/searxng/searxng-src
+ packages : installs packages from OS package manager required by SearXNG
+ buildhost : installs packages from OS package manager required by a SearXNG buildhost
+instance:
+ update : update SearXNG instance (git fetch + reset &amp; update settings.yml)
+ check : run checks from utils/searxng_check.py in the active installation
+ inspect : run some small tests and inspect SearXNG&#39;s server status and log
+ get_setting : get settings value from running SearXNG instance
+ cmd : run command in SearXNG instance&#39;s environment (e.g. bash)
+uWSGI:
+ SEARXNG_UWSGI_SOCKET : /usr/local/searxng/run/socket
+environment:
+ GIT_URL : https://github.com/searxng/searxng
+ GIT_BRANCH : master
+ SEARXNG_URL : http://fv-az571-539/searxng
+ SEARXNG_PORT : 8888
+ SEARXNG_BIND_ADDRESS : 127.0.0.1
+</pre></div>
+</div>
+</section>
+</section>
+
+
+ <div class="clearer"></div>
+ </div>
+ </div>
+ </div>
+ <span id="sidebar-top"></span>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+
+
+ <p class="logo"><a href="../index.html">
+ <img class="logo" src="../_static/searxng-wordmark.svg" alt="Logo"/>
+ </a></p>
+
+
+<h3><a href="../index.html">Table of Contents</a></h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../user/index.html">User information</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../own-instance.html">Why use a private instance?</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator documentation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../dev/index.html">Developer documentation</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="index.html">DevOps tooling box</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#install">Install</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#command-help">Command Help</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="lxc.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="index.html#common-command-environments">Common command environments</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../src/index.html">Source-Code</a></li>
+</ul>
+
+ <h3>Project Links</h3>
+ <ul>
+ <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
+
+ <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
+
+ <li><a href="https://searx.space">Public instances</a>
+
+ <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
+ </ul><h3>Navigation</h3>
+<ul>
+ <li><a href="../index.html">Overview</a>
+ <ul>
+ <li><a href="index.html">DevOps tooling box</a>
+ <ul>
+ <li>Previous: <a href="index.html" title="previous chapter">DevOps tooling box</a>
+ <li>Next: <a href="lxc.sh.html" title="next chapter"><code class="docutils literal notranslate"><span class="pre">utils/lxc.sh</span></code></a></ul>
+ </li>
+ </ul>
+ </li>
+</ul>
+<search id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../search.html" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="Go" />
+ </form>
+ </div>
+</search>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+ <div role="note" aria-label="source link">
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="../_sources/utils/searxng.sh.rst.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="footer" role="contentinfo">
+ &#169; Copyright SearXNG team.
+ </div>
+ <script src="../_static/version_warning_offset.js"></script>
+
+ </body>
+</html> \ No newline at end of file