Browse Source

[feat] autocompleter: implementation of stract (beta)

Bnyro 1 year ago
parent
commit
3dea7e609b
3 changed files with 27 additions and 5 deletions
  1. 1 1
      docs/dev/search_api.rst
  2. 25 3
      searx/autocomplete.py
  3. 1 1
      searx/settings.yml

+ 1 - 1
docs/dev/search_api.rst

@@ -69,7 +69,7 @@ Parameters
 
 
 ``autocomplete`` : default from :ref:`settings search`
 ``autocomplete`` : default from :ref:`settings search`
   [ ``google``, ``dbpedia``, ``duckduckgo``, ``mwmbl``, ``startpage``,
   [ ``google``, ``dbpedia``, ``duckduckgo``, ``mwmbl``, ``startpage``,
-  ``wikipedia``, ``swisscows``, ``qwant`` ]
+  ``wikipedia``, ``stract``, ``swisscows``, ``qwant`` ]
 
 
   Service which completes words as you type.
   Service which completes words as you type.
 
 

+ 25 - 3
searx/autocomplete.py

@@ -6,7 +6,7 @@
 # pylint: disable=use-dict-literal
 # pylint: disable=use-dict-literal
 
 
 import json
 import json
-from urllib.parse import urlencode
+from urllib.parse import urlencode, quote_plus
 
 
 import lxml
 import lxml
 from httpx import HTTPError
 from httpx import HTTPError
@@ -16,17 +16,26 @@ from searx.engines import (
     engines,
     engines,
     google,
     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
 from searx.exceptions import SearxEngineResponseException
 
 
 
 
-def get(*args, **kwargs):
+def update_kwargs(**kwargs):
     if 'timeout' not in kwargs:
     if 'timeout' not in kwargs:
         kwargs['timeout'] = settings['outgoing']['request_timeout']
         kwargs['timeout'] = settings['outgoing']['request_timeout']
     kwargs['raise_for_httperror'] = True
     kwargs['raise_for_httperror'] = True
+
+
+def get(*args, **kwargs):
+    update_kwargs(**kwargs)
     return http_get(*args, **kwargs)
     return http_get(*args, **kwargs)
 
 
 
 
+def post(*args, **kwargs):
+    update_kwargs(**kwargs)
+    return http_post(*args, **kwargs)
+
+
 def brave(query, _lang):
 def brave(query, _lang):
     # brave search autocompleter
     # brave search autocompleter
     url = 'https://search.brave.com/api/suggest?'
     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):
 def startpage(query, sxng_locale):
     """Autocomplete from Startpage. Supports Startpage's languages"""
     """Autocomplete from Startpage. Supports Startpage's languages"""
     lui = engines['startpage'].traits.get_language(sxng_locale, 'english')
     lui = engines['startpage'].traits.get_language(sxng_locale, 'english')
@@ -223,6 +244,7 @@ backends = {
     'mwmbl': mwmbl,
     'mwmbl': mwmbl,
     'seznam': seznam,
     'seznam': seznam,
     'startpage': startpage,
     'startpage': startpage,
+    'stract': stract,
     'swisscows': swisscows,
     'swisscows': swisscows,
     'qwant': qwant,
     'qwant': qwant,
     'wikipedia': wikipedia,
     'wikipedia': wikipedia,

+ 1 - 1
searx/settings.yml

@@ -24,7 +24,7 @@ search:
   # Filter results. 0: None, 1: Moderate, 2: Strict
   # Filter results. 0: None, 1: Moderate, 2: Strict
   safe_search: 0
   safe_search: 0
   # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "yandex", "mwmbl",
   # 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.
   # by default.
   autocomplete: ""
   autocomplete: ""
   # minimun characters to type before autocompleter starts
   # minimun characters to type before autocompleter starts