.github/dependabot.ymlnew file+10
@@ -0,0 +1,10 @@
1+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
4+ - package-ecosystem: "pip"
9+ open-pull-requests-limit: 5
10+ target-branch: "master"
.github/workflows/data-update.ymlnew file+66
@@ -0,0 +1,66 @@
1+name: "Update searx.data"
9+ name: Update data - ${{ matrix.fetch }}
10+ runs-on: ubuntu-20.04
11+ if: ${{ github.repository_owner == 'searx'}}
15+ - update_ahmia_blacklist.py
16+ - update_currencies.py
17+ - update_external_bangs.py
18+ - update_firefox_version.py
19+ - update_languages.py
20+ - update_wikidata_units.py
23+ uses: actions/checkout@v2
25+ - name: Install Ubuntu packages
27+ sudo ./utils/searx.sh install packages
29+ - name: Set up Python
30+ uses: actions/setup-python@v2
32+ python-version: '3.10'
35+ - name: Install Python dependencies
41+ FETCH_SCRIPT: ./searx_extra/update/${{ matrix.fetch }}
43+ V=1 ./manage pyenv.cmd python "$FETCH_SCRIPT"
45+ - name: Create Pull Request
47+ uses: peter-evans/create-pull-request@v3
49+ token: ${{ secrets.DATA_PR_TOKEN }}
50+ commit-message: Update searx.data - ${{ matrix.fetch }}
51+ committer: searx-bot <noreply@github.com>
52+ author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
54+ branch: update_data_${{ matrix.fetch }}
57+ title: 'Update searx.data - ${{ matrix.fetch }}'
59+ Update searx.data - ${{ matrix.fetch }}
63+ - name: Check outputs
65+ echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
66+ echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
.github/workflows/integration.yml+42−8
@@ -1,6 +1,10 @@
1name: Integration
1name: Integration
3−on: [push, pull_request]
6+ pull_request:
@@ -9,7 +13,7 @@ jobs:
11 os: [ubuntu-20.04]
15 os: [ubuntu-20.04]
12− python-version: [3.6, 3.7, 3.8, 3.9]
16+ python-version: [3.7, 3.8, 3.9, "3.10"]
14 - name: Checkout
18 - name: Checkout
15 uses: actions/checkout@v2
19 uses: actions/checkout@v2
@@ -34,7 +38,7 @@ jobs:
34 make V=1 install
38 make V=1 install
35 make V=1 gecko.driver
39 make V=1 gecko.driver
36 - name: Run tests
40 - name: Run tests
37− run: make V=1 test
41+ run: make V=1 ci.test
38 - name: Test coverage
42 - name: Test coverage
39 run: make V=1 test.coverage
43 run: make V=1 test.coverage
40 - name: Store coverage result
44 - name: Store coverage result
@@ -52,10 +56,21 @@ jobs:
52 uses: actions/checkout@v2
56 uses: actions/checkout@v2
53 - name: Install Ubuntu packages
57 - name: Install Ubuntu packages
54 run: sudo ./utils/searx.sh install packages
58 run: sudo ./utils/searx.sh install packages
59+ - name: Set up Python
60+ uses: actions/setup-python@v2
62+ python-version: '3.9'
64+ - name: Cache Python dependencies
66+ uses: actions/cache@v2
69+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
55 - name: Install node dependencies
70 - name: Install node dependencies
56 run: make V=1 node.env
71 run: make V=1 node.env
57 - name: Build themes
72 - name: Build themes
58− run: make V=1 themes
73+ run: make V=1 themes.all
60 documentation:
75 documentation:
61 name: Documentation
76 name: Documentation
@@ -64,23 +79,31 @@ jobs:
64 - name: Checkout
79 - name: Checkout
65 uses: actions/checkout@v2
80 uses: actions/checkout@v2
67 persist-credentials: false
83 persist-credentials: false
68 - name: Install Ubuntu packages
84 - name: Install Ubuntu packages
69 run: sudo ./utils/searx.sh install buildhost
85 run: sudo ./utils/searx.sh install buildhost
70 - name: Set up Python
86 - name: Set up Python
71 uses: actions/setup-python@v2
87 uses: actions/setup-python@v2
73− python-version: '3.9'
89+ python-version: '3.10'
74 architecture: 'x64'
90 architecture: 'x64'
91+ - name: Cache Python dependencies
93+ uses: actions/cache@v2
96+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
75 - name: Build documentation
97 - name: Build documentation
76− run: SEARX_DEBUG=1 make V=1 travis-gh-pages
98+ run: |
99+ make V=1 docs.clean docs.html
77 - name: Deploy
100 - name: Deploy
78 if: github.ref == 'refs/heads/master'
101 if: github.ref == 'refs/heads/master'
79 uses: JamesIves/github-pages-deploy-action@3.7.1
102 uses: JamesIves/github-pages-deploy-action@3.7.1
81 GITHUB_TOKEN: ${{ github.token }}
104 GITHUB_TOKEN: ${{ github.token }}
82 BRANCH: gh-pages
105 BRANCH: gh-pages
83− FOLDER: gh-pages
106+ FOLDER: dist/docs
84 CLEAN: true # Automatically remove deleted files from the deploy branch
107 CLEAN: true # Automatically remove deleted files from the deploy branch
@@ -92,7 +115,7 @@ jobs:
92 - documentation
115 - documentation
94 DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
117 DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
95− runs-on: ubuntu-18.04
118+ runs-on: ubuntu-20.04
97 - name: Checkout
120 - name: Checkout
98 if: env.DOCKERHUB_USERNAME != null
121 if: env.DOCKERHUB_USERNAME != null
@@ -100,6 +123,17 @@ jobs:
101 # make sure "make docker.push" can get the git history
124 # make sure "make docker.push" can get the git history
102 fetch-depth: '0'
125 fetch-depth: '0'
126+ - name: Set up Python
127+ uses: actions/setup-python@v2
129+ python-version: '3.9'
131+ - name: Cache Python dependencies
133+ uses: actions/cache@v2
136+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
103 - name: Set up QEMU
137 - name: Set up QEMU
104 if: env.DOCKERHUB_USERNAME != null
138 if: env.DOCKERHUB_USERNAME != null
105 uses: docker/setup-qemu-action@v1
139 uses: docker/setup-qemu-action@v1
@@ -26,3 +26,5 @@ dist/
28searx.egg-info/
28searx.egg-info/
@@ -59,7 +59,7 @@ confidence=
59# --enable=similarities". If you want to run only the classes checker, but have
59# --enable=similarities". If you want to run only the classes checker, but have
60# no Warning level messages displayed, use"--disable=all --enable=classes
60# no Warning level messages displayed, use"--disable=all --enable=classes
61# --disable=W"
61# --disable=W"
62−disable=bad-whitespace, duplicate-code
62+disable=bad-whitespace, duplicate-code, consider-using-f-string
64# Enable the message, report, category or checker with the given id(s). You can
64# Enable the message, report, category or checker with the given id(s). You can
65# either give multiple identifier separated by comma (,) or put this option
65# either give multiple identifier separated by comma (,) or put this option
@@ -1,4 +1,4 @@
1−Searx was created by Adam Tauber and is maintained by Adam Tauber, Alexandre Flament, Noémi Ványi, @pofilo, Gaspard d'Hautefeuille and Markus Heiser.
1+Searx was created by Adam Tauber and is maintained by Adam Tauber, Noémi Ványi, @pofilo, Gaspard d'Hautefeuille and Émilien Devos.
3Major contributing authors:
3Major contributing authors:
@@ -12,8 +12,9 @@ Major contributing authors:
13- Markus Heiser @return42
13- Markus Heiser @return42
14- Émilien Devos @unixfox
14- Émilien Devos @unixfox
16−People who have submitted patches/translates, reported bugs, consulted features or
17+People who have submitted patches/translations, reported bugs, consulted features or
17generally made searx better:
18generally made searx better:
19- Laszlo Hammerl
20- Laszlo Hammerl
@@ -66,7 +67,6 @@ generally made searx better:
66- @firebovine
67- @firebovine
67- Lorenzo J. Lucchini @luccoj
68- Lorenzo J. Lucchini @luccoj
68- @eig8phei
69- @eig8phei
71- Jannik Winkel @kiney
71- Jannik Winkel @kiney
72- @juanitobananas
72- @juanitobananas
@@ -154,6 +154,15 @@ generally made searx better:
154- @mrwormo
154- @mrwormo
155- Xiaoyu WEI @xywei
155- Xiaoyu WEI @xywei
156- @joshu9h
156- @joshu9h
167+- @OliveiraHermogenes
168+- Paul Alcock @Guilvareux
@@ -1,3 +1,156 @@
7+- drop support for Python 3.5 ( #2459 )
8+- add support for Python 3.9 ( #2397 #2459 )
9+- update Python dependencies ( #2428 #2459 #2206 ) ⚠️ pyopenssl is not longer required
10+- automatic update of searx.data ( #2555 #2585 #2595 #2592 #2600 )
11+- update searx.data ( #2604 #2605 #2606 #2607 #2415 )
12+- add ability to send engine data to subsequent requests ( #2615 )
13+- add checker ( #2419 #2476 #2481 #2682 #2682 #2657 )
14+- by default allow only HTTPS, not HTTP ( #2641 #2659 )
15+- replace /translations.js with an embedded JSON ( #2660 )
16+- activate raise_for_error by default ( #2557 )
17+- don't dump traceback of SearxEngineResponseException on init ( #2635 )
22+- update nginx configuration ( #2618 )
23+- document workaround for using 2 languages simultaneously ( #2479 )
24+- improve admin-docs about result proxy (morty) configuration ( #2509 )
25+- fixed typo ( #2457 )
30+- `general.contact_url` : add link to contact instance maintainer to footer of each page ( #2391 14c7cc0e118f1d0873b32b34793cdec2c5c9c13e #2412 )
31+- `brand` : move brand options from Makefile to settings.yml ( #2408 #2473 )
36+- oscar: Hide links panel in mobile screens ( #2458 )
37+- oscar: upgrade dependencies ( #2346 #2673 #2662 )
38+- remove legacy, courgette and pix-art themes ( #2344 )
39+- add hyperlink to searx instances list in error message ( #2387 )
40+- preferences: a tooltip is shown when the mouse is over the engine names ( #2661 )
41+- Ignore double-quotes when highlighting query parts ( #2553 )
42+- update autocomplete ( #2593 )
48+- mediathekviewweb ( #2541 )
49+- solidtorrents ( #2626 )
57+- apk_mirror ( #2556 #2642 )
59+- duckduckgo ( #2560 #2559 )
60+- library genesis ( #2448 )
61+- ina ( 0ba71c3644c4d20f70528c10eed1385399ec1c82 )
63+- json_engine ( #2562 )
65+- google images ( #2482 )
66+- google play apps ( 88657fe9c2a41b9be38ee5146e5870672416db12 )
67+- google play movies ( 50ba2b9e87ef61e96da124f906d3aff4c7870e3f )
68+- google news ( #2483 #2498 )
69+- google scholar ( #2611 )
70+- google video ( #2482 )
71+- hoogle ( 6255b33c9dcf0d28f0a3307af988565f69259ce2 )
73+- semantic schollar ( f596f5767bed915a5c3bed59ae26283e53f975ca f596f5767bed915a5c3bed59ae26283e53f975ca )
75+- seznam ( #2564 28286cf3f2308113bf440fb6e7cf326c6ed07889 )
76+- wikipedia ( #2554 #2565 #2681 #2681 )
78+- yahoo news ( #2640 #2655 )
83+- duckduckgo ( 5f450fda74e80bf350eb1493f66cfa61deaf5cea )
84+- geektimes ( 45f0e1a859fa12ce2ae0c24dc356922fcad50c8d )
85+- lobste.rs ( 06b754ad67aa6066aed6df77b5ffb74aabebb040 )
86+- soundcloud ( #2671 )
89+- yggtorrent ( #2573 )
95+- google_play_music ( #2558 )
103+- Fix empty colon in query from selecting Chinese ( #2454 )
104+- Get correct locale with country from browser ( #2531 )
106+Code refactoring / reduce the technical debt
107+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109+- refactor searx.search.SearchQuery and searx.search.EngineRef ( #2398 )
110+- dynamically set language_support variable ( #2499 )
111+- engines: add about variable ( #2460 )
112+- processors ( #2225 5c6a5407a0b124c3323e73c33b81ec1fbd7d2fce )
113+- remove Fabric file ( #2494 )
114+- use unittest from py3, remove unittest2 from py2 ( #2608 )
119+- add notice for the issue templates ( #2447 )
120+- every Sunday, call utils/fetch_*.py scripts and create a PR automatically ( #2500 728e09676400221a064627509a31470d8f6e33bf )
121+- minor change: replace "travis" by "CI" ( #2528 )
126+- update secret key check ( #2411 )
127+- fix makefile targets `books/{name}.*` and `books/user.pdf` ( #2420 #2530 )
128+- upload-pypi-test & linuxdoc has been released on PyPi ( #2456 )
129+- fix makefile target `gh-pages` : flatten history of branch gh.pages ( #2514 )
130+- optimize creation of the virtualenv & pyenvinstall targets ( #2421 )
131+- update pyenv pyenvinstall Make targets ( #2517 )
132+- makefile.python: remove duplicate pyenv-(un)install targets ( #2418 )
133+- [fix] make targets engines.languages and useragents.update ( #2643 )
134+- [fix] utils/serax.sh create_pyenv() - drop duplicate 'pip install .' ( #2621 )
139+- drop Ubuntu 16.04 (Xenial Xerus) support ( #2619 )
140+- replace ubu1910 image by ubu2010 image ( #2435 )
141+- LXC switch to Fedora 33 / Fedora 31 reached its EOL #2634 ( #2634 )
142+- add package which to CentOS-7 boilerplate ( #2623 )
143+- use SEARX_SETTINGS_TEMPLATE from .config environment ( #2417 )
144+- determine path to makefile.lxc in a LXC ( #2399 )
145+- remove unused code ( #2401 #2497 )
146+- support git versions <v2.22 ( #2620 )
151+We, the searx maintainer team, would like to say a huge thank you for everybody who had been involved in the development of searx or supported us in the past 7 years - making our first stable release available. Special thanks to [NLNet](https://nlnet.nl) for sponsoring multiple features of this release.
10.18.0 2020.12.14
1540.18.0 2020.12.14
2=================
155=================
@@ -28,7 +181,7 @@ New settings.yml
28- ``server.method: "POST"`` - Make default query submission method configurable ( #2130 )
181- ``server.method: "POST"`` - Make default query submission method configurable ( #2130 )
29- ``server.default_http_headers`` - add default http headers ( #2295 )
182- ``server.default_http_headers`` - add default http headers ( #2295 )
30- ``engines.*.proxies`` - Using proxy only for specific engines ( #1827 #2319 ), see https://searx.github.io/searx/dev/engine_overview.html#settings-yml
183- ``engines.*.proxies`` - Using proxy only for specific engines ( #1827 #2319 ), see https://searx.github.io/searx/dev/engine_overview.html#settings-yml
31−- ``enabled_plugins`` - Enabled plugins ( a05c660e3036ad8d02072fc6731af54c2ed6151c )
184+- ``enabled_plugins`` - Enabled plugins ( a05c660e3036ad8d02072fc6731af54c2ed6151c )
32- ``preferences.lock`` - Let admins lock user preferences ( #2270 )
185- ``preferences.lock`` - Let admins lock user preferences ( #2270 )
34Oscar theme
187Oscar theme
@@ -38,10 +191,10 @@ Oscar theme
39 - Make infoboxes shorter by default.
192 - Make infoboxes shorter by default.
40 - Hide the main image by default as well and set a maximum height even when expanded.
193 - Hide the main image by default as well and set a maximum height even when expanded.
41− - Add a toggle at the bottom of the infobox to expand it or to shrink it again.
194+ - Add a toggle at the bottom of the infobox to expand it or to shrink it again.
42 - Fix pointhi style
195 - Fix pointhi style
43- query suggestion does not keep the language tag of the original query ( #1314 )
196- query suggestion does not keep the language tag of the original query ( #1314 )
44−- fix the clear button ( #2306 )
197+- fix the clear button ( #2306 )
46Simple theme
199Simple theme
47~~~~~~~~~~~~
200~~~~~~~~~~~~
@@ -1,29 +1,22 @@
1−FROM alpine:3.12
1+FROM alpine:3.15
2ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
2ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
4VOLUME /etc/searx
4VOLUME /etc/searx
5VOLUME /var/log/uwsgi
5VOLUME /var/log/uwsgi
8−ARG VERSION_GITCOMMIT=unknown
9−ARG SEARX_GIT_VERSION=unknown
11ARG SEARX_GID=977
7ARG SEARX_GID=977
12ARG SEARX_UID=977
8ARG SEARX_UID=977
14RUN addgroup -g ${SEARX_GID} searx && \
10RUN addgroup -g ${SEARX_GID} searx && \
15 adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
11 adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
17−ARG TIMESTAMP_SETTINGS=0
22ENV INSTANCE_NAME=searx \
13ENV INSTANCE_NAME=searx \
23 AUTOCOMPLETE= \
14 AUTOCOMPLETE= \
24 BASE_URL= \
15 BASE_URL= \
25 MORTY_KEY= \
16 MORTY_KEY= \
26− MORTY_URL=
17+ MORTY_URL= \
18+ SEARX_SETTINGS_PATH=/etc/searx/settings.yml \
19+ UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
28WORKDIR /usr/local/searx
21WORKDIR /usr/local/searx
@@ -41,8 +34,6 @@ RUN apk upgrade --no-cache \
41 openssl-dev \
34 openssl-dev \
46 && apk add --no-cache \
37 && apk add --no-cache \
47 ca-certificates \
38 ca-certificates \
@@ -55,15 +46,19 @@ RUN apk upgrade --no-cache \
56 uwsgi-python3 \
47 uwsgi-python3 \
59− && pip3 install --upgrade pip \
49+ && pip3 install --upgrade pip wheel setuptools \
60 && pip3 install --no-cache -r requirements.txt \
50 && pip3 install --no-cache -r requirements.txt \
61 && apk del build-dependencies \
51 && apk del build-dependencies \
62 && rm -rf /root/.cache
52 && rm -rf /root/.cache
64−COPY --chown=searx:searx . .
54+COPY searx ./searx
55+COPY dockerfiles ./dockerfiles
57+ARG TIMESTAMP_SETTINGS=0
59+ARG VERSION_GITCOMMIT=unknown
66−RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \
61+RUN /usr/bin/python3 -m compileall -q searx; \
67 touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
62 touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
68 touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
63 touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
69 if [ ! -z $VERSION_GITCOMMIT ]; then\
64 if [ ! -z $VERSION_GITCOMMIT ]; then\
@@ -73,8 +68,12 @@ RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \
73 -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
68 -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
74 -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
69 -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
76−# Keep this argument at the end since it change each time
71+# Keep these arguments at the end to prevent redundant layer rebuilds
77ARG LABEL_DATE=
72ARG LABEL_DATE=
74+ARG SEARX_GIT_VERSION=unknown
78LABEL maintainer="searx <${GIT_URL}>" \
77LABEL maintainer="searx <${GIT_URL}>" \
79 description="A privacy-respecting, hackable metasearch engine." \
78 description="A privacy-respecting, hackable metasearch engine." \
80 version="${SEARX_GIT_VERSION}" \
79 version="${SEARX_GIT_VERSION}" \
@@ -1,243 +1,107 @@
1# -*- coding: utf-8; mode: makefile-gmake -*-
1# -*- coding: utf-8; mode: makefile-gmake -*-
2+# SPDX-License-Identifier: AGPL-3.0-or-later
2.DEFAULT_GOAL=help
4.DEFAULT_GOAL=help
4include utils/makefile.include
7include utils/makefile.include
8−PY_SETUP_EXTRAS ?= \[test\]
9−PYLINT_SEARX_DISABLE_OPTION := I,C,R,W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,E1136
10−PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES := supported_languages,language_aliases
12−include utils/makefile.python
13−include utils/makefile.sphinx
15all: clean install
9all: clean install
17−PHONY += help-min help-all help
11+PHONY += help
19−help: help-min
13+help:
20− @echo ''
14+ @./manage --help
21− @echo 'to get more help: make help-all'
15+ @echo '----'
24− @echo ' test - run developer tests'
25− @echo ' docs - build documentation'
26− @echo ' docs-live - autobuild HTML documentation while editing'
27− @echo ' run - run developer instance'
16+ @echo 'run - run developer instance'
28− @echo ' install - developer install (./local)'
17+ @echo 'install - developer install of searx into virtualenv'
29− @echo ' uninstall - uninstall (./local)'
18+ @echo 'uninstall - uninstall developer installation'
30− @echo ' gh-pages - build docs & deploy on gh-pages branch'
19+ @echo 'clean - clean up working tree'
31− @echo ' clean - drop builds and environments'
20+ @echo 'search.checker - check search engines'
32− @echo ' project - re-build generic files of the searx project'
21+ @echo 'test - run shell & CI tests'
33− @echo ' buildenv - re-build environment files (aka brand)'
22+ @echo 'test.sh - test shell scripts'
34− @echo ' themes - re-build build the source of the themes'
23+ @echo 'ci.test - run CI tests'
35− @echo ' docker - build Docker image'
36− @echo ' node.env - download & install npm dependencies locally'
38− @$(MAKE) -e -s make-help
42− @$(MAKE) -e -s python-help
44− @$(MAKE) -e -s docs-help
47−install: buildenv pyenvinstall
50−uninstall: pyenvuninstall
53−clean: pyclean docs-clean node.clean test.clean
54− $(call cmd,common_clean)
56PHONY += run
26PHONY += run
57−run: buildenv pyenvinstall
27+run: install
59 sleep 2 ; \
29 sleep 2 ; \
60 xdg-open http://127.0.0.1:8888/ ; \
30 xdg-open http://127.0.0.1:8888/ ; \
62− SEARX_DEBUG=1 $(PY_ENV)/bin/python ./searx/webapp.py
32+ SEARX_DEBUG=1 ./manage pyenv.cmd python ./searx/webapp.py
67−sphinx-doc-prebuilds:: buildenv pyenvinstall prebuild-includes
70−docs: sphinx-doc-prebuilds
71− $(call cmd,sphinx,html,docs,docs)
74−docs-live: sphinx-doc-prebuilds
75− $(call cmd,sphinx_autobuild,html,docs,docs)
77−PHONY += prebuild-includes
79− $(Q)mkdir -p $(DOCS_BUILD)/includes
80− $(Q)./utils/searx.sh doc | cat > $(DOCS_BUILD)/includes/searx.rst
81− $(Q)./utils/filtron.sh doc | cat > $(DOCS_BUILD)/includes/filtron.rst
82− $(Q)./utils/morty.sh doc | cat > $(DOCS_BUILD)/includes/morty.rst
86− @echo "doc available at --> $(DOCS_URL)"
88−# update project files
89−# --------------------
91−PHONY += project engines.languages useragents.update buildenv
34+PHONY += install uninstall
36+ $(Q)./manage pyenv.$@
93−project: buildenv useragents.update engines.languages
38+PHONY += clean
94−
39+clean: py.clean docs.clean node.clean test.clean
95−engines.languages: pyenvinstall
40+ $(Q)./manage build_msg CLEAN "common files"
96− $(Q)echo "fetch languages .."
41+ $(Q)find . -name '*.orig' -exec rm -f {} +
97− $(Q)$(PY_ENV_ACT); python utils/fetch_languages.py
42+ $(Q)find . -name '*.rej' -exec rm -f {} +
98− $(Q)echo "update searx/data/engines_languages.json"
43+ $(Q)find . -name '*~' -exec rm -f {} +
99− $(Q)mv engines_languages.json searx/data/engines_languages.json
44+ $(Q)find . -name '*.bak' -exec rm -f {} +
100− $(Q)echo "update searx/languages.py"
45+
101− $(Q)mv languages.py searx/languages.py
46+PHONY += search.checker search.checker.%
102−
47+search.checker: install
103−useragents.update: pyenvinstall
48+ $(Q)./manage pyenv.cmd searx-checker -v
104− $(Q)echo "Update searx/data/useragents.json with the most recent versions of Firefox."
49+
105− $(Q)$(PY_ENV_ACT); python utils/fetch_firefox_version.py
50+search.checker.%: install
106−
51+ $(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
108− $(Q)$(PY_ENV_ACT); SEARX_DEBUG=1 python utils/build_env.py
53+PHONY += ci.test test test.sh
109−
54+ci.test: test.pep8 test.pylint test.unit test.robot
110−# node / npm
55+test: ci.test
111−# ----------
56+test.sh:
112−
57+ $(Q)shellcheck -x -s bash \
113−node.env: buildenv
58+ utils/brand.env \
114− $(Q)./manage.sh npm_packages
59+ ./manage \
116−node.clean:
61+ utils/filtron.sh \
117− $(Q)echo "CLEAN locally installed npm dependencies"
62+ utils/searx.sh \
118− $(Q)rm -rf \
63+ utils/morty.sh \
119− ./node_modules \
64+ utils/lxc.sh \
120− ./package-lock.json \
65+ utils/lxc-searx.env \
121− ./searx/static/themes/oscar/package-lock.json \
66+ .config.sh
122− ./searx/static/themes/oscar/node_modules \
67+ $(Q)./manage build_msg TEST "$@ OK"
123− ./searx/static/themes/simple/package-lock.json \
124− ./searx/static/themes/simple/node_modules
129−PHONY += themes.bootstrap themes themes.oscar themes.simple
130−themes: buildenv themes.bootstrap themes.oscar themes.simple
132−quiet_cmd_lessc = LESSC $3
133− cmd_lessc = PATH="$$(npm bin):$$PATH" \
134− lessc --clean-css="--s1 --advanced --compatibility=ie9" "searx/static/$2" "searx/static/$3"
136−quiet_cmd_grunt = GRUNT $2
137− cmd_grunt = PATH="$$(npm bin):$$PATH" \
138− grunt --gruntfile "$2"
140−themes.oscar: node.env
141− $(Q)echo '[!] build oscar theme'
142− $(call cmd,grunt,searx/static/themes/oscar/gruntfile.js)
144−themes.simple: node.env
70+# wrap ./manage script
145− $(Q)echo '[!] build simple theme'
146− $(call cmd,grunt,searx/static/themes/simple/gruntfile.js)
148−themes.bootstrap: node.env
72+MANAGE += buildenv
149− $(call cmd,lessc,less/bootstrap/bootstrap.less,css/bootstrap.min.css)
73+MANAGE += babel.compile
74+MANAGE += data.all data.languages data.useragents
75+MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
76+MANAGE += docker.build docker.push
77+MANAGE += gecko.driver
78+MANAGE += node.env node.clean
79+MANAGE += py.build py.clean
80+MANAGE += pyenv pyenv.install pyenv.uninstall
81+MANAGE += pypi.upload pypi.upload.test
82+MANAGE += test.pylint test.pep8 test.unit test.coverage test.robot test.clean
83+MANAGE += themes.all themes.oscar themes.simple themes.bootstrap
152−# docker
87+$(MANAGE):
153−# ------
88+ $(Q)$(MTOOLS) $@
155−PHONY += docker
90+# deprecated
157− $(Q)./manage.sh docker_build
159−docker.push: buildenv
92+PHONY += docs docs-clean docs-live docker themes
160− $(Q)./manage.sh docker_build push
162−# gecko
94+docs: docs.html
163−# -----
95+ $(Q)./manage build_msg WARN $@ is deprecated use docs.html
165−PHONY += gecko.driver
97+docs-clean: docs.clean
166−gecko.driver:
98+ $(Q)./manage build_msg WARN $@ is deprecated use docs.clean
167− $(PY_ENV_ACT); ./manage.sh install_geckodriver
169−# test
100+docs-live: docs.live
170−# ----
101+ $(Q)./manage build_msg WARN $@ is deprecated use docs.live
172−PHONY += test test.sh test.pylint test.pep8 test.unit test.coverage test.robot
103+docker: docker.build
173−test: buildenv test.pylint test.pep8 test.unit gecko.driver test.robot
104+ $(Q)./manage build_msg WARN $@ is deprecated use docker.build
176− searx/preferences.py \
178− searx/engines/gigablast.py \
179− searx/engines/deviantart.py \
180− searx/engines/digg.py \
181− searx/engines/google.py \
182− searx/engines/google_news.py
184−test.pylint: pyenvinstall
106+themes: themes.all
185− $(call cmd,pylint,$(PYLINT_FILES))
107+ $(Q)./manage build_msg WARN $@ is deprecated use themes.all
187− --disable=$(PYLINT_SEARX_DISABLE_OPTION) \
188− --additional-builtins=$(PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES) \
192− --disable=$(PYLINT_SEARX_DISABLE_OPTION) \
193− --ignore=searx/engines \
198−# E402 module level import not at top of file
199−# W503 line break before binary operator
201−# ubu1604: uses shellcheck v0.3.7 (from 04/2015), no longer supported!
203− shellcheck -x -s bash utils/brand.env
204− shellcheck -x utils/lib.sh
205− shellcheck -x utils/filtron.sh
206− shellcheck -x utils/searx.sh
207− shellcheck -x utils/morty.sh
208− shellcheck -x utils/lxc.sh
209− shellcheck -x utils/lxc-searx.env
210− shellcheck -x .config.sh
212−test.pep8: pyenvinstall
213− @echo "TEST pycodestyle (formerly pep8)"
214− $(Q)$(PY_ENV_ACT); pycodestyle --exclude='searx/static, searx/languages.py, $(foreach f,$(PYLINT_FILES),$(f),)' \
215− --max-line-length=120 --ignore "E117,E252,E402,E722,E741,W503,W504,W605" searx tests
217−test.unit: pyenvinstall
218− @echo "TEST tests/unit"
219− $(Q)$(PY_ENV_ACT); python -m nose2 -s tests/unit
221−test.coverage: pyenvinstall
222− @echo "TEST unit test coverage"
223− $(Q)$(PY_ENV_ACT); \
224− python -m nose2 -C --log-capture --with-coverage --coverage searx -s tests/unit \
225− && coverage report \
228−test.robot: pyenvinstall gecko.driver
230− $(Q)$(PY_ENV_ACT); PYTHONPATH=. python searx/testing.py robot
233− @echo "CLEAN intermediate test stuff"
234− $(Q)rm -rf geckodriver.log .coverage coverage/
241− $(Q)$(PY_ENV_BIN)/python -m pip install codecov
@@ -17,7 +17,7 @@
17|OpenCollective searx backers|
17|OpenCollective searx backers|
18|OpenCollective searx sponsors|
18|OpenCollective searx sponsors|
20−Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **səːks**.
20+Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **sɜːks**.
22.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
22.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
@@ -61,7 +61,7 @@ our homepage_.
61.. _homepage: https://searx.github.io/searx
61.. _homepage: https://searx.github.io/searx
64− openhub_ // twitter_ // IRC: #searx @ freenode
64+ openhub_ // twitter_ // IRC: #searx @ Libera (irc.libera.chat)
66.. _openhub: https://www.openhub.net/p/searx
66.. _openhub: https://www.openhub.net/p/searx
67.. _twitter: https://twitter.com/Searx_engine
67.. _twitter: https://twitter.com/Searx_engine
dockerfiles/docker-entrypoint.sh−3
@@ -24,9 +24,6 @@ if [ -z "${BIND_ADDRESS}" ]; then
24 export BIND_ADDRESS="${DEFAULT_BIND_ADDRESS}"
24 export BIND_ADDRESS="${DEFAULT_BIND_ADDRESS}"
27−export UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
28−export SEARX_SETTINGS_PATH=/etc/searx/settings.yml
30# Parse special command line
27# Parse special command line
31# see docs/admin/installation-docker.rst
28# see docs/admin/installation-docker.rst
32# display the help message without the version
29# display the help message without the version
docs/admin/buildhosts.rst+4−4
@@ -49,9 +49,9 @@ Build docs
49 - dvisvgm_
49 - dvisvgm_
51Most of the sphinx requirements are installed from :origin:`setup.py` and the
51Most of the sphinx requirements are installed from :origin:`setup.py` and the
52−docs can be build from scratch with ``make docs``. For better math and image
52+docs can be build from scratch with ``make docs.html``. For better math and
53−processing additional packages are needed. The XeTeX_ needed not only for PDF
53+image processing additional packages are needed. The XeTeX_ needed not only for
54−creation, its also needed for :ref:`math` when HTML output is build.
54+PDF creation, its also needed for :ref:`math` when HTML output is build.
56To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
56To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
57as images (``sphinx.ext.imgmath`` extension).
57as images (``sphinx.ext.imgmath`` extension).
@@ -64,7 +64,7 @@ to ``imgmath``:
64 :start-after: # sphinx.ext.imgmath setup
64 :start-after: # sphinx.ext.imgmath setup
65 :end-before: # sphinx.ext.imgmath setup END
65 :end-before: # sphinx.ext.imgmath setup END
67−If your docs build (``make docs``) shows warnings like this::
67+If your docs build (``make docs.html``) shows warnings like this::
69 WARNING: dot(1) not found, for better output quality install \
69 WARNING: dot(1) not found, for better output quality install \
70 graphviz from https://www.graphviz.org
70 graphviz from https://www.graphviz.org
docs/admin/filtron.rst+1−1
@@ -173,7 +173,7 @@ Use it along with ``nginx`` with the following example configuration.
173 location /searx {
173 location /searx {
174 proxy_pass http://127.0.0.1:4004/;
174 proxy_pass http://127.0.0.1:4004/;
176− proxy_set_header Host $http_host;
176+ proxy_set_header Host $host;
177 proxy_set_header Connection $http_connection;
177 proxy_set_header Connection $http_connection;
178 proxy_set_header X-Real-IP $remote_addr;
178 proxy_set_header X-Real-IP $remote_addr;
179 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
179 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
docs/admin/installation-apache.rst+8−7
@@ -180,10 +180,6 @@ modules and create a `Location`_ configuration for the searx site. In most
180distributions you have to un-comment the lines in the main configuration file,
180distributions you have to un-comment the lines in the main configuration file,
181except in :ref:`The Debian Layout`.
181except in :ref:`The Debian Layout`.
183−To pass the HTTP HOST header
184−With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
189 .. group-tab:: Ubuntu / debian
185 .. group-tab:: Ubuntu / debian
@@ -231,6 +227,11 @@ proxied host.
231 LoadModule proxy_module modules/mod_proxy.so
227 LoadModule proxy_module modules/mod_proxy.so
232 LoadModule proxy_http_module modules/mod_proxy_http.so
228 LoadModule proxy_http_module modules/mod_proxy_http.so
230+With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
233+.. _apache searx via filtron plus morty:
236 .. group-tab:: searx via filtron plus morty
237 .. group-tab:: searx via filtron plus morty
@@ -285,15 +286,15 @@ proxied host.
286 </Location>
287 </Location>
288− Note that reverse proxy advised to be used in case of single-user or
289− low-traffic instances. For a fully result proxification add :ref:`morty's
289+ For a fully result proxification add :ref:`morty's <searx morty>` **public
290− <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
290+ URL** to your :origin:`searx/settings.yml`:
292 .. code:: yaml
292 .. code:: yaml
294 result_proxy:
294 result_proxy:
295 # replace example.org with your server's public name
295 # replace example.org with your server's public name
296 url : https://example.org/morty
296 url : https://example.org/morty
297+ key : !!binary "insert_your_morty_proxy_key_here"
299 image_proxy : True
300 image_proxy : True
docs/admin/installation-docker.rst+1−1
@@ -51,7 +51,7 @@ It's also possible to build searx from the embedded Dockerfile.
52 git clone https://github.com/searx/searx.git
52 git clone https://github.com/searx/searx.git
54− make docker
54+ make docker.build
57Public instance
57Public instance
docs/admin/installation-nginx.rst+14−12
@@ -163,6 +163,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
163 Create configuration at ``/etc/nginx/conf.d/searx`` and place a
163 Create configuration at ``/etc/nginx/conf.d/searx`` and place a
164 symlink to sites-enabled:
164 symlink to sites-enabled:
166+.. _nginx searx via filtron plus morty:
168 .. group-tab:: searx via filtron plus morty
170 .. group-tab:: searx via filtron plus morty
@@ -180,7 +182,7 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
180 location /searx {
182 location /searx {
181 proxy_pass http://127.0.0.1:4004/;
183 proxy_pass http://127.0.0.1:4004/;
183− proxy_set_header Host $http_host;
185+ proxy_set_header Host $host;
184 proxy_set_header Connection $http_connection;
186 proxy_set_header Connection $http_connection;
185 proxy_set_header X-Real-IP $remote_addr;
187 proxy_set_header X-Real-IP $remote_addr;
186 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
188 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -188,8 +190,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
188 proxy_set_header X-Script-Name /searx;
190 proxy_set_header X-Script-Name /searx;
191− location /searx/static {
193+ location /searx/static/ {
192− alias /usr/local/searx/searx-src/searx/static;
194+ alias /usr/local/searx/searx-src/searx/static/;
@@ -203,28 +205,28 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
203 location /morty {
205 location /morty {
204 proxy_pass http://127.0.0.1:3000/;
206 proxy_pass http://127.0.0.1:3000/;
206− proxy_set_header Host $http_host;
208+ proxy_set_header Host $host;
207 proxy_set_header Connection $http_connection;
209 proxy_set_header Connection $http_connection;
208 proxy_set_header X-Real-IP $remote_addr;
210 proxy_set_header X-Real-IP $remote_addr;
209 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
211 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
210 proxy_set_header X-Scheme $scheme;
212 proxy_set_header X-Scheme $scheme;
213− Note that reverse proxy advised to be used in case of single-user or
214− low-traffic instances. For a fully result proxification add :ref:`morty's
215+ For a fully result proxification add :ref:`morty's <searx morty>` **public
215− <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
216+ URL** to your :origin:`searx/settings.yml`:
217 .. code:: yaml
218 .. code:: yaml
219 result_proxy:
220 result_proxy:
220 # replace example.org with your server's public name
221 # replace example.org with your server's public name
221 url : https://example.org/morty
222 url : https://example.org/morty
223+ key : !!binary "insert_your_morty_proxy_key_here"
224 image_proxy : True
226 image_proxy : True
227− .. group-tab:: proxy or uWSGI
229+ .. group-tab:: proxy or uWSGI
229 Be warned, with this setup, your instance isn't :ref:`protected <searx
231 Be warned, with this setup, your instance isn't :ref:`protected <searx
230 filtron>`. Nevertheless it is good enough for intranet usage and it is a
232 filtron>`. Nevertheless it is good enough for intranet usage and it is a
@@ -307,8 +309,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
307 proxy_buffering off;
309 proxy_buffering off;
310− location /searx/static {
312+ location /searx/static/ {
311− alias /usr/local/searx/searx-src/searx/static;
313+ alias /usr/local/searx/searx-src/searx/static/;
314 The ``X-Script-Name /searx`` is needed by the searx implementation to
316 The ``X-Script-Name /searx`` is needed by the searx implementation to
@@ -326,8 +328,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
326 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
328 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
329− location /searx/static {
331+ location /searx/static/ {
330− alias /usr/local/searx/searx-src/searx;
332+ alias /usr/local/searx/searx-src/searx/;
333 For searx to work correctly the ``base_url`` must be set in the
335 For searx to work correctly the ``base_url`` must be set in the
docs/admin/installation-searx.rst+1−1
@@ -61,7 +61,7 @@ from the login (*~/.profile*):
64− Open a second terminal for the configuration tasks and left the ``(searx)$``
64+ Open a second terminal for the configuration tasks and leave the ``(searx)$``
65 terminal open for the tasks below.
65 terminal open for the tasks below.
docs/admin/installation.rst+6−1
@@ -39,13 +39,18 @@ install from ``root``, take into account that the scripts are creating a
39these new created users do need read access to the clone of searx, which is not
39these new created users do need read access to the clone of searx, which is not
40the case if you clone into a folder below ``/root``.
40the case if you clone into a folder below ``/root``.
43.. code:: bash
42.. code:: bash
45 $ cd ~/Downloads
44 $ cd ~/Downloads
46 $ git clone https://github.com/searx/searx searx
45 $ git clone https://github.com/searx/searx searx
47 $ cd searx
46 $ cd searx
48+.. sidebar:: further read
51+ - :ref:`update searx`
52+ - :ref:`inspect searx`
49**Install** :ref:`searx service <searx.sh>`
54**Install** :ref:`searx service <searx.sh>`
51This installs searx as described in :ref:`installation basic`.
56This installs searx as described in :ref:`installation basic`.
docs/admin/morty.rst+11−4
@@ -16,15 +16,22 @@ By default searx can only act as an image proxy for result images, but it is
16possible to proxify all the result URLs with an external service, morty_.
16possible to proxify all the result URLs with an external service, morty_.
18To use this feature, morty has to be installed and activated in searx's
18To use this feature, morty has to be installed and activated in searx's
21−Add the following snippet to your ``settings.yml`` and restart searx:
19+``settings.yml``. Add the following snippet to your ``settings.yml`` and
23.. code:: yaml
22.. code:: yaml
25 result_proxy:
24 result_proxy:
26 url : http://127.0.0.1:3000/
25 url : http://127.0.0.1:3000/
27− key : your_morty_proxy_key
26+ key : !!binary "insert_your_morty_proxy_key_here"
28+Note that the example above (``http://127.0.0.1:3000``) is only for single-user
29+instances without a HTTP proxy. If your morty service is public, the url is the
30+address of the reverse proxy (e.g ``https://example.org/morty``).
32+For more information about *result proxy* have a look at *"searx via filtron
33+plus morty"* in the :ref:`nginx <nginx searx via filtron plus morty>` and
34+:ref:`apache <apache searx via filtron plus morty>` sections.
30 Is the address of the running morty service.
37 Is the address of the running morty service.
docs/admin/settings.rst+51−13
@@ -130,14 +130,12 @@ Global Settings
130 request_timeout : 2.0 # default timeout in seconds, can be override by engine
130 request_timeout : 2.0 # default timeout in seconds, can be override by engine
131 # max_request_timeout: 10.0 # the maximum timeout in seconds
131 # max_request_timeout: 10.0 # the maximum timeout in seconds
132 useragent_suffix : "" # informations like an email address to the administrator
132 useragent_suffix : "" # informations like an email address to the administrator
133− pool_connections : 100 # Number of different hosts
133+ pool_connections : 100 # Maximum number of allowable connections, or None for no limits. The default is 100.
134− pool_maxsize : 10 # Number of simultaneous requests by host
134+ pool_maxsize : 10 # Number of allowable keep-alive connections, or None to always allow. The default is 10.
135+ enable_http2: True # See https://www.python-httpx.org/http2/
135 # uncomment below section if you want to use a proxy
136 # uncomment below section if you want to use a proxy
136 # proxies:
137 # proxies:
137− # http:
138+ # all://:
138− # - http://proxy1:8080
139− # - http://proxy2:8080
141 # - http://proxy1:8080
139 # - http://proxy1:8080
142 # - http://proxy2:8080
140 # - http://proxy2:8080
143 # uncomment below section only if you have more than one network interface
141 # uncomment below section only if you have more than one network interface
@@ -145,6 +143,7 @@ Global Settings
145 # source_ips:
143 # source_ips:
146 # - 1.1.1.1
144 # - 1.1.1.1
147 # - 1.1.1.2
145 # - 1.1.1.2
150``request_timeout`` :
149``request_timeout`` :
@@ -157,20 +156,46 @@ Global Settings
157 Suffix to the user-agent searx uses to send requests to others engines. If an
156 Suffix to the user-agent searx uses to send requests to others engines. If an
158 engine wish to block you, a contact info here may be useful to avoid that.
157 engine wish to block you, a contact info here may be useful to avoid that.
160−.. _requests proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies
159+``keepalive_expiry``:
161−.. _PySocks: https://pypi.org/project/PySocks/
160+ Number of seconds to keep a connection in the pool. By default 5.0 seconds.
162+.. _httpx proxies: https://www.python-httpx.org/advanced/#http-proxying
163``proxies`` :
164``proxies`` :
164− Define one or more proxies you wish to use, see `requests proxies`_.
165+ Define one or more proxies you wish to use, see `httpx proxies`_.
165 If there are more than one proxy for one protocol (http, https),
166 If there are more than one proxy for one protocol (http, https),
166 requests to the engines are distributed in a round-robin fashion.
167 requests to the engines are distributed in a round-robin fashion.
168− - Proxy: `see <https://2.python-requests.org/en/latest/user/advanced/#proxies>`__.
169− - SOCKS proxies are also supported: `see <https://2.python-requests.org/en/latest/user/advanced/#socks>`__
171``source_ips`` :
169``source_ips`` :
172 If you use multiple network interfaces, define from which IP the requests must
170 If you use multiple network interfaces, define from which IP the requests must
173− be made. This parameter is ignored when ``proxies`` is set.
171+ be made. Example:
173+ * ``0.0.0.0`` any local IPv4 address.
174+ * ``::`` any local IPv6 address.
176+ * ``[ 192.168.0.1, 192.168.0.2 ]`` these two specific IP addresses
177+ * ``fe80::60a2:1691:e5a2:ee1f``
178+ * ``fe80::60a2:1691:e5a2:ee1f/126`` all IP addresses in this network.
179+ * ``[ 192.168.0.1, fe80::/126 ]``
182+ Number of retry in case of an HTTP error.
183+ On each retry, searx uses an different proxy and source ip.
185+``retry_on_http_error`` :
186+ Retry request on some HTTP status code.
190+ * ``true`` : on HTTP status code between 400 and 599.
191+ * ``403`` : on HTTP status code 403.
192+ * ``[403, 429]``: on HTTP status code 403 and 429.
195+ Enable by default. Set to ``False`` to disable HTTP/2.
198+ 30 by default. Maximum redirect before it is an error.
176``locales:``
201``locales:``
@@ -216,6 +241,13 @@ Engine settings
216 api_key : 'apikey'
241 api_key : 'apikey'
217 disabled : True
242 disabled : True
218 language : en_US
243 language : en_US
245+ #enable_http2: False
247+ #retry_on_http_error: True # or 403 or [404, 429]
248+ #max_connections: 100
249+ #max_keepalive_connections: 10
250+ #keepalive_expiry: 5.0
219 #proxies:
251 #proxies:
221 # - http://proxy1:8080
253 # - http://proxy1:8080
@@ -270,6 +302,12 @@ Engine settings
270``display_error_messages`` : default ``True``
302``display_error_messages`` : default ``True``
271 When an engine returns an error, the message is displayed on the user interface.
303 When an engine returns an error, the message is displayed on the user interface.
305+``network``: optional
306+ Use the network configuration from another engine.
307+ In addition, there are two default networks:
308+ * ``ipv4`` set ``local_addresses`` to ``0.0.0.0`` (use only IPv4 local addresses)
309+ * ``ipv6`` set ``local_addresses`` to ``::`` (use only IPv6 local addresses)
275 A few more options are possible, but they are pretty specific to some
313 A few more options are possible, but they are pretty specific to some
docs/admin/update-searx.rst+46−10
@@ -4,20 +4,56 @@
4How to update
4How to update
5=============
5=============
7+How to update depends on the :ref:`installation` method. If you have used the
8+:ref:`installation scripts`, use ``update`` command from the scripts.
10+**Update** :ref:`searx service <searx.sh>`
14+ sudo -H ./utils/searx.sh update searx
16+**Update** :ref:`filtron reverse proxy <filtron.sh>`
7.. code:: sh
18.. code:: sh
20+ sudo -H ./utils/filtron.sh update filtron
22+**Update** :ref:`result proxy <morty.sh>`
26+ sudo -H ./utils/morty.sh update morty
9− sudo -H -u searx -i
28+.. _inspect searx:
10− (searx)$ git stash
29+
11− (searx)$ git pull origin master
30+======================
12− (searx)$ git stash apply
31+How to inspect & debug
13− (searx)$ ./manage.sh update_packages
32+======================
34+.. sidebar:: further read
39+How to debug depends on the :ref:`installation` method. If you have used the
40+:ref:`installation scripts`, use ``inspect`` command from the scripts.
42+**Inspect** :ref:`searx service <searx.sh>`
46+ sudo -H ./utils/searx.sh inspect service
48+**Inspect** :ref:`filtron reverse proxy <filtron.sh>`
15−Restart uwsgi:
52+ sudo -H ./utils/filtron.sh inspect service
17−.. tabs::
54+**Inspect** :ref:`result proxy <morty.sh>`
19− .. group-tab:: Ubuntu / debian
56+.. code:: bash
21− .. code:: sh
58+ sudo -H ./utils/morty.sh inspect service
23− sudo -H systemctl restart uwsgi
@@ -3,12 +3,15 @@ Blog
5.. toctree::
5.. toctree::
6− :maxdepth: 2
6+ :titlesonly:
7− :caption: Contents
7+ :reversed:
12 intro-offline
11 intro-offline
13 private-engines
12 private-engines
14 command-line-engines
14 command-line-engines
15+ search-indexer-engines
17+ search-database-engines
docs/blog/lxcdev-202006.rst+3−3
@@ -31,7 +31,7 @@ might fail in some aspects we should not overlook.
32 The environment in which we run all our development processes matters!
32 The environment in which we run all our development processes matters!
34−The :ref:`makefile` and the :ref:`make pyenv` encapsulate a lot for us, but they
34+The :ref:`makefile` and the :ref:`make install` encapsulate a lot for us, but they
35do not have access to all prerequisites. For example, there may have
35do not have access to all prerequisites. For example, there may have
36dependencies on packages that are installed on the developer's desktop, but
36dependencies on packages that are installed on the developer's desktop, but
37usually are not preinstalled on a server or client system. Another examples
37usually are not preinstalled on a server or client system. Another examples
@@ -356,7 +356,7 @@ daily usage:
356 .. code:: sh
356 .. code:: sh
358 $ sudo -H ./utils/lxc.sh cmd searx-archlinux \
358 $ sudo -H ./utils/lxc.sh cmd searx-archlinux \
359− make docs
359+ make docs.html
361.. _blog-lxcdev-202006 abstract:
361.. _blog-lxcdev-202006 abstract:
@@ -407,7 +407,7 @@ To get remarks from the suite of the archlinux container we can use:
408 [searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
408 [searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
409 [searx-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/
409 [searx-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/
410− [searx-archlinux] INFO: (eth0) docs-live: http://10.174.184.156:8080/
410+ [searx-archlinux] INFO: (eth0) docs.live: http://10.174.184.156:8080/
411 [searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
411 [searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
docs/blog/search-database-engines.rstnew file+95
@@ -0,0 +1,95 @@
1+===============================
2+Query more of your NoSQL stores
3+===============================
5+From now on, searx lets you to query your NoSQL data stores:
10+The reference configuration of the engines are included ``settings.yml`` just commented out,
11+as you have to set various options and install dependencies before using them.
13+By default, the engines use ``key-value`` template for displaying results.
14+If you are not satisfied with the original result layout,
15+you can use your owm template by placing the template under
16+``searx/templates/{theme_name}/result_templates/{template_name}`` and setting
17+``result_template`` attribute to ``{template_name}``.
19+Futhermore, if you do not want to expose these engines on a public instance, you can
20+still add them and limit the access by setting ``tokens`` as described in the `blog post about
23+Configuring searx to use the stores
24+===================================
26+NoSQL data stores are used for storing arbitrary data without first defining their
32+Reqired package: ``redis``
34+Redis is a key value based data store usually stored in memory.
36+Select a database to search in and set its index in the option ``db``. You can
37+either look for exact matches or use partial keywords to find what you are looking for
38+by configuring ``exact_match_only``.
40+In this example you can search for exact matches in your first database:
45+ engine : redis_server
46+ exact_match_only : True
49+ password : secret-password
58+Required package: ``pymongo``
60+MongoDB is a document based database program that handles JSON like data.
62+In order to query MongoDB, you have to select a ``database`` and a ``collection``. Furthermore,
63+you have to select a ``key`` that is going to be searched. MongoDB also supports the option ``exact_match_only``, so configure it
66+Above is an example configuration for using a MongoDB collection:
84+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
86+.. _Redis: https://redis.io/
87+.. _MongoDB: https://mongodb.com/
88+.. _blog post about private engines: private-engines.html#private-engines
89+.. _Search and Discovery Fund: https://nlnet.nl/discovery
90+.. _NLnet Foundation: https://nlnet.nl/
94+| kvch // 2021.07.13 23:16
docs/blog/search-indexer-engines.rstnew file+114
@@ -0,0 +1,114 @@
1+===============================
2+Query your local search engines
3+===============================
5+From now on, searx lets you to query your locally running search engines. The following
6+ones are supported now:
12+All of the engines above are added to ``settings.yml`` just commented out, as you have to
13+``base_url`` for all them.
15+Please note that if you are not using HTTPS to access these engines, you have to enable
16+HTTP requests by setting ``enable_http`` to ``True``.
18+Futhermore, if you do not want to expose these engines on a public instance, you can
19+still add them and limit the access by setting ``tokens`` as described in the `blog post about
22+Configuring searx for search engines
23+====================================
25+Each search engine is powerful, capable of full-text search.
30+Elasticsearch supports numerous ways to query the data it is storing. At the moment
31+the engine supports the most popular search methods: ``match``, ``simple_query_string``, ``term`` and ``terms``.
33+If none of the methods fit your use case, you can select ``custom`` query type and provide the JSON payload
34+searx has to submit to Elasticsearch in ``custom_query_json``.
36+The following is an example configuration for an Elasticsearch instance with authentication
37+configured to read from ``my-index`` index.
41+ - name : elasticsearch
43+ engine : elasticsearch
44+ base_url : http://localhost:9200
55+This search engine is aimed at individuals and small companies. It is designed for
56+small-scale (less than 10 million documents) data collections. E.g. it is great for storing
57+web pages you have visited and searching in the contents later.
59+The engine supports faceted search, so you can search in a subset of documents of the collection.
60+Futhermore, you can search in Meilisearch instances that require authentication by setting ``auth_token``.
62+Here is a simple example to query a Meilisearch instance:
69+ base_url : http://localhost:7700
77+Solr is a popular search engine based on Lucene, just like Elasticsearch.
78+But instead of searching in indices, you can search in collections.
80+This is an example configuration for searching in the collection ``my-collection`` and get
81+the results in ascending order.
88+ base_url : http://localhost:8983
89+ collection : my-collection
97+The next step is to add support for various SQL databases.
102+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
104+.. _blog post about private engines: private-engines.html#private-engines
105+.. _Elasticsearch: https://www.elastic.co/elasticsearch/
106+.. _Meilisearch: https://www.meilisearch.com/
107+.. _Solr: https://solr.apache.org/
108+.. _Search and Discovery Fund: https://nlnet.nl/discovery
109+.. _NLnet Foundation: https://nlnet.nl/
113+| kvch // 2021.04.07 23:16
docs/blog/sql-engines.rstnew file+117
@@ -0,0 +1,117 @@
5+Now you can query SQL servers using searx. The following ones are supported:
11+All of the engines above are added to ``settings.yml`` just commented out, as you have to
12+set the required attributes for the engines, e.g. ``database``. By default, the engines use
13+``key-value`` template for displaying results. If you are not satisfied with the original result layout,
14+you can use your owm template by placing the template under
15+``searx/templates/{theme_name}/result_templates/{template_name}`` and setting
16+``result_template`` attribute to ``{template_name}``.
18+As mentioned in previous blog posts, if you do not wish to expose these engines on a
19+public instance, you can still add them and limit the access by setting ``tokens``
20+as described in the `blog post about private engines`_.
25+The configuration of the new database engines are similar. You must put a valid
26+SELECT SQL query in ``query_str``. At the moment you can only bind at most
27+one parameter in your query. By setting the attribute ``limit`` you can
28+define how many results you want from the SQL server. Basically, it
29+is the same as the LIMIT keyword in SQL.
31+Please, do not include LIMIT or OFFSET in your SQL query as the engines
32+rely on these keywords during paging. If you want to configure the number of returned results
33+use the option ``limit``.
38+PostgreSQL is a powerful and robust open source database.
40+Before configuring the PostgreSQL engine, you must install the dependency ``psychopg2``.
42+You can find an example configuration below:
48+ database : my_database
51+ query_str : 'SELECT * from my_table WHERE my_column = %(query)s'
58+MySQL is said to be the most popular open source database.
60+Before enabling MySQL engine, you must install the package ``mysql-connector-python``.
62+The authentication plugin is configurable by setting ``auth_plugin`` in the attributes.
63+By default it is set to ``caching_sha2_password``.
65+This is an example configuration for quering a MySQL server:
70+ engine : mysql_server
71+ database : my_database
75+ query_str : 'SELECT * from my_table WHERE my_column=%(query)s'
82+SQLite is a small, fast and reliable SQL database engine. It does not require
85+You can read from your database ``my_database`` using this example configuration:
92+ database : my_database
93+ query_str : 'SELECT * FROM my_table WHERE my_column=:query'
99+The next step is to add support for more data stores, e.g. Redis and MongoDB.
104+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
106+.. _PostgreSQL: https://www.postgresql.org/
107+.. _MySQL: https://www.mysql.com/
108+.. _SQLite: https://www.sqlite.org/index.html
109+.. _blog post about private engines: private-engines.html#private-engines
110+.. _Search and Discovery Fund: https://nlnet.nl/discovery
111+.. _NLnet Foundation: https://nlnet.nl/
115+| kvch // 2021.05.23 23:16
docs/build-templates/morty.rst+1−1
@@ -32,7 +32,7 @@
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
33 (${SERVICE_USER}) $ wget --progress=bar -O \"${GO_TAR}\" \\
33 (${SERVICE_USER}) $ wget --progress=bar -O \"${GO_TAR}\" \\
34 \"${GO_PKG_URL}\"
34 \"${GO_PKG_URL}\"
35− (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local/go -xzf \"${GO_TAR}\"
35+ (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local -xzf \"${GO_TAR}\"
36 (${SERVICE_USER}) $ which go
36 (${SERVICE_USER}) $ which go
37 ${SERVICE_HOME}/local/go/bin/go
37 ${SERVICE_HOME}/local/go/bin/go
@@ -1,7 +1,7 @@
1# -*- coding: utf-8 -*-
1# -*- coding: utf-8 -*-
2+# SPDX-License-Identifier: AGPL-3.0-or-later
3import sys, os
4import sys, os
4−from sphinx_build_tools import load_sphinx_config
5from pallets_sphinx_themes import ProjectLink
5from pallets_sphinx_themes import ProjectLink
7from searx import brand
7from searx import brand
@@ -10,7 +10,7 @@ from searx.version import VERSION_STRING
10# Project --------------------------------------------------------------
10# Project --------------------------------------------------------------
12project = u'searx'
12project = u'searx'
13−copyright = u'2015-2020, Adam Tauber, Noémi Ványi'
13+copyright = u'2015-2021, Adam Tauber, Noémi Ványi'
14author = u'Adam Tauber'
14author = u'Adam Tauber'
15release, version = VERSION_STRING, VERSION_STRING
15release, version = VERSION_STRING, VERSION_STRING
16highlight_language = 'none'
16highlight_language = 'none'
@@ -101,6 +101,7 @@ imgmath_font_size = 14
102html_theme_options = {"index_sidebar_logo": True}
102html_theme_options = {"index_sidebar_logo": True}
103html_context = {"project_links": [] }
103html_context = {"project_links": [] }
104+html_context["project_links"].append(ProjectLink("Blog", "blog/index.html"))
104if brand.GIT_URL:
105if brand.GIT_URL:
105 html_context["project_links"].append(ProjectLink("Source", brand.GIT_URL))
106 html_context["project_links"].append(ProjectLink("Source", brand.GIT_URL))
106if brand.WIKI_URL:
107if brand.WIKI_URL:
@@ -128,9 +129,3 @@ html_show_sourcelink = False
128latex_documents = [
129latex_documents = [
129 (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
130 (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
132−# ------------------------------------------------------------------------------
133−# Since loadConfig overwrites settings from the global namespace, it has to be
134−# the last statement in the conf.py file
135−# ------------------------------------------------------------------------------
136−load_sphinx_config(globals())
docs/dev/contribution_guide.rst+11−22
@@ -132,11 +132,11 @@ Here is an example which makes a complete rebuild:
133.. code:: sh
133.. code:: sh
135− $ make docs-clean docs
135+ $ make docs.clean docs.html
137 The HTML pages are in dist/docs.
137 The HTML pages are in dist/docs.
139−.. _make docs-live:
139+.. _make docs.live:
141live build
141live build
142----------
142----------
@@ -144,19 +144,19 @@ live build
144.. _sphinx-autobuild:
144.. _sphinx-autobuild:
145 https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
145 https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
147−.. sidebar:: docs-clean
147+.. sidebar:: docs.clean
149 It is recommended to assert a complete rebuild before deploying (use
149 It is recommended to assert a complete rebuild before deploying (use
150− ``docs-clean``).
150+ ``docs.clean``).
152Live build is like WYSIWYG. If you want to edit the documentation, its
152Live build is like WYSIWYG. If you want to edit the documentation, its
153−recommended to use. The Makefile target ``docs-live`` builds the docs, opens
153+recommended to use. The Makefile target ``docs.live`` builds the docs, opens
154URL in your favorite browser and rebuilds every time a reST file has been
154URL in your favorite browser and rebuilds every time a reST file has been
157.. code:: sh
157.. code:: sh
159− $ make docs-live
159+ $ make docs.live
161 The HTML pages are in dist/docs.
161 The HTML pages are in dist/docs.
162 ... Serving on http://0.0.0.0:8000
162 ... Serving on http://0.0.0.0:8000
@@ -169,7 +169,7 @@ argument. E.g to find and use a free port, use:
170.. code:: sh
170.. code:: sh
172− $ SPHINXOPTS="--port 0" make docs-live
172+ $ SPHINXOPTS="--port 0" make docs.live
174 ... Serving on http://0.0.0.0:50593
174 ... Serving on http://0.0.0.0:50593
@@ -180,21 +180,10 @@ argument. E.g to find and use a free port, use:
180deploy on github.io
180deploy on github.io
181-------------------
181-------------------
183−To deploy documentation at :docs:`github.io <.>` use Makefile target
183+To deploy documentation at :docs:`github.io <.>` use Makefile target :ref:`make
184−:ref:`make gh-pages`, which will builds the documentation, clones searx into a sub
184+docs.gh-pages`, which builds the documentation and runs all the needed git add,
185−folder ``gh-pages``, cleans it, copies the doc build into and runs all the
186−needed git add, commit and push:
185+commit and push:
188.. code:: sh
187.. code:: sh
190− $ make docs-clean gh-pages
189+ $ make docs.clean docs.gh-pages
192− SPHINX docs --> file://<...>/dist/docs
193− The HTML pages are in dist/docs.
195− Cloning into 'gh-pages' ...
197− cd gh-pages; git checkout gh-pages >/dev/null
198− Switched to a new branch 'gh-pages'
200− doc available at --> https://searx.github.io/searx
docs/dev/engine_overview.rst+3−2
@@ -42,7 +42,6 @@ argument type information
42======================= =========== ========================================================
42======================= =========== ========================================================
43categories list pages, in which the engine is working
43categories list pages, in which the engine is working
44paging boolean support multible pages
44paging boolean support multible pages
45−language_support boolean support language choosing
46time_range_support boolean support search time range
45time_range_support boolean support search time range
47engine_type str ``online`` by default, other possibles values are
46engine_type str ``online`` by default, other possibles values are
48 ``offline``, ``online_dictionnary``, ``online_currency``
47 ``offline``, ``online_dictionnary``, ``online_currency``
@@ -59,6 +58,8 @@ argument type information
59name string name of search-engine
58name string name of search-engine
60engine string name of searx-engine
59engine string name of searx-engine
61 (filename without ``.py``)
60 (filename without ``.py``)
61+enable_http bool enable HTTP
62+ (by default only HTTPS is enabled).
62shortcut string shortcut of search-engine
63shortcut string shortcut of search-engine
63timeout string specific timeout for search-engine
64timeout string specific timeout for search-engine
64display_error_messages boolean display error messages on the web UI
65display_error_messages boolean display error messages on the web UI
@@ -97,7 +98,6 @@ example code
97 # engine dependent config
98 # engine dependent config
98 categories = ['general']
99 categories = ['general']
99 paging = True
100 paging = True
100− language_support = True
103making a request
103making a request
@@ -171,6 +171,7 @@ headers set HTTP header information
171data set HTTP data information
171data set HTTP data information
172cookies set HTTP cookies
172cookies set HTTP cookies
173verify bool Performing SSL-Validity check
173verify bool Performing SSL-Validity check
174+follow_redirects bool Follow redirects
174max_redirects int maximum redirects, hard limit
175max_redirects int maximum redirects, hard limit
175soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
176soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
176raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
177raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
docs/dev/makefile.rst+116−112
@@ -1,33 +1,33 @@
1.. _makefile:
1.. _makefile:
3−================
3+========
4−Makefile Targets
4+Makefile
5−================
5+========
7.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
7.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
9.. sidebar:: build environment
9.. sidebar:: build environment
11− Before looking deeper at the targets, first read about :ref:`make pyenv`.
11+ Before looking deeper at the targets, first read about :ref:`make
13 To install system requirements follow :ref:`buildhosts`.
14 To install system requirements follow :ref:`buildhosts`.
15−With the aim to simplify development cycles, started with :pull:`1756` a
16+All relevant build tasks are implemented in :origin:`manage.sh` and for CI or
16−``Makefile`` based boilerplate was added. If you are not familiar with
17+IDE integration a small ``Makefile`` wrapper is available. If you are not
17−Makefiles, we recommend to read gnu-make_ introduction.
18+familiar with Makefiles, we recommend to read gnu-make_ introduction.
19The usage is simple, just type ``make {target-name}`` to *build* a target.
20The usage is simple, just type ``make {target-name}`` to *build* a target.
20Calling the ``help`` target gives a first overview (``make help``):
21Calling the ``help`` target gives a first overview (``make help``):
22.. program-output:: bash -c "cd ..; make --no-print-directory help"
23.. program-output:: bash -c "cd ..; make --no-print-directory help"
25.. contents:: Contents
25.. contents:: Contents
28 :backlinks: entry
28 :backlinks: entry
30−.. _make pyenv:
30+.. _make install:
32Python environment
32Python environment
33==================
33==================
@@ -36,31 +36,42 @@ Python environment
37 ``source ./local/py3/bin/activate``
37 ``source ./local/py3/bin/activate``
39−With Makefile we do no longer need to build up the virtualenv manually (as
39+We do no longer need to build up the virtualenv manually. Jump into your git
40−described in the :ref:`devquickstart` guide). Jump into your git working tree
41−and release a ``make pyenv``:
40+working tree and release a ``make install`` to get a virtualenv with a
42−
41+*developer install* of searx (:origin:`setup.py`). ::
45 $ cd ~/searx-clone
43 $ cd ~/searx-clone
46− $ make pyenv
44+ $ make install
47− PYENV usage: source ./local/py3/bin/activate
45+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
48+ PYENV [install] pip install -e 'searx[test]'
50+ Successfully installed argparse-1.4.0 searx
51+ BUILDENV INFO:searx:load the default settings from ./searx/settings.yml
52+ BUILDENV INFO:searx:Initialisation done
53+ BUILDENV build utils/brand.env
50−With target ``pyenv`` a development environment (aka virtualenv) was build up in
55+If you release ``make install`` multiple times the installation will only
51−``./local/py3/``. To make a *developer install* of searx (:origin:`setup.py`)
56+rebuild if the sha256 sum of the *requirement files* fails. With other words:
52−into this environment, use make target ``install``:
57+the check fails if you edit the requirements listed in
53−
58+:origin:`requirements-dev.txt` and :origin:`requirements.txt`). ::
56 $ make install
60 $ make install
57− PYENV usage: source ./local/py3/bin/activate
61+ PYENV OK
58− PYENV using virtualenv from ./local/py3
62+ PYENV [virtualenv] requirements.sha256 failed
59− PYENV install .
63+ [virtualenv] - 6cea6eb6def9e14a18bf32f8a3e... ./requirements-dev.txt
60−
64+ [virtualenv] - 471efef6c73558e391c3adb35f4... ./requirements.txt
61−You have never to think about intermediate targets like ``pyenv`` or
65+ ...
62−``install``, the ``Makefile`` chains them as requisites. Just run your main
66+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
69+ PYENV [install] pip install -e 'searx[test]'
71+ Successfully installed argparse-1.4.0 searx
72+ BUILDENV INFO:searx:load the default settings from ./searx/settings.yml
73+ BUILDENV INFO:searx:Initialisation done
74+ BUILDENV build utils/brand.env
65.. sidebar:: drop environment
76.. sidebar:: drop environment
@@ -68,10 +79,7 @@ target.
68 <make clean>` first.
79 <make clean>` first.
70If you think, something goes wrong with your ./local environment or you change
81If you think, something goes wrong with your ./local environment or you change
71−the :origin:`setup.py` file (or the requirements listed in
82+the :origin:`setup.py` file, you have to call :ref:`make clean`.
72−:origin:`requirements-dev.txt` and :origin:`requirements.txt`), you have to call
76.. _make run:
84.. _make run:
@@ -81,117 +89,113 @@ the :origin:`setup.py` file (or the requirements listed in
81To get up a running a developer instance simply call ``make run``. This enables
89To get up a running a developer instance simply call ``make run``. This enables
82*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
90*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
83instance, disables *debug* option again and opens the URL in your favorite WEB
91instance, disables *debug* option again and opens the URL in your favorite WEB
84−browser (:man:`xdg-open`):
92+browser (:man:`xdg-open`)::
88− $ make run
94+ $ make run
89− PYENV usage: source ./local/py3/bin/activate
95+ PYENV OK
91− ./local/py3/bin/python ./searx/webapp.py
96+ SEARX_DEBUG=1 ./manage.sh pyenv.cmd python ./searx/webapp.py
93− INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
98+ INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
96.. _make clean:
100.. _make clean:
98``make clean``
102``make clean``
99==============
103==============
101−Drop all intermediate files, all builds, but keep sources untouched. Includes
105+Drop all intermediate files, all builds, but keep sources untouched. Before
102−target ``pyclean`` which drops ./local environment. Before calling ``make
103−clean`` stop all processes using :ref:`make pyenv`.
106+calling ``make clean`` stop all processes using :ref:`make install`. ::
107 $ make clean
108 $ make clean
108− CLEAN pyclean
109+ CLEAN pyenv
109− CLEAN clean
110+ PYENV [virtualenv] drop ./local/py3
111+ CLEAN docs -- ./build/docs ./dist/docs
112+ CLEAN locally installed npm dependencies
111.. _make docs:
116.. _make docs:
113−``make docs docs-live docs-clean``
118+``make docs docs.autobuild docs.clean``
114−==================================
119+=======================================
116−We describe the usage of the ``doc*`` targets in the :ref:`How to contribute /
121+We describe the usage of the ``doc.*`` targets in the :ref:`How to contribute /
117Documentation <contrib docs>` section. If you want to edit the documentation
122Documentation <contrib docs>` section. If you want to edit the documentation
118−read our :ref:`make docs-live` section. If you are working in your own brand,
123+read our :ref:`make docs.live` section. If you are working in your own brand,
119adjust your :ref:`settings global`.
124adjust your :ref:`settings global`.
121−.. _make books:
126+.. _make docs.gh-pages:
123−``make books/{name}.html books/{name}.pdf``
128+``make docs.gh-pages``
124−===========================================
129+======================
126−.. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
131+To deploy on github.io first adjust your :ref:`settings global`. For any
127−.. _XeTeX: https://tug.org/xetex/
132+further read :ref:`deploy on github.io`.
129−.. sidebar:: info
134+.. _make test:
131− To build PDF a XeTeX_ is needed, see :ref:`buildhosts`.
136+``make test``
139+Runs a series of tests: :ref:`make test.pylint`, ``test.pep8``, ``test.unit``
140+and ``test.robot``. You can run tests selective, e.g.::
134−The ``books/{name}.*`` targets are building *books*. A *book* is a
142+ $ make test.pep8 test.unit test.sh
135−sub-directory containing a ``conf.py`` file. One example is the user handbook
143+ TEST test.pep8 OK
136−which can deployed separately (:origin:`docs/user/conf.py`). Such ``conf.py``
144+ ...
137−do inherit from :origin:`docs/conf.py` and overwrite values to fit *book's*
145+ TEST test.unit OK
140−With the help of Intersphinx_ (:ref:`reST smart ref`) the links to searx’s
149+.. _make test.sh:
141−documentation outside of the book will be bound by the object inventory of
142−``DOCS_URL``. Take into account that URLs will be picked from the inventary at
143−documentation's build time.
145−Use ``make docs-help`` to see which books available:
151+``make test.sh``
147−.. program-output:: bash -c "cd ..; make --no-print-directory docs-help"
154+:ref:`sh lint` / if you have changed some bash scripting run this test before
148− :ellipsis: 0,-6
155+commit.
157+.. _make test.pylint:
151−.. _make gh-pages:
159+``make test.pylint``
153−``make gh-pages``
162+.. _Pylint: https://www.pylint.org/
156−To deploy on github.io first adjust your :ref:`settings global`. For any
164+Pylint_ is known as one of the best source-code, bug and quality checker for the
157−further read :ref:`deploy on github.io`.
165+Python programming language. The pylint profile we use at searx project is
166+found in project's root folder :origin:`.pylintrc`.
159−.. _make test:
168+.. _make search.checker:
161−``make test``
170+``search.checker.{engine name}``
162−=============
171+================================
164−Runs a series of tests: ``test.pep8``, ``test.unit``, ``test.robot`` and does
173+To check all engines::
165−additional :ref:`pylint checks <make pylint>`. You can run tests selective,
168−.. code:: sh
175+ make search.checker
170− $ make test.pep8 test.unit test.sh
177+To check a engine with whitespace in the name like *google news* replace space
171− . ./local/py3/bin/activate; ./manage.sh pep8_check
178+by underline::
172− [!] Running pep8 check
173− . ./local/py3/bin/activate; ./manage.sh unit_tests
174− [!] Running unit tests
176−.. _make pylint:
180+ make search.checker.google_news
178−``make pylint``
182+To see HTTP requests and more use SEARX_DEBUG::
181−.. _Pylint: https://www.pylint.org/
184+ make SEARX_DEBUG=1 search.checker.google_news
186+.. _3xx: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection
183−Before commiting its recommend to do some (more) linting. Pylint_ is known as
188+To filter out HTTP redirects (3xx_)::
184−one of the best source-code, bug and quality checker for the Python programming
185−language. Pylint_ is not yet a quality gate within our searx project (like
186−:ref:`test.pep8 <make test>` it is), but Pylint_ can help to improve code
187−quality anyway. The pylint profile we use at searx project is found in
188−project's root folder :origin:`.pylintrc`.
190−Code quality is a ongoing process. Don't try to fix all messages from Pylint,
190+ make SEARX_DEBUG=1 search.checker.google_news | grep -A1 "HTTP/1.1\" 3[0-9][0-9]"
191−run Pylint and check if your changed lines are bringing up new messages. If so,
191+ ...
192−fix it. By this, code quality gets incremental better and if there comes the
192+ Engine google news Checking
193−day, the linting is balanced out, we might decide to add Pylint as a quality
193+ https://news.google.com:443 "GET /search?q=life&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0
194−gate.
194+ https://news.google.com:443 "GET /search?q=life&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None
196+ https://news.google.com:443 "GET /search?q=computer&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0
197+ https://news.google.com:443 "GET /search?q=computer&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None
197``make pybuild``
201``make pybuild``
@@ -200,9 +204,7 @@ gate.
200.. _PyPi: https://pypi.org/
204.. _PyPi: https://pypi.org/
201.. _twine: https://twine.readthedocs.io/en/latest/
205.. _twine: https://twine.readthedocs.io/en/latest/
203−Build Python packages in ``./dist/py``.
207+Build Python packages in ``./dist/py``::
207 $ make pybuild
209 $ make pybuild
@@ -210,9 +212,11 @@ Build Python packages in ``./dist/py``.
210 running sdist
212 running sdist
211 running egg_info
213 running egg_info
213− $ ls ./dist/py/
217+ $ ls ./dist
214− searx-0.15.0-py3-none-any.whl searx-0.15.0.tar.gz
218+ searx-0.18.0-py3-none-any.whl searx-0.18.0.tar.gz
216−To upload packages to PyPi_, there is also a ``upload-pypi`` target. It needs
220+To upload packages to PyPi_, there is also a ``pypi.upload`` target (to test use
217−twine_ to be installed. Since you are not the owner of :pypi:`searx` you will
221+``pypi.upload.test``). Since you are not the owner of :pypi:`searx` you will
218−never need the latter.
222+never need to upload.
@@ -15,8 +15,8 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read
15:ref:`docs build`.
15:ref:`docs build`.
17The source files of Searx's documentation are located at :origin:`docs`. Sphinx
17The source files of Searx's documentation are located at :origin:`docs`. Sphinx
18−assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs-live
18+assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs.live
19−<make docs-live>` to build HTML while editing.
19+<make docs.live>` to build HTML while editing.
21.. sidebar:: Further reading
21.. sidebar:: Further reading
@@ -1276,13 +1276,12 @@ Templating
1277.. sidebar:: Build environment
1277.. sidebar:: Build environment
1279− All *generic-doc* tasks are running in the :ref:`build environment <make
1279+ All *generic-doc* tasks are running in the :ref:`make install`.
1282Templating is suitable for documentation which is created generic at the build
1281Templating is suitable for documentation which is created generic at the build
1283−time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
1282+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
1284−environment <make pyenv>` (with searx modules installed). We use this e.g. to
1283+install` (with searx modules installed). We use this e.g. to build chapter:
1285−build chapter: :ref:`engines generic`. Below the jinja directive from the
1284+:ref:`engines generic`. Below the jinja directive from the
1286:origin:`docs/admin/engines.rst` is shown:
1285:origin:`docs/admin/engines.rst` is shown:
1288.. literalinclude:: ../admin/engines.rst
1287.. literalinclude:: ../admin/engines.rst
@@ -30,6 +30,7 @@ anyone, you can set up your own, see :ref:`installation`.
30 user/index
30 user/index
31 admin/index
31 admin/index
33 utils/index
34 utils/index
34 blog/index
35 blog/index
docs/searx_extra/index.rstnew file+14
@@ -0,0 +1,14 @@
3+======================================================
4+Tooling box ``searx_extra`` for developers and users
5+======================================================
7+In the folder :origin:`searx_extra/` we maintain some tools useful for
docs/searx_extra/standalone_searx.py.rstnew file+9
@@ -0,0 +1,9 @@
2+.. _standalone_searx.py:
4+===================================
5+``searx_extra/standalone_searx.py``
6+===================================
8+.. automodule:: searx_extra.standalone_searx
docs/user/conf.pydeleted−21
@@ -1,21 +0,0 @@
1−# -*- coding: utf-8; mode: python -*-
2−"""Configuration for the Searx user handbook
4−project = 'Searx User-HB'
5−version = release = VERSION_STRING
7−intersphinx_mapping['searx'] = (DOCS_URL, None)
9−# Grouping the document tree into LaTeX files. List of tuples
10−# (source start file, target name, title,
11−# author, documentclass [howto, manual, or own class]).
13− ('index' # startdocname
14− , 'searx-user-hb.tex' # targetname
15− , '' # take title from .rst
17− , 'howto' # documentclass
18− , False # toctree_only
docs/user/search_syntax.rst+24
@@ -40,3 +40,27 @@ Image search:
40Custom language in wikipedia:
40Custom language in wikipedia:
42- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
42- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
47+Searx does not support true multilingual search.
48+You have to use the language prefix in your search query when searching in a different language.
50+But there is a workaround:
51+By adding a new search engine with a different language, Searx will search in your default and other language.
53+Example configuration in settings.yml for a German and English speaker:
61+ - name : google english
66+When searching, the default google engine will return German results and "google english" will return English results.
@@ -1,12 +1,11 @@
1.. _searx_utils:
1.. _searx_utils:
2.. _toolboxing:
2.. _toolboxing:
4−=======================
4+===================
5−Tooling box ``utils/*``
5+Admin's tooling box
6−=======================
6+===================
8−In the folder :origin:`utils/` we maintain some tools useful for admins and
8+In the folder :origin:`utils/` we maintain some tools useful for administrators.
11.. toctree::
10.. toctree::
12 :maxdepth: 2
11 :maxdepth: 2
@@ -16,7 +15,6 @@ developers.
16 filtron.sh
15 filtron.sh
21.. _toolboxing common:
19.. _toolboxing common:
docs/utils/lxc.sh.rst+3−3
@@ -119,15 +119,15 @@ of coffee).::
120To build (live) documentation inside a archlinux_ container::
120To build (live) documentation inside a archlinux_ container::
122− sudo -H ./utils/lxc.sh cmd searx-archlinux make docs-clean docs-live
122+ sudo -H ./utils/lxc.sh cmd searx-archlinux make docs.clean docs.live
124 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
124 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
126To get IP of the container and the port number *live docs* is listening::
126To get IP of the container and the port number *live docs* is listening::
128− $ sudo ./utils/lxc.sh show suite | grep docs-live
128+ $ sudo ./utils/lxc.sh show suite | grep docs.live
130− [searx-archlinux] INFO: (eth0) docs-live: http://n.n.n.12:8080/
130+ [searx-archlinux] INFO: (eth0) docs.live: http://n.n.n.12:8080/
133.. _lxc.sh help:
133.. _lxc.sh help:
docs/utils/standalone_searx.py.rstdeleted−11
@@ -1,11 +0,0 @@
2−.. _standalone_searx.py:
4−=============================
5−``utils/standalone_searx.py``
6−=============================
8−.. automodule:: standalone_searx
@@ -0,0 +1,504 @@
2+# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
3+# SPDX-License-Identifier: AGPL-3.0-or-later
4+# shellcheck disable=SC2031
6+# shellcheck source=utils/lib.sh
7+source "$(dirname "${BASH_SOURCE[0]}")/utils/lib.sh"
8+# shellcheck source=utils/brand.env
9+source "${REPO_ROOT}/utils/brand.env"
14+PY_SETUP_EXTRAS='[test]'
15+NPM_PACKAGES="less@2.7 less-plugin-clean-css grunt-cli"
16+GECKODRIVER_VERSION="v0.30.0"
19+# These py files are linted by test.pylint(), all other files are linted by
24+ searx/engines/gigablast.py
25+ searx/engines/deviantart.py
26+ searx/engines/digg.py
27+ searx/engines/google.py
28+ searx/engines/google_news.py
29+ searx/engines/google_videos.py
30+ searx/engines/google_images.py
31+ searx/engines/mediathekviewweb.py
32+ searx/engines/meilisearch.py
33+ searx/engines/solidtorrents.py
34+ searx/engines/solr.py
35+ searx/engines/sqlite.py
36+ searx/engines/springer.py
37+ searx/engines/google_scholar.py
38+ searx/engines/yahoo_news.py
39+ searx/engines/apkmirror.py
40+ searx/engines/core.py
41+ searx_extra/update/update_external_bangs.py
44+PYLINT_SEARX_DISABLE_OPTION="\
46+W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,\
48+PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES="supported_languages,language_aliases"
49+PYLINT_OPTIONS="-m pylint -j 0 --rcfile .pylintrc"
54+ rebuild ./utils/brand.env
56+ pybabel compile ./searx/translations
58+ all : update searx/languages.py and ./data/*
59+ languages : update searx/data/engines_languages.json & searx/languages.py
60+ useragents: update searx/data/useragents.json with the most recent versions of Firefox.
62+ html : build HTML documentation
63+ live : autobuild HTML documentation while editing
64+ gh-pages : deploy on gh-pages branch
65+ prebuild : build reST include files (./${DOCS_BUILD}/includes)
66+ clean : clean documentation build
68+ build : build docker image
69+ push : build and push docker image
71+ download & install geckodriver if not already installed (required for
74+ env : download & install npm dependencies locally
75+ clean : drop npm installations
77+ build : Build python packages at ./${PYDIST}
78+ clean : delete virtualenv and intermediate py files
80+ install : developer install of searx into virtualenv
81+ uninstall : uninstall developer installation
82+ cmd ... : run command ... in virtualenv
83+ OK : test if virtualenv is OK
85+ Upload python packages to PyPi (to test use pypi.upload.test)
87+ pylint : lint PYLINT_FILES, searx/engines, searx & tests
88+ pep8 : pycodestyle (pep8) for all files except PYLINT_FILES
89+ unit : run unit tests
90+ coverage : run unit tests with coverage
91+ robot : run robot test
92+ clean : clean intermediate test stuff
94+ all : build all themes
95+ oscar : build oscar theme
96+ simple : build simple theme
101+if [ "$VERBOSE" = "1" ]; then
106+# needed by sphinx-docs
110+ SEARX_DEBUG=1 pyenv.cmd python utils/build_env.py 2>&1 \
111+ | prefix_stdout "${_Blue}BUILDENV${_creset} "
112+ return "${PIPESTATUS[0]}"
116+ build_msg BABEL compile
117+ pyenv.cmd pybabel compile -d "${REPO_ROOT}/searx/translations"
125+ build_msg DATA "update searx/data/ahmia_blacklist.txt"
126+ pyenv.cmd python searx_extra/update/update_ahmia_blacklist.py
127+ build_msg DATA "update searx/data/wikidata_units.json"
128+ pyenv.cmd python searx_extra/update/update_wikidata_units.py
129+ build_msg DATA "update searx/data/currencies.json"
130+ pyenv.cmd python searx_extra/update/update_currencies.py
136+ build_msg ENGINES "fetch languages .."
137+ pyenv.cmd python searx_extra/update/update_languages.py
138+ build_msg ENGINES "update update searx/languages.py"
139+ build_msg DATA "update searx/data/engines_languages.json"
145+ build_msg DATA "update searx/data/useragents.json"
146+ pyenv.cmd python searx_extra/update/update_firefox_version.py
151+ build_msg DOCS "build ${DOCS_BUILD}/includes"
154+ [ "$VERBOSE" = "1" ] && set -x
155+ mkdir -p "${DOCS_BUILD}/includes"
156+ ./utils/searx.sh doc | cat > "${DOCS_BUILD}/includes/searx.rst"
157+ ./utils/filtron.sh doc | cat > "${DOCS_BUILD}/includes/filtron.rst"
158+ ./utils/morty.sh doc | cat > "${DOCS_BUILD}/includes/morty.rst"
167+# shellcheck disable=SC2119
171+ build_msg DOCKER build
172+ # run installation in a subprocess and activate pyenv
174+ # See https://www.shellcheck.net/wiki/SC1001 and others ..
175+ # shellcheck disable=SC2031,SC2230,SC2002,SC2236,SC2143,SC1001
177+ # shellcheck source=/dev/null
178+ source "${PY_ENV_BIN}/activate"
180+ # Check if it is a git repository
181+ if [ ! -d .git ]; then
182+ die 1 "This is not Git repository"
184+ if [ ! -x "$(which git)" ]; then
185+ die 1 "git is not installed"
188+ if ! git remote get-url origin 2> /dev/null; then
189+ die 1 "there is no remote origin"
192+ # This is a git repository
194+ # "git describe" to get the Docker version (for example : v0.15.0-89-g0585788e)
195+ # awk to remove the "v" and the "g"
196+ SEARX_GIT_VERSION=$(git describe --match "v[0-9]*\.[0-9]*\.[0-9]*" HEAD 2>/dev/null | awk -F'-' '{OFS="-"; $1=substr($1, 2); if ($3) { $3=substr($3, 2); } print}')
198+ # add the suffix "-dirty" if the repository has uncommited change
199+ # /!\ HACK for searx/searx: ignore utils/brand.env
200+ git update-index -q --refresh
201+ if [ ! -z "$(git diff-index --name-only HEAD -- | grep -v 'utils/brand.env')" ]; then
202+ SEARX_GIT_VERSION="${SEARX_GIT_VERSION}-dirty"
205+ # Get the last git commit id, will be added to the Searx version (see Dockerfile)
206+ VERSION_GITCOMMIT=$(echo "$SEARX_GIT_VERSION" | cut -d- -f2-4)
207+ build_msg DOCKER "Last commit : $VERSION_GITCOMMIT"
209+ # Check consistency between the git tag and the searx/version.py file
210+ # /! HACK : parse Python file with bash /!
211+ # otherwise it is not possible build the docker image without all Python
212+ # dependencies ( version.py loads __init__.py )
213+ # SEARX_PYTHON_VERSION=$(python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)")
214+ SEARX_PYTHON_VERSION=$(cat searx/version.py | grep "\(VERSION_MAJOR\|VERSION_MINOR\|VERSION_BUILD\) =" | cut -d\= -f2 | sed -e 's/^[[:space:]]*//' | paste -sd "." -)
215+ if [ "$(echo "$SEARX_GIT_VERSION" | cut -d- -f1)" != "$SEARX_PYTHON_VERSION" ]; then
216+ err_msg "git tag: $SEARX_GIT_VERSION"
217+ err_msg "searx/version.py: $SEARX_PYTHON_VERSION"
218+ die 1 "Inconsistency between the last git tag and the searx/version.py file"
221+ # define the docker image name
222+ GITHUB_USER=$(echo "${GIT_URL}" | sed 's/.*github\.com\/\([^\/]*\).*/\1/')
223+ SEARX_IMAGE_NAME="${SEARX_IMAGE_NAME:-${GITHUB_USER:-searx}/searx}"
225+ # build Docker image
226+ build_msg DOCKER "Building image ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
228+ --build-arg GIT_URL="${GIT_URL}" \
229+ --build-arg SEARX_GIT_VERSION="${SEARX_GIT_VERSION}" \
230+ --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \
231+ --build-arg LABEL_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
232+ --build-arg LABEL_VCS_REF="$(git rev-parse HEAD)" \
233+ --build-arg LABEL_VCS_URL="${GIT_URL}" \
234+ --build-arg TIMESTAMP_SETTINGS="$(git log -1 --format="%cd" --date=unix -- searx/settings.yml)" \
235+ --build-arg TIMESTAMP_UWSGI="$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini)" \
236+ -t "${SEARX_IMAGE_NAME}:latest" -t "${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}" .
238+ if [ "$1" = "push" ]; then
239+ docker push "${SEARX_IMAGE_NAME}:latest"
240+ docker push "${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
246+# shellcheck disable=SC2119
250+ build_msg INSTALL "gecko.driver"
251+ # run installation in a subprocess and activate pyenv
253+ # shellcheck source=/dev/null
254+ source "${PY_ENV_BIN}/activate"
256+ # TODO : check the current geckodriver version
257+ geckodriver -V > /dev/null 2>&1 || NOTFOUND=1
259+ if [ -z "$NOTFOUND" ]; then
260+ build_msg INSTALL "geckodriver already installed"
263+ PLATFORM="$(python3 -c 'import platform; print(platform.system().lower(), platform.architecture()[0])')"
265+ "linux 32bit" | "linux2 32bit") ARCH="linux32";;
266+ "linux 64bit" | "linux2 64bit") ARCH="linux64";;
267+ "windows 32 bit") ARCH="win32";;
268+ "windows 64 bit") ARCH="win64";;
269+ "mac 64bit") ARCH="macos";;
271+ GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-$ARCH.tar.gz";
273+ build_msg GECKO "Installing ${PY_ENV_BIN}/geckodriver from $GECKODRIVER_URL"
276+ wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "${PY_ENV_BIN}" -f "$FILE" geckodriver
278+ chmod 755 -- "${PY_ENV_BIN}/geckodriver"
285+ pushd "${REPO_ROOT}" &> /dev/null
286+ # shellcheck disable=SC2230
287+ which npm &> /dev/null || die 1 'node.env - npm is not found!'
290+ # shellcheck disable=SC2030
291+ PATH="$(npm bin):$PATH"
294+ build_msg INSTALL "npm install $NPM_PACKAGES"
295+ # shellcheck disable=SC2086
296+ npm install $NPM_PACKAGES
298+ cd "${REPO_ROOT}/searx/static/themes/oscar"
299+ build_msg INSTALL "($(pwd)) npm install"
302+ build_msg INSTALL "($(pwd)) npm install"
303+ cd "${REPO_ROOT}/searx/static/themes/simple"
313+ build_msg CLEAN "locally installed npm dependencies"
316+ ./package-lock.json \
317+ ./searx/static/themes/oscar/package-lock.json \
318+ ./searx/static/themes/oscar/node_modules \
319+ ./searx/static/themes/simple/package-lock.json \
320+ ./searx/static/themes/simple/node_modules
325+ build_msg BUILD "[pylint] python package ${PYDIST}"
326+ pyenv.cmd python setup.py \
327+ sdist -d "${PYDIST}" \
328+ bdist_wheel --bdist-dir "${PYBUILD}" -d "${PYDIST}"
332+ build_msg CLEAN pyenv
335+ [ "$VERBOSE" = "1" ] && set -x
336+ rm -rf "${PYDIST}" "${PYBUILD}" "${PY_ENV}" ./.tox ./*.egg-info
337+ find . -name '*.pyc' -exec rm -f {} +
338+ find . -name '*.pyo' -exec rm -f {} +
339+ find . -name __pycache__ -exec rm -rf {} +
346+print('import yaml --> OK')
353+ py.clean > /dev/null
355+ if pyenv.install.OK > /dev/null; then
360+ build_msg PYENV "[install] pip install -e 'searx${PY_SETUP_EXTRAS}'"
361+ "${PY_ENV_BIN}/python" -m pip install -e ".${PY_SETUP_EXTRAS}"
363+ ) || die 42 "error while build & install pyenv (${PY_ENV_BIN})"
367+ build_msg PYENV "[pyenv.uninstall] uninstall packages: ${PYOBJECTS}"
368+ pyenv.cmd python setup.py develop --uninstall 2>&1 \
369+ | prefix_stdout "${_Blue}PYENV ${_creset}[pyenv.uninstall] "
376+ # https://github.com/pypa/twine
377+ pyenv.cmd twine upload "${PYDIST}"/*
383+ pyenv.cmd twine upload -r testpypi "${PYDIST}"/*
387+ # shellcheck disable=SC2086
389+ build_msg TEST "[pylint] \$PYLINT_FILES"
390+ pyenv.cmd python ${PYLINT_OPTIONS} ${PYLINT_VERBOSE} \
391+ "${PYLINT_FILES[@]}"
393+ build_msg TEST "[pylint] searx/engines"
394+ pyenv.cmd python ${PYLINT_OPTIONS} ${PYLINT_VERBOSE} \
395+ --disable="${PYLINT_SEARX_DISABLE_OPTION}" \
396+ --additional-builtins="${PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES}" \
399+ build_msg TEST "[pylint] searx tests"
400+ pyenv.cmd python ${PYLINT_OPTIONS} ${PYLINT_VERBOSE} \
401+ --disable="${PYLINT_SEARX_DISABLE_OPTION}" \
402+ --ignore=searx/engines \
409+ build_msg TEST 'pycodestyle (formerly pep8)'
411+ printf -v _exclude '%s, ' "${PYLINT_FILES[@]}"
412+ pyenv.cmd pycodestyle \
413+ --exclude="searx/static, searx/languages.py, $_exclude " \
414+ --max-line-length=120 \
415+ --ignore "E117,E252,E402,E722,E741,W503,W504,W605" \
421+ build_msg TEST 'tests/unit'
422+ pyenv.cmd python -m nose2 -s tests/unit
427+ build_msg TEST 'unit test coverage'
429+ pyenv.cmd python -m nose2 -C --log-capture --with-coverage --coverage searx -s tests/unit
430+ pyenv.cmd coverage report
431+ pyenv.cmd coverage html
437+ build_msg TEST 'robot'
439+ PYTHONPATH=. pyenv.cmd python searx/testing.py robot
444+ build_msg CLEAN "test stuff"
445+ rm -rf geckodriver.log .coverage coverage/
459+ local gruntfile=searx/static/themes/oscar/gruntfile.js
460+ build_msg GRUNT "${gruntfile}"
461+ PATH="$(npm bin):$PATH" grunt --gruntfile "${gruntfile}"
466+ local gruntfile=searx/static/themes/simple/gruntfile.js
467+ build_msg GRUNT "${gruntfile}"
468+ PATH="$(npm bin):$PATH" grunt --gruntfile "${gruntfile}"
472+# shellcheck disable=SC2119
476+ local cmd="$1"; shift
478+ if [ "$cmd" == "" ]; then
480+ err_msg "missing command"
485+ --getenv) var="$1"; echo "${!var}";;
489+ err_msg "unknown option $cmd"
493+ _type="$(type -t "$cmd")"
494+ if [ "$_type" != 'function' ]; then
495+ err_msg "unknown command $1 / use --help"
@@ -1,205 +0,0 @@
5−BASE_DIR="$(dirname -- "`readlink -f -- "$0"`")"
11−PYTHONPATH="$BASE_DIR"
12−SEARX_DIR="$BASE_DIR/searx"
15−. "${BASE_DIR}/utils/brand.env"
22− pip install --upgrade pip
23− pip install --upgrade setuptools
24− pip install -Ur "$BASE_DIR/requirements.txt"
27−update_dev_packages() {
29− pip install -Ur "$BASE_DIR/requirements-dev.txt"
32−install_geckodriver() {
33− echo '[!] Checking geckodriver'
34− # TODO : check the current geckodriver version
36− geckodriver -V > /dev/null 2>&1 || NOTFOUND=1
38− if [ -z "$NOTFOUND" ]; then
41− GECKODRIVER_VERSION="v0.28.0"
42− PLATFORM="`python3 -c "import platform; print(platform.system().lower(), platform.architecture()[0])"`"
44− "linux 32bit" | "linux2 32bit") ARCH="linux32";;
45− "linux 64bit" | "linux2 64bit") ARCH="linux64";;
46− "windows 32 bit") ARCH="win32";;
47− "windows 64 bit") ARCH="win64";;
48− "mac 64bit") ARCH="macos";;
50− GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-$ARCH.tar.gz";
53− if [ -z "$VIRTUAL_ENV" ]; then
54− printf "geckodriver can't be installed because VIRTUAL_ENV is not set, you should download it from\n %s" "$GECKODRIVER_URL"
57− GECKODRIVER_DIR="$VIRTUAL_ENV/bin"
61− mkdir -p -- "$GECKODRIVER_DIR"
64− printf "Installing %s/geckodriver from\n %s" "$GECKODRIVER_DIR" "$GECKODRIVER_URL"
67− wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "$GECKODRIVER_DIR" -f "$FILE" geckodriver
69− chmod 777 -- "$GECKODRIVER_DIR/geckodriver"
73− pybabel compile -d "$SEARX_DIR/translations"
82− which npm || (printf 'Error: npm is not found\n'; exit 1)
83− export PATH="$(npm bin)":$PATH
89− echo '[!] install NPM packages'
91− npm install less@2.7 less-plugin-clean-css grunt-cli
93− echo '[!] install NPM packages for oscar theme'
94− cd -- "$BASE_DIR/searx/static/themes/oscar"
97− echo '[!] install NPM packages for simple theme'
98− cd -- "$BASE_DIR/searx/static/themes/simple"
103− # Check if it is a git repository
104− if [ ! -d .git ]; then
105− echo "This is not Git repository"
109− if [ ! -x "$(which git)" ]; then
110− echo "git is not installed"
114− if [ ! git remote get-url origin 2> /dev/null ]; then
115− echo "there is no remote origin"
119− # This is a git repository
121− # "git describe" to get the Docker version (for example : v0.15.0-89-g0585788e)
122− # awk to remove the "v" and the "g"
123− SEARX_GIT_VERSION=$(git describe --match "v[0-9]*\.[0-9]*\.[0-9]*" HEAD 2>/dev/null | awk -F'-' '{OFS="-"; $1=substr($1, 2); if ($3) { $3=substr($3, 2); } print}')
125− # add the suffix "-dirty" if the repository has uncommited change
126− # /!\ HACK for searx/searx: ignore utils/brand.env
127− git update-index -q --refresh
128− if [ ! -z "$(git diff-index --name-only HEAD -- | grep -v 'utils/brand.env')" ]; then
129− SEARX_GIT_VERSION="${SEARX_GIT_VERSION}-dirty"
132− # Get the last git commit id, will be added to the Searx version (see Dockerfile)
133− VERSION_GITCOMMIT=$(echo $SEARX_GIT_VERSION | cut -d- -f2-4)
134− echo "Last commit : $VERSION_GITCOMMIT"
136− # Check consistency between the git tag and the searx/version.py file
137− # /!\ HACK : parse Python file with bash /!\
138− # otherwise it is not possible build the docker image without all Python dependencies ( version.py loads __init__.py )
139− # SEARX_PYTHON_VERSION=$(python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)")
140− SEARX_PYTHON_VERSION=$(cat searx/version.py | grep "\(VERSION_MAJOR\|VERSION_MINOR\|VERSION_BUILD\) =" | cut -d\= -f2 | sed -e 's/^[[:space:]]*//' | paste -sd "." -)
141− if [ $(echo "$SEARX_GIT_VERSION" | cut -d- -f1) != "$SEARX_PYTHON_VERSION" ]; then
142− echo "Inconsistency between the last git tag and the searx/version.py file"
143− echo "git tag: $SEARX_GIT_VERSION"
144− echo "searx/version.py: $SEARX_PYTHON_VERSION"
148− # define the docker image name
149− GITHUB_USER=$(echo "${GIT_URL}" | sed 's/.*github\.com\/\([^\/]*\).*/\1/')
150− SEARX_IMAGE_NAME="${GITHUB_USER:-searx}/searx"
152− # build Docker image
153− echo "Building image ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
155− --build-arg GIT_URL="${GIT_URL}" \
156− --build-arg SEARX_GIT_VERSION="${SEARX_GIT_VERSION}" \
157− --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \
158− --build-arg LABEL_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
159− --build-arg LABEL_VCS_REF=$(git rev-parse HEAD) \
160− --build-arg LABEL_VCS_URL="${GIT_URL}" \
161− --build-arg TIMESTAMP_SETTINGS=$(git log -1 --format="%cd" --date=unix -- searx/settings.yml) \
162− --build-arg TIMESTAMP_UWSGI=$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini) \
163− -t ${SEARX_IMAGE_NAME}:latest -t ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION} .
165− if [ "$1" = "push" ]; then
166− sudo docker push ${SEARX_IMAGE_NAME}:latest
167− sudo docker push ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}
176− [ -z "$1" ] || printf 'Error: %s\n' "$1"
177− echo "Searx manage.sh help
185− update_packages - Check & update production dependency changes
186− update_dev_packages - Check & update development and production dependency changes
187− install_geckodriver - Download & install geckodriver if not already installed (required for robot_tests)
188− npm_packages - Download & install npm dependencies
192− locales - Compile locales
196− ISSUE_URL: ${ISSUE_URL}
197− SEARX_URL: ${SEARX_URL}
198− DOCS_URL: ${DOCS_URL}
199− PUBLIC_INSTANCES: ${PUBLIC_INSTANCES}
203−[ "$(command -V "$ACTION" | grep ' function$')" = "" ] \
204− && help "action not found" \
requirements-dev.txt+18−16
@@ -1,18 +1,20 @@
2−nose2[coverage_plugin]==0.9.2
2+nose2[coverage_plugin]==0.10.0
3cov-core==1.15.0
3cov-core==1.15.0
4−pycodestyle==2.6.0
4+pycodestyle==2.8.0
5−pylint==2.6.0
5+pylint==2.12.2
6−splinter==0.14.0
6+splinter==0.17.0
7−transifex-client==0.14.2
7+transifex-client==0.14.3; python_version < '3.10'
8−unittest2==1.1.0
8+transifex-client==0.12.1; python_version == '3.10'
9−selenium==3.141.0
9+selenium==4.1.0
10−twine==3.3.0
10+twine==3.7.1
11−Pallets-Sphinx-Themes==1.2.3
11+Pallets-Sphinx-Themes==2.0.2
12−Sphinx==3.4.1
13+Sphinx==4.4.0
13−sphinx-issues==1.2.0
14+sphinx-issues==3.0.1
14−sphinx-jinja==1.1.1
15+sphinx-jinja==1.4.0
15−sphinx-tabs==1.3.0
16+sphinx-tabs==3.2.0
16−sphinxcontrib-programoutput==0.16
17+sphinxcontrib-programoutput==0.17
17−sphinx-autobuild==2020.9.1
18+sphinx-autobuild==2021.3.14
18−linuxdoc==20210110
19+linuxdoc==20211220
@@ -1,12 +1,16 @@
1−certifi==2020.12.05
1+certifi==2021.10.8
2−babel==2.9.0
2+babel==2.9.1
3flask-babel==2.0.0
3flask-babel==2.0.0
4−flask==1.1.2
4+flask==2.0.2
6−jinja2==2.11.2
5+jinja2==3.0.3
7−lxml==4.6.2
6+lxml==4.7.1
8−pygments==2.1.3
7+pygments==2.8.0
9−python-dateutil==2.8.1
8+python-dateutil==2.8.2
10−pyyaml==5.3.1
9+pyyaml==6.0
11−requests[socks]==2.25.1
10+httpx[http2]==0.21.3
12+uvloop==0.16.0; python_version >= '3.7'
13+uvloop==0.14.0; python_version < '3.7'
14+httpx-socks[asyncio]==0.7.2
12−langdetect==1.0.8
15+langdetect==1.0.9
searx/answerers/__init__.py+1−1
@@ -32,7 +32,7 @@ def ask(query):
32 results = []
32 results = []
33 query_parts = list(filter(None, query.query.split()))
33 query_parts = list(filter(None, query.query.split()))
35− if query_parts[0] not in answerers_by_keywords:
35+ if not query_parts or query_parts[0] not in answerers_by_keywords:
36 return results
36 return results
38 for answerer in answerers_by_keywords[query_parts[0]]:
38 for answerer in answerers_by_keywords[query_parts[0]]:
searx/autocomplete.py+36−84
@@ -20,95 +20,36 @@ from lxml import etree
20from json import loads
20from json import loads
21from urllib.parse import urlencode
21from urllib.parse import urlencode
23+from httpx import HTTPError
23from searx import settings
26from searx import settings
24−from searx.languages import language_codes
27+from searx.data import ENGINES_LANGUAGES
25−from searx.engines import (
26− categories, engines, engine_shortcuts
28−from searx.poolrequests import get as http_get
28+from searx.network import get as http_get
29+from searx.exceptions import SearxEngineResponseException
31def get(*args, **kwargs):
32def get(*args, **kwargs):
32 if 'timeout' not in kwargs:
33 if 'timeout' not in kwargs:
33 kwargs['timeout'] = settings['outgoing']['request_timeout']
34 kwargs['timeout'] = settings['outgoing']['request_timeout']
34−
35+ kwargs['raise_for_httperror'] = True
35 return http_get(*args, **kwargs)
36 return http_get(*args, **kwargs)
38−def searx_bang(full_query):
39+def brave(query, lang):
39− '''check if the searchQuery contain a bang, and create fitting autocompleter results'''
40+ # brave search autocompleter
40− # check if there is a query which can be parsed
41+ url = 'https://search.brave.com/api/suggest?{query}'
41− if len(full_query.getQuery()) == 0:
42+
42− return []
43+ resp = get(url.format(query=urlencode({'q': query})))
44 results = []
45 results = []
46− # check if current query stats with !bang
47+ if resp.ok:
47− first_char = full_query.getQuery()[0]
48+ data = loads(resp.text)
48− if first_char == '!' or first_char == '?':
49+ for suggestion in data[1]:
49− if len(full_query.getQuery()) == 1:
50+ results.append(suggestion)
50− # show some example queries
51+
51− # TODO, check if engine is not avaliable
52+ return results
52− results.append(first_char + "images")
53− results.append(first_char + "wikipedia")
54− results.append(first_char + "osm")
56− engine_query = full_query.getQuery()[1:]
58− # check if query starts with categorie name
59− for categorie in categories:
60− if categorie.startswith(engine_query):
61− results.append(first_char + '{categorie}'.format(categorie=categorie))
63− # check if query starts with engine name
64− for engine in engines:
65− if engine.startswith(engine_query.replace('_', ' ')):
66− results.append(first_char + '{engine}'.format(engine=engine.replace(' ', '_')))
68− # check if query starts with engine shortcut
69− for engine_shortcut in engine_shortcuts:
70− if engine_shortcut.startswith(engine_query):
71− results.append(first_char + '{engine_shortcut}'.format(engine_shortcut=engine_shortcut))
73− # check if current query stats with :bang
74− elif first_char == ':':
75− if len(full_query.getQuery()) == 1:
76− # show some example queries
77− results.append(":en")
78− results.append(":en_us")
79− results.append(":english")
80− results.append(":united_kingdom")
82− engine_query = full_query.getQuery()[1:]
84− for lc in language_codes:
85− lang_id, lang_name, country, english_name = map(str.lower, lc)
87− # check if query starts with language-id
88− if lang_id.startswith(engine_query):
89− if len(engine_query) <= 2:
90− results.append(':{lang_id}'.format(lang_id=lang_id.split('-')[0]))
92− results.append(':{lang_id}'.format(lang_id=lang_id))
94− # check if query starts with language name
95− if lang_name.startswith(engine_query) or english_name.startswith(engine_query):
96− results.append(':{lang_name}'.format(lang_name=lang_name))
98− # check if query starts with country
99− if country.startswith(engine_query.replace('_', ' ')):
100− results.append(':{country}'.format(country=country.replace(' ', '_')))
103− result_set = set(results)
105− # remove results which are already contained in the query
106− for query_part in full_query.query_parts:
107− if query_part in result_set:
108− result_set.remove(query_part)
110− # convert result_set back to list
111− return list(result_set)
114def dbpedia(query, lang):
55def dbpedia(query, lang):
@@ -153,12 +94,11 @@ def google(query, lang):
154def startpage(query, lang):
95def startpage(query, lang):
155 # startpage autocompleter
96 # startpage autocompleter
97+ lui = ENGINES_LANGUAGES['startpage'].get(lang, 'english')
156− url = 'https://startpage.com/do/suggest?{query}'
98+ url = 'https://startpage.com/suggestions?{query}'
158− resp = get(url.format(query=urlencode({'query': query}))).text.split('\n')
99+ resp = get(url.format(query=urlencode({'q': query, 'segment': 'startpage.udog', 'lui': lui})))
159− if len(resp) > 1:
100+ data = resp.json()
160− return resp
101+ return [e['text'] for e in data.get('suggestions', []) if 'text' in e]
164def swisscows(query, lang):
104def swisscows(query, lang):
@@ -196,7 +136,8 @@ def wikipedia(query, lang):
196 return []
136 return []
139+backends = {'brave': brave,
199−backends = {'dbpedia': dbpedia,
140+ 'dbpedia': dbpedia,
200 'duckduckgo': duckduckgo,
141 'duckduckgo': duckduckgo,
201 'google': google,
142 'google': google,
202 'startpage': startpage,
143 'startpage': startpage,
@@ -204,3 +145,14 @@ backends = {'dbpedia': dbpedia,
204 'qwant': qwant,
145 'qwant': qwant,
205 'wikipedia': wikipedia
146 'wikipedia': wikipedia
150+def search_autocomplete(backend_name, query, lang):
151+ backend = backends.get(backend_name)
156+ return backend(query, lang)
157+ except (HTTPError, SearxEngineResponseException):
searx/data/__init__.py+38−16
@@ -1,28 +1,50 @@
1+# SPDX-License-Identifier: AGPL-3.0-or-later
3+"""This module holds the *data* created by::
17+ 'ahmia_blacklist_loader',
1import json
20import json
2from pathlib import Path
21from pathlib import Path
5−__init__ = ['ENGINES_LANGUGAGES', 'CURRENCIES', 'USER_AGENTS', 'EXTERNAL_URLS', 'WIKIDATA_UNITS',
6− 'bangs_loader', 'ahmia_blacklist_loader']
7data_dir = Path(__file__).parent
23data_dir = Path(__file__).parent
10−def load(filename):
26+def _load(filename):
11− with open(data_dir / filename, encoding='utf-8') as fd:
27+ with open(data_dir / filename, encoding='utf-8') as f:
12− return json.load(fd)
28+ return json.load(f)
31+def ahmia_blacklist_loader():
32+ """Load data from `ahmia_blacklist.txt` and return a list of MD5 values of onion
33+ names. The MD5 values are fetched by::
15−def bangs_loader():
35+ searx_extra/update/update_ahmia_blacklist.py
16− return load('bangs.json')
37+ This function is used by :py:mod:`searx.plugins.ahmia_filter`.
19−def ahmia_blacklist_loader():
39+ """
20− with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as fd:
40+ with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as f:
21− return fd.read().split()
41+ return f.read().split()
24−ENGINES_LANGUAGES = load('engines_languages.json')
44+ENGINES_LANGUAGES = _load('engines_languages.json')
25−CURRENCIES = load('currencies.json')
45+CURRENCIES = _load('currencies.json')
26−USER_AGENTS = load('useragents.json')
46+USER_AGENTS = _load('useragents.json')
27−EXTERNAL_URLS = load('external_urls.json')
47+EXTERNAL_URLS = _load('external_urls.json')
28−WIKIDATA_UNITS = load('wikidata_units.json')
48+WIKIDATA_UNITS = _load('wikidata_units.json')
49+EXTERNAL_BANGS = _load('external_bangs.json')
50+OSM_KEYS_TAGS = _load('osm_keys_tags.json')
searx/data/ahmia_blacklist.txt+19553
This diff is too big to show here.
searx/data/bangs.jsondeleted−67913
This diff is too big to show here.
searx/data/currencies.json+14643−7619
This diff is too big to show here.
searx/data/engines_languages.json+653−1483
This diff is too big to show here.
searx/data/external_bangs.jsonnew file+19068
This diff is too big to show here.
searx/data/osm_keys_tags.jsonnew file+15416
This diff is too big to show here.
searx/data/useragents.json+4−3
This diff is too big to show here.
searx/data/wikidata_units.json+275−58
This diff is too big to show here.
searx/engines/__init__.py+19−40
This diff is too big to show here.
searx/engines/acgsou.pydeleted−74
This diff is too big to show here.
searx/engines/ahmia.py+2−2
This diff is too big to show here.
searx/engines/apkmirror.py+22−20
This diff is too big to show here.
searx/engines/archlinux.py−1
This diff is too big to show here.
searx/engines/bandcamp.pynew file+73
This diff is too big to show here.
This diff is too big to show here.
searx/engines/bing_images.py+1−2
This diff is too big to show here.
searx/engines/bing_news.py−1
This diff is too big to show here.
searx/engines/bing_videos.py−1
This diff is too big to show here.
searx/engines/ccengine.pynew file+53
This diff is too big to show here.
searx/engines/command.py+1−1
This diff is too big to show here.
searx/engines/core.pynew file+82
This diff is too big to show here.
searx/engines/dailymotion.py−1
This diff is too big to show here.
searx/engines/dictzone.py+1−1
This diff is too big to show here.
This diff is too big to show here.
searx/engines/duckduckgo.py+101−44
This diff is too big to show here.
searx/engines/duckduckgo_images.py+1−2
This diff is too big to show here.
This diff is too big to show here.
searx/engines/elasticsearch.py+1−2
This diff is too big to show here.
searx/engines/etools.py−1
This diff is too big to show here.
searx/engines/freesound.pynew file+69
This diff is too big to show here.
searx/engines/genius.py−1
This diff is too big to show here.
searx/engines/gentoo.py−1
This diff is too big to show here.
searx/engines/gigablast.py+25−15
This diff is too big to show here.
searx/engines/google.py+121−69
This diff is too big to show here.
searx/engines/google_images.py+74−75
This diff is too big to show here.
searx/engines/google_news.py+35−32
This diff is too big to show here.
searx/engines/google_scholar.pynew file+156
This diff is too big to show here.
searx/engines/google_videos.py+165−63
This diff is too big to show here.
searx/engines/imdb.pynew file+55
This diff is too big to show here.
This diff is too big to show here.
searx/engines/invidious.py+2−3
This diff is too big to show here.
searx/engines/json_engine.py+15−5
This diff is too big to show here.
searx/engines/loc.pynew file+68
This diff is too big to show here.
searx/engines/mediathekviewweb.pynew file+68
This diff is too big to show here.
searx/engines/mediawiki.py−1
This diff is too big to show here.
searx/engines/meilisearch.pynew file+59
This diff is too big to show here.
searx/engines/microsoft_academic.py+25−32
This diff is too big to show here.
searx/engines/mongodb.pynew file+61
This diff is too big to show here.
searx/engines/mysql_server.pynew file+62
This diff is too big to show here.
searx/engines/not_evil.pydeleted−67
This diff is too big to show here.
searx/engines/onesearch.pynew file+57
This diff is too big to show here.
searx/engines/openstreetmap.py+397−67
This diff is too big to show here.
searx/engines/peertube.py+10−9
This diff is too big to show here.
searx/engines/photon.py−1
This diff is too big to show here.
searx/engines/postgresql.pynew file+69
This diff is too big to show here.
searx/engines/prowlarr.pynew file+80
This diff is too big to show here.
searx/engines/pubmed.py+1−1
This diff is too big to show here.
searx/engines/qwant.py+184−79
This diff is too big to show here.
searx/engines/recoll.py+2
This diff is too big to show here.
searx/engines/redis_server.pynew file+69
This diff is too big to show here.
searx/engines/rumble.pynew file+81
This diff is too big to show here.
searx/engines/semantic_scholar.pynew file+42
This diff is too big to show here.
searx/engines/sepiasearch.py−1
This diff is too big to show here.
searx/engines/seznam.pynew file+66
This diff is too big to show here.
searx/engines/sjp.pynew file+92
This diff is too big to show here.
searx/engines/solidtorrents.pynew file+53
This diff is too big to show here.
searx/engines/solr.pynew file+74
This diff is too big to show here.
searx/engines/soundcloud.py+2−2
This diff is too big to show here.
searx/engines/spotify.py+3−2
This diff is too big to show here.
searx/engines/springer.pynew file+74
This diff is too big to show here.
searx/engines/sqlite.pynew file+51
This diff is too big to show here.
searx/engines/stackexchange.pynew file+67
This diff is too big to show here.
searx/engines/stackoverflow.pydeleted−65
This diff is too big to show here.
searx/engines/startpage.py+100−21
This diff is too big to show here.
searx/engines/tineye.pynew file+86
This diff is too big to show here.
searx/engines/wikidata.py+1−1
This diff is too big to show here.
searx/engines/wikipedia.py+19−3
This diff is too big to show here.
searx/engines/wolframalpha_noapi.py+1−1
This diff is too big to show here.
searx/engines/wordnik.pynew file+77
This diff is too big to show here.
searx/engines/xpath.py+3−1
This diff is too big to show here.
searx/engines/xpath_flex.pynew file+121
This diff is too big to show here.
searx/engines/yacy.py+2−3
This diff is too big to show here.
searx/engines/yahoo.py+93−92
This diff is too big to show here.
searx/engines/yahoo_news.py+73−74
This diff is too big to show here.
searx/engines/yandex.pydeleted−73
This diff is too big to show here.
searx/engines/yggtorrent.py+5−5
This diff is too big to show here.
searx/engines/youtube_api.py−1
This diff is too big to show here.
searx/engines/youtube_noapi.py+71−8
This diff is too big to show here.
searx/external_bang.py+76−26
This diff is too big to show here.
searx/external_urls.py+14−2
This diff is too big to show here.
This diff is too big to show here.
searx/metrology/error_recorder.py+9−9
This diff is too big to show here.
searx/network/__init__.pynew file+188
This diff is too big to show here.
searx/network/client.pynew file+219
This diff is too big to show here.
searx/network/network.pynew file+358
This diff is too big to show here.
searx/raise_for_httperror.py → searx/network/raise_for_httperror.pyrenamed
The content is the same.
searx/plugins/__init__.py+2
This diff is too big to show here.
searx/plugins/hostname_replace.pynew file+28
This diff is too big to show here.
searx/plugins/oa_doi_rewrite.py+2−2
This diff is too big to show here.
searx/plugins/self_info.py+1−1
This diff is too big to show here.
searx/plugins/tracker_url_remover.py+1
This diff is too big to show here.
searx/poolrequests.pydeleted−221
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
searx/search/__init__.py+5−2
This diff is too big to show here.
searx/search/checker/background.py+4−2
This diff is too big to show here.
searx/search/checker/impl.py+10−8
This diff is too big to show here.
searx/search/models.py+4−2
This diff is too big to show here.
searx/search/processors/abstract.py+1
This diff is too big to show here.
searx/search/processors/online.py+25−22
This diff is too big to show here.
searx/search/processors/online_currency.py+2
This diff is too big to show here.
searx/settings.yml+586−185
This diff is too big to show here.
searx/settings_loader.py+3−3
This diff is too big to show here.
searx/settings_robot.yml+8−2
This diff is too big to show here.
searx/static/css/bootstrap.min.cssdeleted−1
This diff is too big to show here.
searx/static/fonts/glyphicons-halflings-regular.eotdeleted
Binary file not shown.
searx/static/fonts/glyphicons-halflings-regular.svgdeleted−229
This diff is too big to show here.
searx/static/fonts/glyphicons-halflings-regular.ttfdeleted
Binary file not shown.
searx/static/fonts/glyphicons-halflings-regular.woffdeleted
Binary file not shown.
searx/static/js/bootstrap.min.jsdeleted−6
This diff is too big to show here.
searx/static/js/html5shiv.min.jsdeleted−4
This diff is too big to show here.
searx/static/js/jquery-1.11.1.min.jsdeleted−4
This diff is too big to show here.
searx/static/js/require-2.1.15.min.jsdeleted−36
This diff is too big to show here.
searx/static/js/respond.min.jsdeleted−5
This diff is too big to show here.
searx/static/js/typeahead.bundle.min.jsdeleted−7
This diff is too big to show here.
searx/static/less/bootstrap/.csscomb.jsondeleted−297
This diff is too big to show here.
searx/static/less/bootstrap/.csslintrcdeleted−19
This diff is too big to show here.
searx/static/less/bootstrap/alerts.lessdeleted−68
This diff is too big to show here.
searx/static/less/bootstrap/badges.lessdeleted−55
This diff is too big to show here.
searx/static/less/bootstrap/bootstrap.lessdeleted−53
This diff is too big to show here.
searx/static/less/bootstrap/breadcrumbs.lessdeleted−26
This diff is too big to show here.
searx/static/less/bootstrap/button-groups.lessdeleted−240
This diff is too big to show here.
searx/static/less/bootstrap/buttons.lessdeleted−157
This diff is too big to show here.
searx/static/less/bootstrap/carousel.lessdeleted−243
This diff is too big to show here.
searx/static/less/bootstrap/close.lessdeleted−33
This diff is too big to show here.
searx/static/less/bootstrap/code.lessdeleted−68
This diff is too big to show here.
searx/static/less/bootstrap/component-animations.lessdeleted−31
This diff is too big to show here.
searx/static/less/bootstrap/dropdowns.lessdeleted−215
This diff is too big to show here.
searx/static/less/bootstrap/forms.lessdeleted−540
This diff is too big to show here.
searx/static/less/bootstrap/glyphicons.lessdeleted−233
This diff is too big to show here.
searx/static/less/bootstrap/grid.lessdeleted−84
This diff is too big to show here.
searx/static/less/bootstrap/input-groups.lessdeleted−166
This diff is too big to show here.
searx/static/less/bootstrap/jumbotron.lessdeleted−48
This diff is too big to show here.
searx/static/less/bootstrap/labels.lessdeleted−64
This diff is too big to show here.
searx/static/less/bootstrap/list-group.lessdeleted−131
This diff is too big to show here.
searx/static/less/bootstrap/media.lessdeleted−56
This diff is too big to show here.
searx/static/less/bootstrap/mixins.lessdeleted−39
This diff is too big to show here.
searx/static/less/bootstrap/mixins/alerts.lessdeleted−14
This diff is too big to show here.
searx/static/less/bootstrap/mixins/background-variant.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/border-radius.lessdeleted−18
This diff is too big to show here.
searx/static/less/bootstrap/mixins/buttons.lessdeleted−50
This diff is too big to show here.
searx/static/less/bootstrap/mixins/center-block.lessdeleted−7
This diff is too big to show here.
searx/static/less/bootstrap/mixins/clearfix.lessdeleted−22
This diff is too big to show here.
searx/static/less/bootstrap/mixins/forms.lessdeleted−81
This diff is too big to show here.
searx/static/less/bootstrap/mixins/gradients.lessdeleted−59
This diff is too big to show here.
searx/static/less/bootstrap/mixins/grid-framework.lessdeleted−91
This diff is too big to show here.
searx/static/less/bootstrap/mixins/grid.lessdeleted−122
This diff is too big to show here.
searx/static/less/bootstrap/mixins/hide-text.lessdeleted−21
This diff is too big to show here.
searx/static/less/bootstrap/mixins/image.lessdeleted−34
This diff is too big to show here.
searx/static/less/bootstrap/mixins/labels.lessdeleted−12
This diff is too big to show here.
searx/static/less/bootstrap/mixins/list-group.lessdeleted−29
This diff is too big to show here.
searx/static/less/bootstrap/mixins/nav-divider.lessdeleted−10
This diff is too big to show here.
searx/static/less/bootstrap/mixins/nav-vertical-align.lessdeleted−9
This diff is too big to show here.
searx/static/less/bootstrap/mixins/opacity.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/pagination.lessdeleted−23
This diff is too big to show here.
searx/static/less/bootstrap/mixins/panels.lessdeleted−24
This diff is too big to show here.
searx/static/less/bootstrap/mixins/progress-bar.lessdeleted−10
This diff is too big to show here.
searx/static/less/bootstrap/mixins/reset-filter.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/resize.lessdeleted−6
This diff is too big to show here.
searx/static/less/bootstrap/mixins/responsive-visibility.lessdeleted−15
This diff is too big to show here.
searx/static/less/bootstrap/mixins/size.lessdeleted−10
This diff is too big to show here.
searx/static/less/bootstrap/mixins/tab-focus.lessdeleted−9
This diff is too big to show here.
searx/static/less/bootstrap/mixins/table-row.lessdeleted−28
This diff is too big to show here.
searx/static/less/bootstrap/mixins/text-emphasis.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/text-overflow.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/vendor-prefixes.lessdeleted−224
This diff is too big to show here.
searx/static/less/bootstrap/modals.lessdeleted−150
This diff is too big to show here.
searx/static/less/bootstrap/navbar.lessdeleted−655
This diff is too big to show here.
searx/static/less/bootstrap/navs.lessdeleted−242
This diff is too big to show here.
searx/static/less/bootstrap/normalize.lessdeleted−425
This diff is too big to show here.
searx/static/less/bootstrap/pager.lessdeleted−55
This diff is too big to show here.
searx/static/less/bootstrap/pagination.lessdeleted−88
This diff is too big to show here.
searx/static/less/bootstrap/panels.lessdeleted−243
This diff is too big to show here.
searx/static/less/bootstrap/popovers.lessdeleted−133
This diff is too big to show here.
searx/static/less/bootstrap/print.lessdeleted−101
This diff is too big to show here.
searx/static/less/bootstrap/progress-bars.lessdeleted−105
This diff is too big to show here.
searx/static/less/bootstrap/responsive-embed.lessdeleted−34
This diff is too big to show here.
searx/static/less/bootstrap/responsive-utilities.lessdeleted−194
This diff is too big to show here.
searx/static/less/bootstrap/scaffolding.lessdeleted−150
This diff is too big to show here.
searx/static/less/bootstrap/tables.lessdeleted−233
This diff is too big to show here.
searx/static/less/bootstrap/theme.lessdeleted−258
This diff is too big to show here.
searx/static/less/bootstrap/thumbnails.lessdeleted−36
This diff is too big to show here.
searx/static/less/bootstrap/tooltip.lessdeleted−95
This diff is too big to show here.
searx/static/less/bootstrap/type.lessdeleted−313
This diff is too big to show here.
searx/static/less/bootstrap/typeahead.lessdeleted−153
This diff is too big to show here.
searx/static/less/bootstrap/utilities.lessdeleted−57
This diff is too big to show here.
searx/static/less/bootstrap/variables.lessdeleted−846
This diff is too big to show here.
searx/static/less/bootstrap/wells.lessdeleted−29
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_imageresult.js → searx/static/themes/__common__/js/image_layout.jsrenamed+61−49
This diff is too big to show here.
searx/static/themes/oscar/README.rst+39
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap-theme.cssnew file+587
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap-theme.min.cssnew file+6
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap-theme.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap.cssnew file+6990
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap.min.cssnew file+5
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/images/layers-2x.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/layers.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/marker-icon-2x.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/marker-icon.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/marker-shadow.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/leaflet.cssnew file+640
This diff is too big to show here.
searx/static/themes/oscar/css/leaflet.min.css+1−93
This diff is too big to show here.
searx/static/themes/oscar/css/leaflet.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev-dark.css+270−177
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev-dark.min.css+1−1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev-dark.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev.css+283−180
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev.min.css+1−1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/pointhi.css+185−104
This diff is too big to show here.
searx/static/themes/oscar/css/pointhi.min.css+1−1
This diff is too big to show here.
searx/static/themes/oscar/css/pointhi.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.eotnew file
Binary file not shown.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.svgnew file+288
This diff is too big to show here.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.ttfnew file
Binary file not shown.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woffnew file
Binary file not shown.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woff2new file
Binary file not shown.
searx/static/themes/oscar/gruntfile.js+86−29
This diff is too big to show here.
searx/static/themes/oscar/img/icons/bandcamp.pngnew file
Binary file not shown.
searx/static/themes/oscar/img/map/layers-2x.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/layers.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x-green.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x-orange.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x-red.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-green.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-orange.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-red.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-shadow.pngdeleted
Binary file not shown.
searx/static/themes/oscar/js/bootstrap.bundle.min.jsnew file+7
This diff is too big to show here.
searx/static/themes/oscar/js/bootstrap.min.jsnew file+6
This diff is too big to show here.
searx/static/themes/oscar/js/jquery.min.jsnew file+2
This diff is too big to show here.
searx/static/themes/oscar/js/leaflet-0.7.3.min.jsdeleted−9
This diff is too big to show here.
searx/static/themes/oscar/js/leaflet.jsnew file+6
This diff is too big to show here.
searx/static/themes/oscar/js/searx.js+231−158
This diff is too big to show here.
searx/static/themes/oscar/js/searx.min.js+2−2
This diff is too big to show here.
searx/static/themes/oscar/js/searx.min.js.map+1−1
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/00_requirejs_config.jsdeleted−23
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/leaflet_map.jsdeleted−167
This diff is too big to show here.
searx/static/themes/oscar/js/typeahead.bundle.min.jsnew file+9
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/code.lessdeleted−101
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/preferences.lessdeleted−15
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/code.lessdeleted−79
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/preferences.lessdeleted−3
This diff is too big to show here.
searx/static/themes/oscar/package.json+12−7
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/01_init.js → searx/static/themes/oscar/src/js/01_init.jsrenamed+5−1
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/autocompleter.js → searx/static/themes/oscar/src/js/autocompleter.jsrenamed+24−13
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/element_modifiers.js → searx/static/themes/oscar/src/js/element_modifiers.jsrenamed+6
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/infobox.js → searx/static/themes/oscar/src/js/infobox.jsrenamed
The content is the same.
searx/static/themes/oscar/src/js/leaflet_map.jsnew file+79
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/toggleall.js → searx/static/themes/oscar/src/js/toggleall.jsrenamed
The content is the same.
searx/static/themes/oscar/src/less/bootstrap/bootstrap.lessnew file+3
This diff is too big to show here.
searx/static/themes/oscar/src/less/bootstrap/typeahead.lessnew file+154
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev-dark/oscar.less → searx/static/themes/oscar/src/less/logicodev-dark/oscar.lessrenamed+16−4
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/advanced.less → searx/static/themes/oscar/src/less/logicodev/advanced.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/checkbox.less → searx/static/themes/oscar/src/less/logicodev/checkbox.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/logicodev/code.lessnew file+14
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/cursor.less → searx/static/themes/oscar/src/less/logicodev/cursor.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/footer.less → searx/static/themes/oscar/src/less/logicodev/footer.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/infobox.less → searx/static/themes/oscar/src/less/logicodev/infobox.lessrenamed+5
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/navbar.less → searx/static/themes/oscar/src/less/logicodev/navbar.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/onoff.less → searx/static/themes/oscar/src/less/logicodev/onoff.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/oscar.less → searx/static/themes/oscar/src/less/logicodev/oscar.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/logicodev/preferences.lessnew file+31
This diff is too big to show here.
searx/static/themes/oscar/src/less/logicodev/pygments.lessnew file+99
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/results.less → searx/static/themes/oscar/src/less/logicodev/results.lessrenamed+62−7
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/search.less → searx/static/themes/oscar/src/less/logicodev/search.lessrenamed+5−10
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/variables.less → searx/static/themes/oscar/src/less/logicodev/variables.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/advanced.less → searx/static/themes/oscar/src/less/pointhi/advanced.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/checkbox.less → searx/static/themes/oscar/src/less/pointhi/checkbox.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/pointhi/code.lessnew file+2
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/cursor.less → searx/static/themes/oscar/src/less/pointhi/cursor.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/footer.less → searx/static/themes/oscar/src/less/pointhi/footer.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/infobox.less → searx/static/themes/oscar/src/less/pointhi/infobox.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/navbar.less → searx/static/themes/oscar/src/less/pointhi/navbar.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/onoff.less → searx/static/themes/oscar/src/less/pointhi/onoff.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/oscar.less → searx/static/themes/oscar/src/less/pointhi/oscar.lessrenamed+2
This diff is too big to show here.
searx/static/themes/oscar/src/less/pointhi/preferences.lessnew file+19
This diff is too big to show here.
searx/static/themes/oscar/src/less/pointhi/pygments.lessnew file+99
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/results.less → searx/static/themes/oscar/src/less/pointhi/results.lessrenamed+4
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/search.less → searx/static/themes/oscar/src/less/pointhi/search.lessrenamed
The content is the same.
searx/static/themes/simple/css/searx-rtl.css+164−83
This diff is too big to show here.
searx/static/themes/simple/css/searx-rtl.min.css+1−1
This diff is too big to show here.
searx/static/themes/simple/css/searx.css+164−83
This diff is too big to show here.
searx/static/themes/simple/css/searx.min.css+1−1
This diff is too big to show here.
searx/static/themes/simple/gruntfile.js+2−2
This diff is too big to show here.
searx/static/themes/simple/js/searx.head.js+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx.head.min.js+2−2
This diff is too big to show here.
searx/static/themes/simple/js/searx.head.min.js.map+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx.js+165−240
This diff is too big to show here.
searx/static/themes/simple/js/searx.min.js+5−4
This diff is too big to show here.
searx/static/themes/simple/js/searx.min.js.map+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx_head/00_init.js+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_mapresult.js−87
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_results.js+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_search.js+1−1
This diff is too big to show here.
searx/static/themes/simple/less/code.less+5−80
This diff is too big to show here.
searx/static/themes/simple/less/preferences.less+17
This diff is too big to show here.
searx/static/themes/simple/less/pygments.lessnew file+99
This diff is too big to show here.
searx/static/themes/simple/less/style.less+32
This diff is too big to show here.
searx/templates/__common__/opensearch.xml+2−2
This diff is too big to show here.
searx/templates/__common__/translations.js.tpldeleted−1
This diff is too big to show here.
searx/templates/oscar/base.html+12−14
This diff is too big to show here.
searx/templates/oscar/macros.html+51−51
This diff is too big to show here.
searx/templates/oscar/preferences.html+24−10
This diff is too big to show here.
searx/templates/oscar/result_templates/default.html+7−7
This diff is too big to show here.
searx/templates/oscar/result_templates/files.html+55−55
This diff is too big to show here.
searx/templates/oscar/result_templates/key-value.html+2−2
This diff is too big to show here.
searx/templates/oscar/result_templates/map.html+60−56
This diff is too big to show here.
searx/templates/oscar/result_templates/products.html+2−1
This diff is too big to show here.
searx/templates/oscar/result_templates/torrent.html+15−15
This diff is too big to show here.
searx/templates/oscar/result_templates/videos.html+16−16
This diff is too big to show here.
searx/templates/oscar/results.html+11
This diff is too big to show here.
searx/templates/simple/base.html+1−2
This diff is too big to show here.
searx/templates/simple/preferences.html+13−2
This diff is too big to show here.
searx/templates/simple/result_templates/map.html+35−52
This diff is too big to show here.
searx/templates/simple/results.html+9
This diff is too big to show here.
This diff is too big to show here.
searx/translations/ar/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/bg/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/bo/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/ca/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/cs/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/cs/LC_MESSAGES/messages.po+93−92
This diff is too big to show here.
searx/translations/cy/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/da/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/de/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/de/LC_MESSAGES/messages.po+21−19
This diff is too big to show here.
searx/translations/el_GR/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/en/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/eo/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/es/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/es/LC_MESSAGES/messages.po+20−19
This diff is too big to show here.
searx/translations/et/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/et/LC_MESSAGES/messages.po+18−18
This diff is too big to show here.
searx/translations/eu/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/eu/LC_MESSAGES/messages.po+22−21
This diff is too big to show here.
searx/translations/fa_IR/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fi/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fil/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fr/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fr/LC_MESSAGES/messages.po+21−21
This diff is too big to show here.
searx/translations/gl/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/gl/LC_MESSAGES/messages.po+52−51
This diff is too big to show here.
searx/translations/he/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/he/LC_MESSAGES/messages.po+18−17
This diff is too big to show here.
searx/translations/hr/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/hr/LC_MESSAGES/messages.po+23−22
This diff is too big to show here.
searx/translations/hu/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/ia/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/it/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/it/LC_MESSAGES/messages.po+23−23
This diff is too big to show here.
searx/translations/ja/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/lt/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/lt/LC_MESSAGES/messages.po+24−24
This diff is too big to show here.
searx/translations/nl/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/nl/LC_MESSAGES/messages.po+21−20
This diff is too big to show here.
searx/translations/nl_BE/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/nl_BE/LC_MESSAGES/messages.po+20−19
This diff is too big to show here.
searx/translations/oc/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/pl/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/pt/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/pt_BR/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/pt_BR/LC_MESSAGES/messages.po+20−19
This diff is too big to show here.
searx/translations/ro/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/ru/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/ru/LC_MESSAGES/messages.po+22−21
This diff is too big to show here.
searx/translations/sk/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/sl/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/sr/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/sr/LC_MESSAGES/messages.po+24−23
This diff is too big to show here.
searx/translations/sv/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/sv/LC_MESSAGES/messages.po+22−22
This diff is too big to show here.
searx/translations/ta/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/te/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/tr/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/tr/LC_MESSAGES/messages.po+135−134
This diff is too big to show here.
searx/translations/uk/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/vi/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/zh_CN/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/zh_CN/LC_MESSAGES/messages.po+21−20
This diff is too big to show here.
searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/zh_TW/LC_MESSAGES/messages.mo
This diff is too big to show here.
searx/translations/zh_TW/LC_MESSAGES/messages.po+19−18
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
searx_extra/google_search.py
This diff is too big to show here.
searx_extra/standalone_searx.py+2−2
This diff is too big to show here.
searx_extra/update/__init__.py
This diff is too big to show here.
searx_extra/update/update_ahmia_blacklist.py+1−4
This diff is too big to show here.
searx_extra/update/update_currencies.py+150
This diff is too big to show here.
searx_extra/update/update_engine_descriptions.py+4−8
This diff is too big to show here.
searx_extra/update/update_external_bangs.py+157
This diff is too big to show here.
searx_extra/update/update_firefox_version.py+1−6
This diff is too big to show here.
searx_extra/update/update_languages.py+6−8
This diff is too big to show here.
searx_extra/update/update_osm_keys_tags.py+209
This diff is too big to show here.
searx_extra/update/update_pygments.py+138
This diff is too big to show here.
searx_extra/update/update_translations.sh
This diff is too big to show here.
searx_extra/update/update_wikidata_units.py+54
This diff is too big to show here.
This diff is too big to show here.
tests/unit/network/__init__.py
This diff is too big to show here.
tests/unit/network/test_network.py+239
This diff is too big to show here.
tests/unit/test_engines_init.py+1−1
This diff is too big to show here.
tests/unit/test_external_bangs.py+117
This diff is too big to show here.
tests/unit/test_poolrequests.py−89
This diff is too big to show here.
tests/unit/test_query.py+183
This diff is too big to show here.
tests/unit/test_results.py+4−4
This diff is too big to show here.
tests/unit/test_standalone_searx.py+1−19
This diff is too big to show here.
tests/unit/test_utils.py+2−2
This diff is too big to show here.
tests/unit/test_webapp.py+28−4
This diff is too big to show here.
tests/unit/test_webutils.py+22
This diff is too big to show here.
This diff is too big to show here.
utils/fetch_currencies.py−163
This diff is too big to show here.
utils/fetch_wikidata_units.py−47
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
utils/makefile.include+10−49
This diff is too big to show here.
utils/makefile.python−252
This diff is too big to show here.
utils/makefile.sphinx−201
This diff is too big to show here.
This diff is too big to show here.
utils/site-python/sphinx_build_tools.py−48
This diff is too big to show here.
utils/templates/etc/nginx/default.apps-available/morty.conf+1−1
This diff is too big to show here.
utils/templates/etc/nginx/default.apps-available/searx.conf:filtron+3−3
This diff is too big to show here.