diff options
Diffstat (limited to 'searx')
| -rw-r--r-- | searx/autocomplete.py | 52 | ||||
| -rw-r--r-- | searx/help/about.md | 71 | ||||
| -rw-r--r-- | searx/search/checker/impl.py | 3 | ||||
| -rw-r--r-- | searx/shared/redisdb.py | 5 | ||||
| -rw-r--r-- | searx/templates/__common__/about.html | 102 | ||||
| -rw-r--r-- | searx/templates/oscar/about.html | 3 | ||||
| -rw-r--r-- | searx/templates/simple/about.html | 3 | ||||
| -rw-r--r-- | searx/user_help.py | 48 | ||||
| -rwxr-xr-x | searx/webapp.py | 4 |
9 files changed, 159 insertions, 132 deletions
diff --git a/searx/autocomplete.py b/searx/autocomplete.py index b8d272c32..8a67f8139 100644 --- a/searx/autocomplete.py +++ b/searx/autocomplete.py @@ -1,33 +1,23 @@ -''' -searx is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +"""This module implements functions needed for the autocompleter. -searx is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. +""" -You should have received a copy of the GNU Affero General Public License -along with searx. If not, see < http://www.gnu.org/licenses/ >. - -(C) 2013- by Adam Tauber, <asciimoo@gmail.com> -''' - - -from lxml import etree from json import loads from urllib.parse import urlencode +from lxml import etree from httpx import HTTPError - from searx import settings from searx.data import ENGINES_LANGUAGES from searx.network import get as http_get from searx.exceptions import SearxEngineResponseException +# a fetch_supported_languages() for XPath engines isn't available right now +# _brave = ENGINES_LANGUAGES['brave'].keys() + def get(*args, **kwargs): if 'timeout' not in kwargs: @@ -36,7 +26,26 @@ def get(*args, **kwargs): return http_get(*args, **kwargs) -def dbpedia(query, lang): +def brave(query, _lang): + # brave search autocompleter + url = 'https://search.brave.com/api/suggest?' + url += urlencode({'q': query}) + country = 'all' + # if lang in _brave: + # country = lang + kwargs = {'cookies': {'country': country}} + resp = get(url, **kwargs) + + results = [] + + if resp.ok: + data = resp.json() + for item in data[1]: + results.append(item) + return results + + +def dbpedia(query, _lang): # dbpedia autocompleter, no HTTPS autocomplete_url = 'https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?' @@ -51,7 +60,7 @@ def dbpedia(query, lang): return results -def duckduckgo(query, lang): +def duckduckgo(query, _lang): # duckduckgo autocompleter url = 'https://ac.duckduckgo.com/ac/?{0}&type=list' @@ -85,7 +94,7 @@ def startpage(query, lang): return [e['text'] for e in data.get('suggestions', []) if 'text' in e] -def swisscows(query, lang): +def swisscows(query, _lang): # swisscows autocompleter url = 'https://swisscows.ch/api/suggest?{query}&itemsCount=5' @@ -128,6 +137,7 @@ backends = { 'swisscows': swisscows, 'qwant': qwant, 'wikipedia': wikipedia, + 'brave': brave, } diff --git a/searx/help/about.md b/searx/help/about.md new file mode 100644 index 000000000..521022414 --- /dev/null +++ b/searx/help/about.md @@ -0,0 +1,71 @@ +# About [searxng][url_for:index] + +SearXNG is a fork from the well-known [searx] [metasearch engine], aggregating +the results of other [search engines][url_for:preferences] while not storing +information about its users. + +More about SearXNG ... + +* [SearXNG sources][brand.git_url] +* [weblate] + +--- + +## Why use it? + +* SearXNG may not offer you as personalised results as Google, + but it doesn't generate a profile about you. + +* 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. + +* SearXNG is free software, the code is 100% open and you can help + to make it better. See more on [SearXNG sources][brand.git_url]. + +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 + +## Technical details - How does it work? + +SearXNG is a [metasearch engine], inspired by the [seeks project]. It provides +basic privacy by mixing your queries with searches on other platforms without +storing search data. Queries are made using a POST request on every browser +(except Chromium-based browsers*). Therefore they show up in neither our logs, +nor your url history. In the case of Chromium-based browser users there is an +exception: searx uses the search bar to perform GET requests. SearXNG can be +added to your browser's search bar; moreover, it can be set as the default +search engine. + +<span id='add to browser'></span> +## How to set as the default search engine? + +SearXNG supports [OpenSearch]. For more information on changing your default +search engine, see your browser's documentation: + +* [Firefox](https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox) +* [Microsoft Edge](https://support.microsoft.com/en-us/help/4028574/microsoft-edge-change-the-default-search-engine) +* Chromium-based browsers [only add websites that the user navigates to without a path.](https://www.chromium.org/tab-to-search) + +## Where to find anonymous usage statistics of this instance ? + +[Stats page][url_for:stats] contains some useful data about the engines used. + +## How can I make it my own? + +SearXNG appreciates your concern regarding logs, so take the code from +the [SearXNG project][brand.git_url] and run it yourself! + +Add your instance to this [list of public instances][brand.public_instances] to +help other people reclaim their privacy and make the Internet freer! The more +decentralized the Internet is, the more freedom we have! + +## Where are the docs & code of this instance? + +See the [SearXNG docs][brand.docs_url] and [SearXNG sources][brand.git_url] + +[searx]: https://github.com/searx/searx +[metasearch engine]: https://en.wikipedia.org/wiki/Metasearch_engine +[weblate]: https://weblate.bubu1.eu/projects/searxng/ +[seeks project]: https://beniz.github.io/seeks/ +[OpenSearch]: https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md diff --git a/searx/search/checker/impl.py b/searx/search/checker/impl.py index c0dd966d0..bc5cdf968 100644 --- a/searx/search/checker/impl.py +++ b/searx/search/checker/impl.py @@ -74,7 +74,7 @@ def _download_and_check_if_image(image_url: str) -> bool: try: # use "image_proxy" (avoid HTTP/2) network.set_context_network_name('image_proxy') - stream = network.stream( + r, stream = network.stream( 'GET', image_url, timeout=10.0, @@ -91,7 +91,6 @@ def _download_and_check_if_image(image_url: str) -> bool: 'Cache-Control': 'max-age=0', }, ) - r = next(stream) r.close() if r.status_code == 200: is_image = r.headers.get('content-type', '').startswith('image/') diff --git a/searx/shared/redisdb.py b/searx/shared/redisdb.py index d6a4dc3bf..da71d169c 100644 --- a/searx/shared/redisdb.py +++ b/searx/shared/redisdb.py @@ -20,6 +20,7 @@ A redis DB connect can be tested by:: """ import logging +import redis from searx import get_setting logger = logging.getLogger('searx.shared.redis') @@ -28,8 +29,6 @@ _client = None def client(): global _client # pylint: disable=global-statement - import redis # pylint: disable=import-error, import-outside-toplevel - if _client is None: # not thread safe: in the worst case scenario, two or more clients are # initialized only one is kept, the others are garbage collected. @@ -38,8 +37,6 @@ def client(): def init(): - import redis # pylint: disable=import-error, import-outside-toplevel - try: c = client() logger.info("connected redis DB --> %s", c.acl_whoami()) diff --git a/searx/templates/__common__/about.html b/searx/templates/__common__/about.html deleted file mode 100644 index 5a9065f03..000000000 --- a/searx/templates/__common__/about.html +++ /dev/null @@ -1,102 +0,0 @@ -<div{% if rtl %} dir="ltr"{% endif %}> - <h1>About <a href="{{ url_for('index') }}">searxng</a></h1> - - <p> - SearXNG is a fork from the well-known <a href="https://github.com/searx/searx">searx</a> - <a href="https://en.wikipedia.org/wiki/Metasearch_engine"> metasearch engine</a>, - aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> - while not storing information about its users. - </p> - - <p>More about SearXNG ...</p> - - <ul> - <li><a href="{{ searx_git_url }}">SearXNG sources</a></li> - <li><a href="https://weblate.bubu1.eu/projects/searxng/">weblate</a></li> - </ul> - - <hr /> - - <h2>Why use it?</h2> - - <ul> - <li> - SearXNG may not offer you as personalised results as Google, but it doesn't - generate a profile about you. - </li> - <li> - 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. - </li> - <li> - SearXNG is free software, the code is 100% open and you can help to make - it better. See more on <a href="{{ searx_git_url - }}">SearXNG sources</a>. - </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> - - <h2>Technical details - How does it work?</h2> - - <p> - SearXNG is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, - inspired by the <a 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. Queries are made using a POST request - on every browser (except Chromium-based browsers*). Therefore they show up - in neither our logs, nor your url history. In the case of Chromium-based - browser users there is an exception: searx uses the search bar to perform GET - requests. - - SearXNG can be added to your browser's search bar; moreover, it can be set as - the default search engine. - </p> - - <h2 id='add to browser'>How to set as the default search engine?</h2> - - <p> - SearXNG supports <a 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> - <li><a href="https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox">Firefox</a></li> - <li><a href="https://support.microsoft.com/en-us/help/4028574/microsoft-edge-change-the-default-search-engine">Microsoft Edge</a></li> - <li>Chromium-based browsers <a href="https://www.chromium.org/tab-to-search">only add websites that the user navigates to without a path.</a> - </ul> - - <h2>Where to find anonymous usage statistics of this instance ?</h2> - - <p> - <a href="{{ url_for('stats') }}">Stats page</a> contains some useful data about the engines used. - </p> - - <h2>How can I make it my own?</h2> - - <p> - SearXNG appreciates your concern regarding logs, so take the code from - the <a href="{{ searx_git_url }}">SearXNG project</a> and - run it yourself! - </p> - <p> - Add your instance to this <a href="{{ get_setting('brand.public_instances') }}"> 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> - - <h2>Where are the docs & code of this instance?</h2> - - <p> - See the <a href="{{ get_setting('brand.docs_url') }}">SearXNG docs</a> - and <a href="{{ searx_git_url }}">SearXNG sources</a> - </p> - -</div> -{% include "__common__/aboutextend.html" ignore missing %} diff --git a/searx/templates/oscar/about.html b/searx/templates/oscar/about.html index bc7fed8e1..a644761b6 100644 --- a/searx/templates/oscar/about.html +++ b/searx/templates/oscar/about.html @@ -1,5 +1,6 @@ {% extends "oscar/base.html" %} {% block title %}{{ _('about') }} - {% endblock %} {% block content %} -{% include '__common__/about.html' %} +{{ help.about | safe }} +{% include "__common__/aboutextend.html" ignore missing %} {% endblock %} diff --git a/searx/templates/simple/about.html b/searx/templates/simple/about.html index 1913879da..9f6a10ced 100644 --- a/searx/templates/simple/about.html +++ b/searx/templates/simple/about.html @@ -1,4 +1,5 @@ {% extends 'simple/base.html' %} {% block content %} -{% include '__common__/about.html' %} +{{ help.about | safe }} +{% include "__common__/aboutextend.html" ignore missing %} {% endblock %} diff --git a/searx/user_help.py b/searx/user_help.py new file mode 100644 index 000000000..bf7336777 --- /dev/null +++ b/searx/user_help.py @@ -0,0 +1,48 @@ +from typing import Dict +import os.path +import pkg_resources + +import flask +from flask.helpers import url_for +import mistletoe + +from . import get_setting +from .version import GIT_URL + +HELP: Dict[str, str] = {} +""" Maps a filename under help/ without the file extension to the rendered HTML. """ + + +def render(app: flask.Flask): + """ + Renders the user documentation. Must be called after all Flask routes have been + registered, because the documentation might try to link to them with Flask's `url_for`. + + We render the user documentation once on startup to improve performance. + """ + + link_targets = { + 'brand.git_url': GIT_URL, + 'brand.public_instances': get_setting('brand.public_instances'), + 'brand.docs_url': get_setting('brand.docs_url'), + } + + base_url = get_setting('server.base_url') or None + # we specify base_url so that url_for works for base_urls that have a non-root path + + with app.test_request_context(base_url=base_url): + link_targets['url_for:index'] = url_for('index') + link_targets['url_for:preferences'] = url_for('preferences') + link_targets['url_for:stats'] = url_for('stats') + + define_link_targets = ''.join(f'[{name}]: {url}\n' for name, url in link_targets.items()) + + for filename in pkg_resources.resource_listdir(__name__, 'help'): + rootname, ext = os.path.splitext(filename) + + if ext != '.md': + continue + + markdown = pkg_resources.resource_string(__name__, 'help/' + filename).decode() + markdown = define_link_targets + markdown + HELP[rootname] = mistletoe.markdown(markdown) diff --git a/searx/webapp.py b/searx/webapp.py index f509fea24..099a42996 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -55,6 +55,7 @@ from searx import ( get_setting, settings, searx_debug, + user_help, ) from searx.data import ENGINE_DESCRIPTIONS from searx.results import Timing, UnresponsiveEngine @@ -867,7 +868,7 @@ def __get_translated_errors(unresponsive_engines: Iterable[UnresponsiveEngine]): @app.route('/about', methods=['GET']) def about(): """Render about page""" - return render('about.html') + return render('about.html', help=user_help.HELP) @app.route('/autocompleter', methods=['GET', 'POST']) @@ -1359,6 +1360,7 @@ werkzeug_reloader = flask_run_development or (searx_debug and __name__ == "__mai if not werkzeug_reloader or (werkzeug_reloader and os.environ.get("WERKZEUG_RUN_MAIN") == "true"): plugin_initialize(app) search_initialize(enable_checker=True, check_network=True, enable_metrics=settings['general']['enable_metrics']) + user_help.render(app) def run(): |