1820 Commits

Author SHA1 Message Date
Markus Heiser
e3e878afd2 [mod] engines: migration of the individual cache solutions to EngineCache
The EngineCache class replaces all previously individual solutions for caches in
the context of the engines.

- demo_offline.py
- duckduckgo.py
- radio_browser.py
- soundcloud.py
- startpage.py
- wolframalpha_api.py
- wolframalpha_noapi.py

Search term to test most of the modified engines::

    !ddg !rb !sc !sp !wa test

    !ddg !rb !sc !sp !wa foo

For introspection of the DB, jump into developer environment and run command to
show cache state::

    $ ./manage pyenv.cmd bash --norc --noprofile
    (py3) python -m searx.enginelib cache state

    cache tables and key/values
    ===========================
    [demo_offline        ] 2025-04-22 11:32:50 count        --> (int) 4
    [startpage           ] 2025-04-22 12:32:30 SC_CODE      --> (str) fSOBnhEMlDfE20
    [duckduckgo          ] 2025-04-22 12:32:31 4dff493e.... --> (str) 4-128634958369380006627592672385352473325
    [duckduckgo          ] 2025-04-22 12:40:06 3e2583e2.... --> (str) 4-263126175288871260472289814259666848451
    [radio_browser       ] 2025-04-23 11:33:08 servers      --> (list) ['https://de2.api.radio-browser.info',  ...]
    [soundcloud          ] 2025-04-29 11:40:06 guest_client_id --> (str) EjkRJG0BLNEZquRiPZYdNtJdyGtTuHdp
    [wolframalpha        ] 2025-04-22 12:40:06 code         --> (str) 5aa79f86205ad26188e0e26e28fb7ae7
    number of tables: 6
    number of key/value pairs: 7

In the "cache tables and key/values" section, the table name (engine name) is at
first position on the second there is the calculated expire date and on the
third and fourth position the key/value is shown.

About duckduckgo: The *vqd coode* of ddg depends on the query term and therefore
the key is a hash value of the query term (to not to store the raw query term).

In the "properties of ENGINES_CACHE" section all properties of the SQLiteAppl /
ExpireCache and their last modification date are shown::

    properties of ENGINES_CACHE
    ===========================
    [last modified: 2025-04-22 11:32:27] DB_SCHEMA           : 1
    [last modified: 2025-04-22 11:32:27] LAST_MAINTENANCE    :
    [last modified: 2025-04-22 11:32:27] crypt_hash          : ca612e3566fdfd7cf7efe2b1c9349f461158d07cb78a3750e5c5be686aa8ebdc
    [last modified: 2025-04-22 11:32:30] CACHE-TABLE--demo_offline: demo_offline
    [last modified: 2025-04-22 11:32:30] CACHE-TABLE--startpage: startpage
    [last modified: 2025-04-22 11:32:31] CACHE-TABLE--duckduckgo: duckduckgo
    [last modified: 2025-04-22 11:33:08] CACHE-TABLE--radio_browser: radio_browser
    [last modified: 2025-04-22 11:40:06] CACHE-TABLE--soundcloud: soundcloud
    [last modified: 2025-04-22 11:40:06] CACHE-TABLE--wolframalpha: wolframalpha

These properties provide information about the state of the ExpireCache and
control the behavior.  For example, the maintenance intervals are controlled by
the last modification date of the LAST_MAINTENANCE property and the hash value
of the password can be used to detect whether the password has been changed (in
this case the DB entries can no longer be decrypted and the entire cache must be
discarded).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-27 19:34:28 +02:00
Zhijie He
808dcaf1e2 [feat] engine: add Steam engine 2025-04-18 09:30:17 +02:00
Zhijie He
f94802f2d2 [feat] engines: add Hugging Face engine 2025-04-17 16:43:32 +02:00
Tommaso Colella
d1c584b961 [feat] engine: add engine for italian press agency ansa 2025-04-17 15:33:57 +02:00
RobinFrcd
087da66565 [feat] add SensCritique (FR) engine
Closes: https://github.com/searxng/searxng/issues/4623
2025-04-17 10:19:22 +02:00
Tommaso Colella
391bb1268d [feat] engine: add microsoft learn engine 2025-04-12 11:14:13 +02:00
grasdk
8ee51cc0f3 [fix] engine dokuwiki: basedir duplication
Dokuwiki searches behind reverse proxy had duplicate base path in the url,
creating a wrong url.

This patch exchanges string concat of URLs with urljoin [1] from urllib.parse.  This
eliminates the dual problem, while retaining the old functionality designed to
concatenate protocol, hostname and port (as base_url) with path.

[1] https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urljoin

