Browse Source

[fix] restore startpage autocompleter

Changes:
- Undo deletions of the autocompleter in settings and logic
- Add fixed autocomplete function in autocomplete.py

Related:
- https://github.com/searxng/searxng/issues/4334
useralias 3 days ago
parent
commit
8757655644
3 changed files with 50 additions and 2 deletions
  1. 1 0
      docs/admin/settings/settings_search.rst
  2. 48 1
      searx/autocomplete.py
  3. 1 1
      searx/settings.yml

+ 1 - 0
docs/admin/settings/settings_search.rst

@@ -46,6 +46,7 @@
   - ``qwant``
   - ``qwant``
   - ``seznam``
   - ``seznam``
   - ``sogou``
   - ``sogou``
+  - ``startpage``
   - ``stract``
   - ``stract``
   - ``swisscows``
   - ``swisscows``
   - ``wikipedia``
   - ``wikipedia``

+ 48 - 1
searx/autocomplete.py

@@ -20,7 +20,7 @@ from searx.engines import (
 )
 )
 from searx.network import get as http_get, post as http_post
 from searx.network import get as http_get, post as http_post
 from searx.exceptions import SearxEngineResponseException
 from searx.exceptions import SearxEngineResponseException
-from searx.utils import extr
+from searx.utils import extr, gen_useragent
 
 
 
 
 def update_kwargs(**kwargs):
 def update_kwargs(**kwargs):
@@ -233,6 +233,52 @@ def sogou(query, _lang):
     return []
     return []
 
 
 
 
+def startpage(query, sxng_locale):
+    """Autocomplete from Startpage's Firefox extension.
+    Supports the languages specified in lang_map.
+    """
+
+    lang_map = {
+        'da': 'dansk',
+        'de': 'deutsch',
+        'en': 'english',
+        'es': 'espanol',
+        'fr': 'francais',
+        'nb': 'norsk',
+        'nl': 'nederlands',
+        'pl': 'polski',
+        'pt': 'portugues',
+        'sv': 'svenska',
+    }
+
+    base_lang = sxng_locale.split('-')[0]
+    lui = lang_map.get(base_lang, 'english')
+
+    url_params = {
+        'q': query,
+        'format': 'opensearch',
+        'segment': 'startpage.defaultffx',
+        'lui': lui,
+    }
+    url = f'https://www.startpage.com/suggestions?{urlencode(url_params)}'
+
+    # Needs user agent, returns a 204 otherwise
+    h = {'User-Agent': gen_useragent()}
+
+    resp = get(url, headers=h)
+
+    if resp.ok:
+        try:
+            data = resp.json()
+
+            if len(data) >= 2 and isinstance(data[1], list):
+                return data[1]
+        except json.JSONDecodeError:
+            pass
+
+    return []
+
+
 def stract(query, _lang):
 def stract(query, _lang):
     # stract autocompleter (beta)
     # stract autocompleter (beta)
     url = f"https://stract.com/beta/api/autosuggest?q={quote_plus(query)}"
     url = f"https://stract.com/beta/api/autosuggest?q={quote_plus(query)}"
@@ -320,6 +366,7 @@ backends = {
     'qwant': qwant,
     'qwant': qwant,
     'seznam': seznam,
     'seznam': seznam,
     'sogou': sogou,
     'sogou': sogou,
+    'startpage': startpage,
     'stract': stract,
     'stract': stract,
     'swisscows': swisscows,
     'swisscows': swisscows,
     'wikipedia': wikipedia,
     'wikipedia': wikipedia,

+ 1 - 1
searx/settings.yml

@@ -34,7 +34,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: "360search", "baidu", "brave", "dbpedia", "duckduckgo", "google", "yandex",
   # Existing autocomplete backends: "360search", "baidu", "brave", "dbpedia", "duckduckgo", "google", "yandex",
-  # "mwmbl", "naver", "seznam", "sogou", "stract", "swisscows", "quark", "qwant", "wikipedia" -
+  # "mwmbl", "naver", "seznam", "sogou", "startpage", "stract", "swisscows", "quark", "qwant", "wikipedia" -
   # leave blank to turn it off by default.
   # leave blank to turn it off by default.
   autocomplete: ""
   autocomplete: ""
   # minimun characters to type before autocompleter starts
   # minimun characters to type before autocompleter starts