From 3dea7e609bac72d4a129979ba15315b966ff020f Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 5 Jan 2024 18:15:42 +0100 Subject: [PATCH] [feat] autocompleter: implementation of stract (beta) --- docs/dev/search_api.rst | 2 +- searx/autocomplete.py | 28 +++++++++++++++++++++++++--- searx/settings.yml | 2 +- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/docs/dev/search_api.rst b/docs/dev/search_api.rst index 13858ae9e..56272d341 100644 --- a/docs/dev/search_api.rst +++ b/docs/dev/search_api.rst @@ -69,7 +69,7 @@ Parameters ``autocomplete`` : default from :ref:`settings search` [ ``google``, ``dbpedia``, ``duckduckgo``, ``mwmbl``, ``startpage``, - ``wikipedia``, ``swisscows``, ``qwant`` ] + ``wikipedia``, ``stract``, ``swisscows``, ``qwant`` ] Service which completes words as you type. diff --git a/searx/autocomplete.py b/searx/autocomplete.py index 58655e26f..49e1eaa6a 100644 --- a/searx/autocomplete.py +++ b/searx/autocomplete.py @@ -6,7 +6,7 @@ # pylint: disable=use-dict-literal import json -from urllib.parse import urlencode +from urllib.parse import urlencode, quote_plus import lxml from httpx import HTTPError @@ -16,17 +16,26 @@ from searx.engines import ( engines, google, ) -from searx.network import get as http_get +from searx.network import get as http_get, post as http_post from searx.exceptions import SearxEngineResponseException -def get(*args, **kwargs): +def update_kwargs(**kwargs): if 'timeout' not in kwargs: kwargs['timeout'] = settings['outgoing']['request_timeout'] kwargs['raise_for_httperror'] = True + + +def get(*args, **kwargs): + update_kwargs(**kwargs) return http_get(*args, **kwargs) +def post(*args, **kwargs): + update_kwargs(**kwargs) + return http_post(*args, **kwargs) + + def brave(query, _lang): # brave search autocompleter url = 'https://search.brave.com/api/suggest?' @@ -145,6 +154,18 @@ def seznam(query, _lang): ] +def stract(query, _lang): + # stract autocompleter (beta) + url = f"https://stract.com/beta/api/autosuggest?q={quote_plus(query)}" + + resp = post(url) + + if not resp.ok: + return [] + + return [suggestion['raw'] for suggestion in resp.json()] + + def startpage(query, sxng_locale): """Autocomplete from Startpage. Supports Startpage's languages""" lui = engines['startpage'].traits.get_language(sxng_locale, 'english') @@ -223,6 +244,7 @@ backends = { 'mwmbl': mwmbl, 'seznam': seznam, 'startpage': startpage, + 'stract': stract, 'swisscows': swisscows, 'qwant': qwant, 'wikipedia': wikipedia, diff --git a/searx/settings.yml b/searx/settings.yml index 617561874..c00ab10fa 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -24,7 +24,7 @@ search: # Filter results. 0: None, 1: Moderate, 2: Strict safe_search: 0 # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "yandex", "mwmbl", - # "seznam", "startpage", "swisscows", "qwant", "wikipedia" - leave blank to turn it off + # "seznam", "startpage", "stract", "swisscows", "qwant", "wikipedia" - leave blank to turn it off # by default. autocomplete: "" # minimun characters to type before autocompleter starts