Closes: https://github.com/searxng/searxng/issues/4598
2025-04-11 09:47:25 +02:00
Markus Heiser
15384e8fc5 [fix] make docs - ERROR: Unknown target name: "auth_key"
BTW: fix a bug with sys.path: repo-root (not util) needs to added to generate
autodoc from scripts in ./searxng_extra

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-09 17:28:18 +02:00
Markus Heiser
b146b745a7 [fix] Meilisearch engine: Authorization Token When Integrating Meilisearch
`X-Meili-API-Key` has  been changed to `Authorization` [1]

[1] https://www.meilisearch.com/docs/reference/api/overview#authorization

Suggested-by: https://github.com/searxng/searxng/issues/4416#issuecomment-2781254841
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-07 08:44:00 +02:00
Markus Heiser
8c8aba8cf5 [fix] engine radio browser: get servers from DNS api.radio-browser.info
Do a DNS-lookup of 'all.api.radio-browser.info', add reverse lookup and select
randomly a URL from available servers

Closes: https://github.com/searxng/searxng/issues/4576
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-06 18:59:10 +02:00
Markus Heiser
e6308b8167 [fix] hardening against arguments of type None, where str or dict is expected
On a long-running server, the tracebacks below can be found (albeit rarely),
which indicate problems with NoneType where a string or another data type is
expected.

result.img_src::

    File "/usr/local/searxng/searxng-src/searx/templates/simple/result_templates/images.html", line 13, in top-level template code
      <img src="" data-src="{{ image_proxify(result.img_src) }}" alt="{{ result.title|striptags }}">{{- "" -}}
      ^
    File "/usr/local/searxng/searxng-src/searx/webapp.py", line 284, in image_proxify
      if url.startswith('//'):
         ^^^^^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'startswith'

result.content::

    File "/usr/local/searxng/searxng-src/searx/result_types/_base.py", line 105, in _normalize_text_fields
      result.content = WHITESPACE_REGEX.sub(" ", result.content).strip()
                       ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
    TypeError: expected string or bytes-like object, got 'NoneType'

html_to_text, when html_str is a NoneType::

    File "/usr/local/searxng/searxng-src/searx/engines/wikipedia.py", line 190, in response
      title = utils.html_to_text(api_result.get('titles', {}).get('display') or api_result.get('title'))
    File "/usr/local/searxng/searxng-src/searx/utils.py", line 158, in html_to_text
      html_str = html_str.replace('\n', ' ').replace('\r', ' ')
                 ^^^^^^^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'replace'

presearch engine, when json_resp is a NoneType::

    File "/usr/local/searxng/searxng-src/searx/engines/presearch.py", line 221, in response
      results = parse_search_query(json_resp.get('results'))
    File "/usr/local/searxng/searxng-src/searx/engines/presearch.py", line 161, in parse_search_query
      for item in json_results.get('specialSections', {}).get('topStoriesCompact', {}).get('data', []):
                  ^^^^^^^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'get'

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-01 11:13:47 +02:00
Zhijie He
7b4612e862 [feat] engines: add Ollama engine 2025-03-30 14:25:58 +02:00
Bnyro
9ffa9fb730 [feat] engines: add reuters news engine 2025-03-30 13:56:09 +02:00
Tommaso Colella
5daa4f0460 [feat] engine: add engine for italian online newspaper "il post" 2025-03-30 13:45:06 +02:00
Zhijie He
33661cc5c3 [feat] engines: add Quark engine
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-30 13:20:35 +02:00
Zhijie He
b231cb4b59 [feat] engines: add Niconico videos engine
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-30 12:42:31 +02:00
naughtymommy42069
c8b419fcbb [feat] engine: add bitchute 2025-03-30 12:41:43 +02:00
Aadniz
ecee73eafd [fix] presearch engine: Unexpected crash if duration not in videos 2025-03-28 16:26:39 +01:00
Markus Heiser
150b2e21fd [fix] make docs -> ERROR: Unknown target name: "google: max 50 pages".
Fix the issues reported by sphinx build::

    docstring of searx.engines.google.max_page:1: ERROR: Unknown target name: "google: max 50 pages".
    docstring of searx.engines.google_images.max_page:1: ERROR: Unknown target name: "google: max 50 pages".
    docstring of searx.engines.google_scholar.max_page:1: ERROR: Unknown target name: "google: max 50 pages".

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-27 06:57:28 +01:00
Aadniz
02f5002a5f [fix] baidu engine: properly decoding HTML escape codes 2025-03-27 06:11:39 +01:00
Bnyro
4dfc47584d [refactor] duration strings: move parsing logic to utils.py 2025-03-25 16:48:44 +01:00
Bnyro
c28d35c7fc [fix] duckduckgo news: unescaped html sequences in description 2025-03-25 16:14:36 +01:00
Ikko Eltociear Ashimine
2482646323 [fix] typo in doc-str: offical -> official 2025-03-21 11:05:54 +01:00
Bnyro
b75e56afe6 [fix] duckduckgo: answer sometimes contains faulty (duplicated) url 2025-03-21 07:48:30 +01:00
Bnyro
3668c7012e [fix] presearch videos: item description and duration are located in metadata field 2025-03-20 20:55:09 +01:00
Aadniz
556db857aa [fix] presearch engine: News and Videos formatted incorrectly 2025-03-20 20:44:43 +01:00
Tan Yong Sheng
40feede51e [fix] engine: core.ac.uk implement API v3 / v2 is no longer supported 2025-03-19 17:51:00 +01:00
Bnyro
babbe9e1ae [fix] duckduckgo: show proper source url of answers 2025-03-18 05:31:28 +01:00
Bnyro
885d02c8c3 [feat] engine: add selfh.st/icons for logos of common self-hosted programs 2025-03-17 20:23:54 +01:00
Bnyro
bbb2894b04 [engine] elasticsearch: add pagination support 2025-03-16 22:10:05 +01:00
Markus Heiser
a1d5add718 fixup! [fix] fix invalid escape error in Baidu Images & default config typo 2025-03-15 17:14:54 +01:00
Zhijie He
38caa49540 [fix] fix invalid escape error in Baidu Images & default config typo 2025-03-15 17:14:54 +01:00
Zhijie He
4ce7f1accc [feat]: engines add images & kaifa from baidu.com 2025-03-15 17:14:54 +01:00
Markus Heiser
f49b2c94a9 [mod] migrate all key-value.html templates to KeyValue type
The engines now all use KeyValue results and return the results in a
EngineResults object.

The sqlite engine can return MainResult results in addition to KeyValue
results (based on engine's config in settings.yml),

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-15 10:36:33 +01:00
Aadniz
a88b4d7036 [fix] presearch engine: domain sometimes included in beginning of titles 2025-03-08 12:39:16 +01:00
Austin-Olacsi
73d50f5748 [feat] add bilibili support to get get_embeded_stream_url 2025-03-08 10:47:30 +01:00
Aadniz
4884747508 [fix] presearch engine: Title showing <em> html code 2025-03-07 21:24:35 +01:00
Markus Heiser
eb3633629a [fix] set language for engines from chinese market (no i18n index nor UI)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-07 19:59:13 +01:00
Loris
02b76c8389 [fix] engine qwant: add tgp and llm arguments to avoid CAPTCHA 2025-03-07 18:58:45 +01:00
Markus Heiser
08a90d46d6 [doc] add missing docs for the search.max_page setting
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-07 10:07:41 +01:00
Bubu
b8671c7a4a [feat] engines: add baidu (general) 2025-03-07 06:59:28 +01:00
Zhijie He
066aabc112 [feat] engines: add www.acfun.cn 2025-03-06 17:52:16 +01:00
Zhijie He
8fe4904619 [feat] engines: add www.iqiyi.com
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-06 17:28:14 +01:00
Zhijie He
08d08475fc [feat] engines: add www.chinaso.com
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-06 17:23:11 +01:00
Markus Heiser
194f222203 [fix] engines: Google-Web & Google-Video (random arc_id)
Both enghines have been reported ``TooManyRequests``, additionaly Google-Videos
thumbnails needed a review.

Based on the research from @unixfox [1] this patch generates every hour a new random
``arc_id``.

[1] https://github.com/searxng/searxng/issues/4435#issuecomment-2703279522

Closes:

- https://github.com/searxng/searxng/issues/4435
- https://github.com/searxng/searxng/issues/4431

Related:

- https://github.com/searxng/searxng/discussions/4434
- https://github.com/searxng/searxng/discussions/4429

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-06 15:43:53 +01:00
Markus Heiser
8984d7ae02 [fix] brave engine: add sec-fetch headers and source=web argument
The intention is to reduce the "TooManyRequestsException".

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-02 18:19:55 +01:00
Zhijie He
b0beb307ca [chore] add timediff field for sogou_videos
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-02 13:31:31 +01:00
Zhijie He
76f52b5b45 [feat] add Sogou WeChat article search support 2025-03-02 13:31:31 +01:00
Zhijie He
97aa5a779b [feat] add Sogou engine for searxng
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-02 13:31:31 +01:00
Zhijie He
71d1504e57 [feat] add 360search engine for searxng
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-02 13:25:35 +01:00