439 files changed+55741−21962
.github/workflows/data-update.yml+4−12
@@ -1,7 +1,8 @@
11name: "Update searx.data"
22on:
33 schedule:
4− - cron: "05 08 * * 5"
4+ - cron: "05 06 1 * *"
5+ workflow_dispatch:
56
67jobs:
78 updateData:
@@ -28,18 +29,10 @@ jobs:
2829 - name: Set up Python
2930 uses: actions/setup-python@v2
3031 with:
31− python-version: '3.9'
32+ python-version: '3.10'
3233 architecture: 'x64'
3334
34− - name: Cache Python dependencies
35− id: cache-python
36− uses: actions/cache@v2
37− with:
38− path: ./local
39− key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
40−
4135 - name: Install Python dependencies
42− if: steps.cache-python.outputs.cache-hit != 'true'
4336 run: |
4437 make V=1 install
4538
@@ -47,8 +40,7 @@ jobs:
4740 env:
4841 FETCH_SCRIPT: ./searx_extra/update/${{ matrix.fetch }}
4942 run: |
50− source local/py3/bin/activate
51− $FETCH_SCRIPT
43+ V=1 ./manage pyenv.cmd python "$FETCH_SCRIPT"
5244
5345 - name: Create Pull Request
5446 id: cpr
.github/workflows/integration.yml+41−7
@@ -1,6 +1,10 @@
11name: Integration
22
3−on: [push, pull_request]
3+on:
4+ push:
5+ branches: ["master"]
6+ pull_request:
7+ branches: ["master"]
48
59jobs:
610 python:
@@ -9,7 +13,7 @@ jobs:
913 strategy:
1014 matrix:
1115 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"]
1317 steps:
1418 - name: Checkout
1519 uses: actions/checkout@v2
@@ -52,10 +56,21 @@ jobs:
5256 uses: actions/checkout@v2
5357 - name: Install Ubuntu packages
5458 run: sudo ./utils/searx.sh install packages
59+ - name: Set up Python
60+ uses: actions/setup-python@v2
61+ with:
62+ python-version: '3.9'
63+ architecture: 'x64'
64+ - name: Cache Python dependencies
65+ id: cache-python
66+ uses: actions/cache@v2
67+ with:
68+ path: ./local
69+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
5570 - name: Install node dependencies
5671 run: make V=1 node.env
5772 - name: Build themes
58− run: make V=1 themes
73+ run: make V=1 themes.all
5974
6075 documentation:
6176 name: Documentation
@@ -64,23 +79,31 @@ jobs:
6479 - name: Checkout
6580 uses: actions/checkout@v2
6681 with:
82+ fetch-depth: '0'
6783 persist-credentials: false
6884 - name: Install Ubuntu packages
6985 run: sudo ./utils/searx.sh install buildhost
7086 - name: Set up Python
7187 uses: actions/setup-python@v2
7288 with:
73− python-version: '3.9'
89+ python-version: '3.10'
7490 architecture: 'x64'
91+ - name: Cache Python dependencies
92+ id: cache-python
93+ uses: actions/cache@v2
94+ with:
95+ path: ./local
96+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
7597 - name: Build documentation
76− run: SEARX_DEBUG=1 make V=1 ci-gh-pages
98+ run: |
99+ make V=1 docs.clean docs.html
77100 - name: Deploy
78101 if: github.ref == 'refs/heads/master'
79102 uses: JamesIves/github-pages-deploy-action@3.7.1
80103 with:
81104 GITHUB_TOKEN: ${{ github.token }}
82105 BRANCH: gh-pages
83− FOLDER: build/gh-pages
106+ FOLDER: dist/docs
84107 CLEAN: true # Automatically remove deleted files from the deploy branch
85108
86109 dockers:
@@ -92,7 +115,7 @@ jobs:
92115 - documentation
93116 env:
94117 DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
95− runs-on: ubuntu-18.04
118+ runs-on: ubuntu-20.04
96119 steps:
97120 - name: Checkout
98121 if: env.DOCKERHUB_USERNAME != null
@@ -100,6 +123,17 @@ jobs:
100123 with:
101124 # make sure "make docker.push" can get the git history
102125 fetch-depth: '0'
126+ - name: Set up Python
127+ uses: actions/setup-python@v2
128+ with:
129+ python-version: '3.9'
130+ architecture: 'x64'
131+ - name: Cache Python dependencies
132+ id: cache-python
133+ uses: actions/cache@v2
134+ with:
135+ path: ./local
136+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
103137 - name: Set up QEMU
104138 if: env.DOCKERHUB_USERNAME != null
105139 uses: docker/setup-qemu-action@v1
.gitignore+2
@@ -26,3 +26,5 @@ dist/
2626local/
2727gh-pages/
2828searx.egg-info/
29+.env
30+geckodriver.log
.pylintrc+1−1
@@ -59,7 +59,7 @@ confidence=
5959# --enable=similarities". If you want to run only the classes checker, but have
6060# no Warning level messages displayed, use"--disable=all --enable=classes
6161# --disable=W"
62−disable=bad-whitespace, duplicate-code
62+disable=bad-whitespace, duplicate-code, consider-using-f-string
6363
6464# Enable the message, report, category or checker with the given id(s). You can
6565# either give multiple identifier separated by comma (,) or put this option
AUTHORS.rst+14−5
@@ -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.
22
33Major contributing authors:
44
@@ -12,8 +12,9 @@ Major contributing authors:
1212- @pofilo
1313- Markus Heiser @return42
1414- Émilien Devos @unixfox
15+- Alexandre Flament
1516
16−People who have submitted patches/translates, reported bugs, consulted features or
17+People who have submitted patches/translations, reported bugs, consulted features or
1718generally made searx better:
1819
1920- Laszlo Hammerl
@@ -66,7 +67,6 @@ generally made searx better:
6667- @firebovine
6768- Lorenzo J. Lucchini @luccoj
6869- @eig8phei
69−- Joachim Cherqui
7070- @maxigas
7171- Jannik Winkel @kiney
7272- @juanitobananas
@@ -155,5 +155,14 @@ generally made searx better:
155155- Xiaoyu WEI @xywei
156156- @joshu9h
157157- Daniel Hones
158−
159−
158+- @cyclaero
159+- @thezeroalpha
160+- @Tobi823
161+- @archiecodes
162+- @BBaoVanC
163+- @datagram1
164+- @lucky13820
165+- @jhigginbotham
166+- @xenrox
167+- @OliveiraHermogenes
168+- Paul Alcock @Guilvareux
CHANGELOG.rst+156−3
@@ -1,3 +1,156 @@
1+1.0.0 2021.03.27
2+================
3+
4+Core
5+~~~~
6+
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 )
18+
19+Documentation
20+~~~~~~~~~~~~~
21+
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 )
26+
27+New settings.yml
28+~~~~~~~~~~~~~~~~
29+
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 )
32+
33+Themes
34+~~~~~~
35+
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 )
43+
44+New engines
45+~~~~~~~~~~~
46+
47+- ccengine ( #2533 )
48+- mediathekviewweb ( #2541 )
49+- solidtorrents ( #2626 )
50+- solr ( #2652 )
51+- rumble ( #2588 )
52+- wiby.me ( #2452 )
53+
54+Fixed engines
55+~~~~~~~~~~~~~
56+
57+- apk_mirror ( #2556 #2642 )
58+- bing ( #2602 )
59+- duckduckgo ( #2560 #2559 )
60+- library genesis ( #2448 )
61+- ina ( 0ba71c3644c4d20f70528c10eed1385399ec1c82 )
62+- invidious ( #2451 )
63+- json_engine ( #2562 )
64+- google ( #2482 )
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 )
72+- naver ( #2542 )
73+- semantic schollar ( f596f5767bed915a5c3bed59ae26283e53f975ca f596f5767bed915a5c3bed59ae26283e53f975ca )
74+- startpage ( #2396 )
75+- seznam ( #2564 28286cf3f2308113bf440fb6e7cf326c6ed07889 )
76+- wikipedia ( #2554 #2565 #2681 #2681 )
77+- yacy ( #2669 )
78+- yahoo news ( #2640 #2655 )
79+
80+Updated engines
81+~~~~~~~~~~~~~~~
82+
83+- duckduckgo ( 5f450fda74e80bf350eb1493f66cfa61deaf5cea )
84+- geektimes ( 45f0e1a859fa12ce2ae0c24dc356922fcad50c8d )
85+- lobste.rs ( 06b754ad67aa6066aed6df77b5ffb74aabebb040 )
86+- soundcloud ( #2671 )
87+- peertube ( #2570 )
88+- recoll ( #2539 )
89+- yggtorrent ( #2573 )
90+
91+Removed engines
92+~~~~~~~~~~~~~~~
93+
94+- acgsou ( #2654 )
95+- google_play_music ( #2558 )
96+- metager ( #2538 )
97+- voat ( #2445 )
98+- yandex ( #2566 )
99+
100+Bug fixes
101+~~~~~~~~~
102+
103+- Fix empty colon in query from selecting Chinese ( #2454 )
104+- Get correct locale with country from browser ( #2531 )
105+
106+Code refactoring / reduce the technical debt
107+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108+
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 )
115+
116+Github
117+~~~~~~
118+
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 )
122+
123+Build scripts
124+~~~~~~~~~~~~~
125+
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 )
135+
136+Install scripts
137+~~~~~~~~~~~~~~~
138+
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 )
147+
148+Announcement
149+~~~~~~~~~~~~
150+
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.
152+
153+
11540.18.0 2020.12.14
2155=================
3156
@@ -28,7 +181,7 @@ New settings.yml
28181- ``server.method: "POST"`` - Make default query submission method configurable ( #2130 )
29182- ``server.default_http_headers`` - add default http headers ( #2295 )
30183- ``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 )
32185- ``preferences.lock`` - Let admins lock user preferences ( #2270 )
33186
34187Oscar theme
@@ -38,10 +191,10 @@ Oscar theme
38191
39192 - Make infoboxes shorter by default.
40193 - 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.
42195 - Fix pointhi style
43196- 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 )
45198
46199Simple theme
47200~~~~~~~~~~~~
Dockerfile+17−18
@@ -1,29 +1,22 @@
1−FROM alpine:3.12
1+FROM alpine:3.15
22ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
33EXPOSE 8080
44VOLUME /etc/searx
55VOLUME /var/log/uwsgi
66
7−ARG GIT_URL=unknown
8−ARG VERSION_GITCOMMIT=unknown
9−ARG SEARX_GIT_VERSION=unknown
10−
117ARG SEARX_GID=977
128ARG SEARX_UID=977
139
1410RUN addgroup -g ${SEARX_GID} searx && \
1511 adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
1612
17−ARG TIMESTAMP_SETTINGS=0
18−ARG TIMESTAMP_UWSGI=0
19−ARG LABEL_VCS_REF=
20−ARG LABEL_VCS_URL=
21−
2213ENV INSTANCE_NAME=searx \
2314 AUTOCOMPLETE= \
2415 BASE_URL= \
2516 MORTY_KEY= \
26− MORTY_URL=
17+ MORTY_URL= \
18+ SEARX_SETTINGS_PATH=/etc/searx/settings.yml \
19+ UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
2720
2821WORKDIR /usr/local/searx
2922
@@ -41,8 +34,6 @@ RUN apk upgrade --no-cache \
4134 openssl-dev \
4235 tar \
4336 git \
44− protoc \
45− protobuf-dev \
4637 && apk add --no-cache \
4738 ca-certificates \
4839 su-exec \
@@ -55,15 +46,19 @@ RUN apk upgrade --no-cache \
5546 uwsgi \
5647 uwsgi-python3 \
5748 brotli \
58− protobuf \
59− && pip3 install --upgrade pip \
49+ && pip3 install --upgrade pip wheel setuptools \
6050 && pip3 install --no-cache -r requirements.txt \
6151 && apk del build-dependencies \
6252 && rm -rf /root/.cache
6353
64−COPY --chown=searx:searx . .
54+COPY searx ./searx
55+COPY dockerfiles ./dockerfiles
6556
66−RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \
57+ARG TIMESTAMP_SETTINGS=0
58+ARG TIMESTAMP_UWSGI=0
59+ARG VERSION_GITCOMMIT=unknown
60+
61+RUN /usr/bin/python3 -m compileall -q searx; \
6762 touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
6863 touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
6964 if [ ! -z $VERSION_GITCOMMIT ]; then\
@@ -73,8 +68,12 @@ RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \
7368 -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
7469 -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
7570
76−# Keep this argument at the end since it change each time
71+# Keep these arguments at the end to prevent redundant layer rebuilds
7772ARG LABEL_DATE=
73+ARG GIT_URL=unknown
74+ARG SEARX_GIT_VERSION=unknown
75+ARG LABEL_VCS_REF=
76+ARG LABEL_VCS_URL=
7877LABEL maintainer="searx <${GIT_URL}>" \
7978 description="A privacy-respecting, hackable metasearch engine." \
8079 version="${SEARX_GIT_VERSION}" \
Makefile+78−236
@@ -1,265 +1,107 @@
11# -*- coding: utf-8; mode: makefile-gmake -*-
2+# SPDX-License-Identifier: AGPL-3.0-or-later
3+
24.DEFAULT_GOAL=help
5+export MTOOLS=./manage
36
47include utils/makefile.include
58
6−PYOBJECTS = searx
7−DOC = docs
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
11−
12−include utils/makefile.python
13−include utils/makefile.sphinx
14−
159all: clean install
1610
17−PHONY += help-min help-all help
18−
19−help: help-min
20− @echo ''
21− @echo 'to get more help: make help-all'
22−
23−help-min:
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'
28− @echo ' install - developer install (./local)'
29− @echo ' uninstall - uninstall (./local)'
30− @echo ' gh-pages - build docs & deploy on gh-pages branch'
31− @echo ' clean - drop builds and environments'
32− @echo ' project - re-build generic files of the searx project'
33− @echo ' buildenv - re-build environment files (aka brand)'
34− @echo ' themes - re-build build the source of the themes'
35− @echo ' docker - build Docker image'
36− @echo ' node.env - download & install npm dependencies locally'
37− @echo ''
38− @$(MAKE) -e -s make-help
39−
40−help-all: help-min
41− @echo ''
42− @$(MAKE) -e -s python-help
43− @echo ''
44− @$(MAKE) -e -s docs-help
11+PHONY += help
4512
46−PHONY += install
47−install: buildenv pyenvinstall
13+help:
14+ @./manage --help
15+ @echo '----'
16+ @echo 'run - run developer instance'
17+ @echo 'install - developer install of searx into virtualenv'
18+ @echo 'uninstall - uninstall developer installation'
19+ @echo 'clean - clean up working tree'
20+ @echo 'search.checker - check search engines'
21+ @echo 'test - run shell & CI tests'
22+ @echo 'test.sh - test shell scripts'
23+ @echo 'ci.test - run CI tests'
4824
49−PHONY += uninstall
50−uninstall: pyenvuninstall
51−
52−PHONY += clean
53−clean: pyclean docs-clean node.clean test.clean
54− $(call cmd,common_clean)
5525
5626PHONY += run
57−run: buildenv pyenvinstall
27+run: install
5828 $(Q) ( \
5929 sleep 2 ; \
6030 xdg-open http://127.0.0.1:8888/ ; \
6131 ) &
62− SEARX_DEBUG=1 $(PY_ENV)/bin/python ./searx/webapp.py
63−
64−# docs
65−# ----
66−
67−sphinx-doc-prebuilds:: buildenv pyenvinstall prebuild-includes
68−
69−PHONY += docs
70−docs: sphinx-doc-prebuilds
71− $(call cmd,sphinx,html,docs,docs)
72−
73−PHONY += docs-live
74−docs-live: sphinx-doc-prebuilds
75− $(call cmd,sphinx_autobuild,html,docs,docs)
76−
77−PHONY += prebuild-includes
78−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
83−
84−
85−$(GH_PAGES)::
86− @echo "doc available at --> $(DOCS_URL)"
87−
88−# update project files
89−# --------------------
90−
91−PHONY += project engines.languages useragents.update buildenv
92−
93−project: buildenv useragents.update engines.languages
94−
95−engines.languages: pyenvinstall
96− $(Q)echo "fetch languages .."
97− $(Q)$(PY_ENV_ACT); python utils/fetch_languages.py
98− $(Q)echo "update searx/data/engines_languages.json"
99− $(Q)mv engines_languages.json searx/data/engines_languages.json
100− $(Q)echo "update searx/languages.py"
101− $(Q)mv languages.py searx/languages.py
102−
103−useragents.update: pyenvinstall
104− $(Q)echo "Update searx/data/useragents.json with the most recent versions of Firefox."
105− $(Q)$(PY_ENV_ACT); python utils/fetch_firefox_version.py
106−
107−buildenv: pyenv
108− $(Q)$(PY_ENV_ACT); SEARX_DEBUG=1 python utils/build_env.py
109−
110−# node / npm
111−# ----------
112−
113−node.env: buildenv
114− $(Q)./manage.sh npm_packages
115−
116−node.clean:
117− $(Q)echo "CLEAN locally installed npm dependencies"
118− $(Q)rm -rf \
119− ./node_modules \
120− ./package-lock.json \
121− ./searx/static/themes/oscar/package-lock.json \
122− ./searx/static/themes/oscar/node_modules \
123− ./searx/static/themes/simple/package-lock.json \
124− ./searx/static/themes/simple/node_modules
32+ SEARX_DEBUG=1 ./manage pyenv.cmd python ./searx/webapp.py
12533
126−# build themes
127−# ------------
34+PHONY += install uninstall
35+install uninstall:
36+ $(Q)./manage pyenv.$@
12837
129−PHONY += themes.bootstrap themes themes.oscar themes.simple
130−themes: buildenv themes.bootstrap themes.oscar themes.simple
131−
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"
135−
136−quiet_cmd_grunt = GRUNT $2
137− cmd_grunt = PATH="$$(npm bin):$$PATH" \
138− grunt --gruntfile "$2"
139−
140−themes.oscar: node.env
141− $(Q)echo '[!] build oscar theme'
142− $(call cmd,grunt,searx/static/themes/oscar/gruntfile.js)
143−
144−themes.simple: node.env
145− $(Q)echo '[!] build simple theme'
146− $(call cmd,grunt,searx/static/themes/simple/gruntfile.js)
147−
148−themes.bootstrap: node.env
149− $(call cmd,lessc,less/bootstrap/bootstrap.less,css/bootstrap.min.css)
150−
151−
152−# docker
153−# ------
154−
155−PHONY += docker
156−docker: buildenv
157− $(Q)./manage.sh docker_build
158−
159−docker.push: buildenv
160− $(Q)./manage.sh docker_build push
161−
162−# gecko
163−# -----
164−
165−PHONY += gecko.driver
166−gecko.driver:
167− $(PY_ENV_ACT); ./manage.sh install_geckodriver
168−
169−# search.checker
170−# --------------
171−
172−search.checker: pyenvinstall
173− $(Q)$(PY_ENV_ACT); searx-checker -v
174−
175−ENGINE_TARGETS=$(patsubst searx/engines/%.py,search.checker.%,$(wildcard searx/engines/[!_]*.py))
176−
177−$(ENGINE_TARGETS): pyenvinstall
178− $(Q)$(PY_ENV_ACT); searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
179−
180−
181−# test
182−# ----
183−
184−PHONY += test test.sh test.pylint test.pep8 test.unit test.coverage test.robot
185−test: buildenv test.pylint test.pep8 test.unit gecko.driver test.robot
186−
187−PYLINT_FILES=\
188− searx/preferences.py \
189− searx/testing.py \
190− searx/engines/gigablast.py \
191− searx/engines/deviantart.py \
192− searx/engines/digg.py \
193− searx/engines/google.py \
194− searx/engines/google_news.py \
195− searx/engines/google_videos.py \
196− searx/engines/google_images.py \
197− searx/engines/mediathekviewweb.py \
198− searx/engines/google_scholar.py \
199− searx_extra/update/update_external_bangs.py
200−
201−test.pylint: pyenvinstall
202− $(call cmd,pylint,$(PYLINT_FILES))
203− $(call cmd,pylint,\
204− --disable=$(PYLINT_SEARX_DISABLE_OPTION) \
205− --additional-builtins=$(PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES) \
206− searx/engines \
207− )
208− $(call cmd,pylint,\
209− --disable=$(PYLINT_SEARX_DISABLE_OPTION) \
210− --ignore=searx/engines \
211− searx tests \
212− )
38+PHONY += clean
39+clean: py.clean docs.clean node.clean test.clean
40+ $(Q)./manage build_msg CLEAN "common files"
41+ $(Q)find . -name '*.orig' -exec rm -f {} +
42+ $(Q)find . -name '*.rej' -exec rm -f {} +
43+ $(Q)find . -name '*~' -exec rm -f {} +
44+ $(Q)find . -name '*.bak' -exec rm -f {} +
45+
46+PHONY += search.checker search.checker.%
47+search.checker: install
48+ $(Q)./manage pyenv.cmd searx-checker -v
49+
50+search.checker.%: install
51+ $(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
52+
53+PHONY += ci.test test test.sh
54+ci.test: test.pep8 test.pylint test.unit test.robot
55+test: ci.test
56+test.sh:
57+ $(Q)shellcheck -x -s bash \
58+ utils/brand.env \
59+ ./manage \
60+ utils/lib.sh \
61+ utils/filtron.sh \
62+ utils/searx.sh \
63+ utils/morty.sh \
64+ utils/lxc.sh \
65+ utils/lxc-searx.env \
66+ .config.sh
67+ $(Q)./manage build_msg TEST "$@ OK"
21368
214−# ignored rules:
215−# E402 module level import not at top of file
216−# W503 line break before binary operator
21769
218−# ubu1604: uses shellcheck v0.3.7 (from 04/2015), no longer supported!
219−test.sh:
220− shellcheck -x -s bash utils/brand.env
221− shellcheck -x utils/lib.sh
222− shellcheck -x utils/filtron.sh
223− shellcheck -x utils/searx.sh
224− shellcheck -x utils/morty.sh
225− shellcheck -x utils/lxc.sh
226− shellcheck -x utils/lxc-searx.env
227− shellcheck -x .config.sh
70+# wrap ./manage script
22871
229−test.pep8: pyenvinstall
230− @echo "TEST pycodestyle (formerly pep8)"
231− $(Q)$(PY_ENV_ACT); pycodestyle --exclude='searx/static, searx/languages.py, $(foreach f,$(PYLINT_FILES),$(f),)' \
232− --max-line-length=120 --ignore "E117,E252,E402,E722,E741,W503,W504,W605" searx tests
72+MANAGE += buildenv
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
23384
234−test.unit: pyenvinstall
235− @echo "TEST tests/unit"
236− $(Q)$(PY_ENV_ACT); python -m nose2 -s tests/unit
85+PHONY += $(MANAGE)
23786
238−test.coverage: pyenvinstall
239− @echo "TEST unit test coverage"
240− $(Q)$(PY_ENV_ACT); \
241− python -m nose2 -C --log-capture --with-coverage --coverage searx -s tests/unit \
242− && coverage report \
243− && coverage html \
87+$(MANAGE):
88+ $(Q)$(MTOOLS) $@
24489
245−test.robot: pyenvinstall gecko.driver
246− @echo "TEST robot"
247− $(Q)$(PY_ENV_ACT); PYTHONPATH=. python searx/testing.py robot
90+# deprecated
24891
249−test.clean:
250− @echo "CLEAN intermediate test stuff"
251− $(Q)rm -rf geckodriver.log .coverage coverage/
92+PHONY += docs docs-clean docs-live docker themes
25293
94+docs: docs.html
95+ $(Q)./manage build_msg WARN $@ is deprecated use docs.html
25396
254−# travis
255−# ------
97+docs-clean: docs.clean
98+ $(Q)./manage build_msg WARN $@ is deprecated use docs.clean
25699
257−PHONY += ci.test
258−ci.test:
259− $(PY_ENV_BIN)/python -c "import yaml" || make clean
260− $(MAKE) test
100+docs-live: docs.live
101+ $(Q)./manage build_msg WARN $@ is deprecated use docs.live
261102
262−travis.codecov:
263− $(Q)$(PY_ENV_BIN)/python -m pip install codecov
103+docker: docker.build
104+ $(Q)./manage build_msg WARN $@ is deprecated use docker.build
264105
265−.PHONY: $(PHONY)
106+themes: themes.all
107+ $(Q)./manage build_msg WARN $@ is deprecated use themes.all
README.rst+2−2
@@ -17,7 +17,7 @@
1717|OpenCollective searx backers|
1818|OpenCollective searx sponsors|
1919
20−Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **səːks**.
20+Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **sɜːks**.
2121
2222.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
2323
@@ -61,7 +61,7 @@ our homepage_.
6161.. _homepage: https://searx.github.io/searx
6262
6363contact:
64− openhub_ // twitter_ // IRC: #searx @ freenode
64+ openhub_ // twitter_ // IRC: #searx @ Libera (irc.libera.chat)
6565
6666.. _openhub: https://www.openhub.net/p/searx
6767.. _twitter: https://twitter.com/Searx_engine
dockerfiles/docker-entrypoint.sh−3
@@ -24,9 +24,6 @@ if [ -z "${BIND_ADDRESS}" ]; then
2424 export BIND_ADDRESS="${DEFAULT_BIND_ADDRESS}"
2525fi
2626
27−export UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
28−export SEARX_SETTINGS_PATH=/etc/searx/settings.yml
29−
3027# Parse special command line
3128# see docs/admin/installation-docker.rst
3229# display the help message without the version
docs/admin/buildhosts.rst+4−4
@@ -49,9 +49,9 @@ Build docs
4949 - dvisvgm_
5050
5151Most 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
53−processing additional packages are needed. The XeTeX_ needed not only for PDF
54−creation, its also needed for :ref:`math` when HTML output is build.
52+docs can be build from scratch with ``make docs.html``. For better math and
53+image processing additional packages are needed. The XeTeX_ needed not only for
54+PDF creation, its also needed for :ref:`math` when HTML output is build.
5555
5656To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
5757as images (``sphinx.ext.imgmath`` extension).
@@ -64,7 +64,7 @@ to ``imgmath``:
6464 :start-after: # sphinx.ext.imgmath setup
6565 :end-before: # sphinx.ext.imgmath setup END
6666
67−If your docs build (``make docs``) shows warnings like this::
67+If your docs build (``make docs.html``) shows warnings like this::
6868
6969 WARNING: dot(1) not found, for better output quality install \
7070 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.
173173 location /searx {
174174 proxy_pass http://127.0.0.1:4004/;
175175
176− proxy_set_header Host $http_host;
176+ proxy_set_header Host $host;
177177 proxy_set_header Connection $http_connection;
178178 proxy_set_header X-Real-IP $remote_addr;
179179 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
docs/admin/installation-docker.rst+1−1
@@ -51,7 +51,7 @@ It's also possible to build searx from the embedded Dockerfile.
5151
5252 git clone https://github.com/searx/searx.git
5353 cd searx
54− make docker
54+ make docker.build
5555
5656
5757Public instance
docs/admin/installation-nginx.rst+8−8
@@ -182,7 +182,7 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
182182 location /searx {
183183 proxy_pass http://127.0.0.1:4004/;
184184
185− proxy_set_header Host $http_host;
185+ proxy_set_header Host $host;
186186 proxy_set_header Connection $http_connection;
187187 proxy_set_header X-Real-IP $remote_addr;
188188 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -190,8 +190,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
190190 proxy_set_header X-Script-Name /searx;
191191 }
192192
193− location /searx/static {
194− alias /usr/local/searx/searx-src/searx/static;
193+ location /searx/static/ {
194+ alias /usr/local/searx/searx-src/searx/static/;
195195 }
196196
197197
@@ -205,7 +205,7 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
205205 location /morty {
206206 proxy_pass http://127.0.0.1:3000/;
207207
208− proxy_set_header Host $http_host;
208+ proxy_set_header Host $host;
209209 proxy_set_header Connection $http_connection;
210210 proxy_set_header X-Real-IP $remote_addr;
211211 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -309,8 +309,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
309309 proxy_buffering off;
310310 }
311311
312− location /searx/static {
313− alias /usr/local/searx/searx-src/searx/static;
312+ location /searx/static/ {
313+ alias /usr/local/searx/searx-src/searx/static/;
314314 }
315315
316316 The ``X-Script-Name /searx`` is needed by the searx implementation to
@@ -328,8 +328,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
328328 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
329329 }
330330
331− location /searx/static {
332− alias /usr/local/searx/searx-src/searx;
331+ location /searx/static/ {
332+ alias /usr/local/searx/searx-src/searx/;
333333 }
334334
335335 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*):
6161
6262.. tip::
6363
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)$``
6565 terminal open for the tasks below.
6666
6767
docs/admin/installation.rst+6−1
@@ -39,13 +39,18 @@ install from ``root``, take into account that the scripts are creating a
3939these new created users do need read access to the clone of searx, which is not
4040the case if you clone into a folder below ``/root``.
4141
42−
4342.. code:: bash
4443
4544 $ cd ~/Downloads
4645 $ git clone https://github.com/searx/searx searx
4746 $ cd searx
4847
48+.. sidebar:: further read
49+
50+ - :ref:`toolboxing`
51+ - :ref:`update searx`
52+ - :ref:`inspect searx`
53+
4954**Install** :ref:`searx service <searx.sh>`
5055
5156This installs searx as described in :ref:`installation basic`.
docs/admin/settings.rst+51−13
@@ -130,14 +130,12 @@ Global Settings
130130 request_timeout : 2.0 # default timeout in seconds, can be override by engine
131131 # max_request_timeout: 10.0 # the maximum timeout in seconds
132132 useragent_suffix : "" # informations like an email address to the administrator
133− pool_connections : 100 # Number of different hosts
134− pool_maxsize : 10 # Number of simultaneous requests by host
133+ pool_connections : 100 # Maximum number of allowable connections, or None for no limits. The default is 100.
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/
135136 # uncomment below section if you want to use a proxy
136137 # proxies:
137− # http:
138− # - http://proxy1:8080
139− # - http://proxy2:8080
140− # https:
138+ # all://:
141139 # - http://proxy1:8080
142140 # - http://proxy2:8080
143141 # uncomment below section only if you have more than one network interface
@@ -145,6 +143,7 @@ Global Settings
145143 # source_ips:
146144 # - 1.1.1.1
147145 # - 1.1.1.2
146+ # - fe80::/126
148147
149148
150149``request_timeout`` :
@@ -157,20 +156,46 @@ Global Settings
157156 Suffix to the user-agent searx uses to send requests to others engines. If an
158157 engine wish to block you, a contact info here may be useful to avoid that.
159158
160−.. _requests proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies
161−.. _PySocks: https://pypi.org/project/PySocks/
159+``keepalive_expiry``:
160+ Number of seconds to keep a connection in the pool. By default 5.0 seconds.
161+
162+.. _httpx proxies: https://www.python-httpx.org/advanced/#http-proxying
162163
163164``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`_.
165166 If there are more than one proxy for one protocol (http, https),
166167 requests to the engines are distributed in a round-robin fashion.
167168
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>`__
170−
171169``source_ips`` :
172170 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:
172+
173+ * ``0.0.0.0`` any local IPv4 address.
174+ * ``::`` any local IPv6 address.
175+ * ``192.168.0.1``
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 ]``
180+
181+``retries`` :
182+ Number of retry in case of an HTTP error.
183+ On each retry, searx uses an different proxy and source ip.
184+
185+``retry_on_http_error`` :
186+ Retry request on some HTTP status code.
187+
188+ Example:
189+
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.
193+
194+``enable_http2`` :
195+ Enable by default. Set to ``False`` to disable HTTP/2.
196+
197+``max_redirects`` :
198+ 30 by default. Maximum redirect before it is an error.
174199
175200
176201``locales:``
@@ -216,6 +241,13 @@ Engine settings
216241 api_key : 'apikey'
217242 disabled : True
218243 language : en_US
244+ #enable_http: False
245+ #enable_http2: False
246+ #retries: 1
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
219251 #proxies:
220252 # http:
221253 # - http://proxy1:8080
@@ -270,6 +302,12 @@ Engine settings
270302``display_error_messages`` : default ``True``
271303 When an engine returns an error, the message is displayed on the user interface.
272304
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)
310+
273311.. note::
274312
275313 A few more options are possible, but they are pretty specific to some
docs/admin/update-searx.rst+46−10
@@ -4,20 +4,56 @@
44How to update
55=============
66
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.
9+
10+**Update** :ref:`searx service <searx.sh>`
11+
12+.. code:: sh
13+
14+ sudo -H ./utils/searx.sh update searx
15+
16+**Update** :ref:`filtron reverse proxy <filtron.sh>`
17+
718.. code:: sh
819
9− sudo -H -u searx -i
10− (searx)$ git stash
11− (searx)$ git pull origin master
12− (searx)$ git stash apply
13− (searx)$ ./manage.sh update_packages
20+ sudo -H ./utils/filtron.sh update filtron
21+
22+**Update** :ref:`result proxy <morty.sh>`
23+
24+.. code:: bash
25+
26+ sudo -H ./utils/morty.sh update morty
27+
28+.. _inspect searx:
29+
30+======================
31+How to inspect & debug
32+======================
33+
34+.. sidebar:: further read
35+
36+ - :ref:`toolboxing`
37+ - :ref:`Makefile`
38+
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.
41+
42+**Inspect** :ref:`searx service <searx.sh>`
43+
44+.. code:: sh
45+
46+ sudo -H ./utils/searx.sh inspect service
47+
48+**Inspect** :ref:`filtron reverse proxy <filtron.sh>`
49+
50+.. code:: sh
1451
15−Restart uwsgi:
52+ sudo -H ./utils/filtron.sh inspect service
1653
17−.. tabs::
54+**Inspect** :ref:`result proxy <morty.sh>`
1855
19− .. group-tab:: Ubuntu / debian
56+.. code:: bash
2057
21− .. code:: sh
58+ sudo -H ./utils/morty.sh inspect service
2259
23− sudo -H systemctl restart uwsgi
docs/blog/index.rst+6−3
@@ -3,12 +3,15 @@ Blog
33====
44
55.. toctree::
6− :maxdepth: 2
7− :caption: Contents
6+ :titlesonly:
7+ :reversed:
88
9− lxcdev-202006
109 python3
1110 admin
1211 intro-offline
1312 private-engines
13+ lxcdev-202006
1414 command-line-engines
15+ search-indexer-engines
16+ sql-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.
3131
3232 The environment in which we run all our development processes matters!
3333
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
3535do not have access to all prerequisites. For example, there may have
3636dependencies on packages that are installed on the developer's desktop, but
3737usually are not preinstalled on a server or client system. Another examples
@@ -356,7 +356,7 @@ daily usage:
356356 .. code:: sh
357357
358358 $ sudo -H ./utils/lxc.sh cmd searx-archlinux \
359− make docs
359+ make docs.html
360360
361361.. _blog-lxcdev-202006 abstract:
362362
@@ -407,7 +407,7 @@ To get remarks from the suite of the archlinux container we can use:
407407 ...
408408 [searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
409409 [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/
411411 [searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
412412 ...
413413
docs/blog/search-database-engines.rstnew file+95
@@ -0,0 +1,95 @@
1+===============================
2+Query more of your NoSQL stores
3+===============================
4+
5+From now on, searx lets you to query your NoSQL data stores:
6+
7+* `Redis`_
8+* `MongoDB`_
9+
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.
12+
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}``.
18+
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
21+private engines`_.
22+
23+Configuring searx to use the stores
24+===================================
25+
26+NoSQL data stores are used for storing arbitrary data without first defining their
27+structure.
28+
29+Redis
30+-----
31+
32+Reqired package: ``redis``
33+
34+Redis is a key value based data store usually stored in memory.
35+
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``.
39+
40+In this example you can search for exact matches in your first database:
41+
42+.. code:: yaml
43+
44+ - name : mystore
45+ engine : redis_server
46+ exact_match_only : True
47+ host : 127.0.0.1
48+ port : 6379
49+ password : secret-password
50+ db : 0
51+ shortcut : rds
52+ enable_http : True
53+
54+
55+MongoDB
56+-------
57+
58+Required package: ``pymongo``
59+
60+MongoDB is a document based database program that handles JSON like data.
61+
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
64+as you wish.
65+
66+Above is an example configuration for using a MongoDB collection:
67+
68+.. code:: yaml
69+
70+ - name : mymongo
71+ engine : mongodb
72+ shortcut : md
73+ host : '127.0.0.1'
74+ port : 27017
75+ database : personal
76+ collection : income
77+ key : month
78+ enable_http: True
79+
80+
81+Acknowledgement
82+===============
83+
84+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
85+
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/
91+
92+
93+| Happy hacking.
94+| kvch // 2021.07.13 23:16
95+
docs/blog/search-indexer-engines.rstnew file+114
@@ -0,0 +1,114 @@
1+===============================
2+Query your local search engines
3+===============================
4+
5+From now on, searx lets you to query your locally running search engines. The following
6+ones are supported now:
7+
8+* `Elasticsearch`_
9+* `Meilisearch`_
10+* `Solr`_
11+
12+All of the engines above are added to ``settings.yml`` just commented out, as you have to
13+``base_url`` for all them.
14+
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``.
17+
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
20+private engines`_.
21+
22+Configuring searx for search engines
23+====================================
24+
25+Each search engine is powerful, capable of full-text search.
26+
27+Elasticsearch
28+-------------
29+
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``.
32+
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``.
35+
36+The following is an example configuration for an Elasticsearch instance with authentication
37+configured to read from ``my-index`` index.
38+
39+.. code:: yaml
40+
41+ - name : elasticsearch
42+ shortcut : es
43+ engine : elasticsearch
44+ base_url : http://localhost:9200
45+ username : elastic
46+ password : changeme
47+ index : my-index
48+ query_type : match
49+ enable_http : True
50+
51+
52+Meilisearch
53+-----------
54+
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.
58+
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``.
61+
62+Here is a simple example to query a Meilisearch instance:
63+
64+.. code:: yaml
65+
66+ - name : meilisearch
67+ engine : meilisearch
68+ shortcut: mes
69+ base_url : http://localhost:7700
70+ index : my-index
71+ enable_http: True
72+
73+
74+Solr
75+----
76+
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.
79+
80+This is an example configuration for searching in the collection ``my-collection`` and get
81+the results in ascending order.
82+
83+.. code:: yaml
84+
85+ - name : solr
86+ engine : solr
87+ shortcut : slr
88+ base_url : http://localhost:8983
89+ collection : my-collection
90+ sort : asc
91+ enable_http : True
92+
93+
94+Next steps
95+==========
96+
97+The next step is to add support for various SQL databases.
98+
99+Acknowledgement
100+===============
101+
102+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
103+
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/
110+
111+
112+| Happy hacking.
113+| kvch // 2021.04.07 23:16
114+
docs/blog/sql-engines.rstnew file+117
@@ -0,0 +1,117 @@
1+=================
2+Query SQL servers
3+=================
4+
5+Now you can query SQL servers using searx. The following ones are supported:
6+
7+* `PostgreSQL`_
8+* `MySQL`_
9+* `SQLite`_
10+
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}``.
17+
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`_.
21+
22+Configure the engines
23+=====================
24+
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.
30+
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``.
34+
35+PostgreSQL
36+----------
37+
38+PostgreSQL is a powerful and robust open source database.
39+
40+Before configuring the PostgreSQL engine, you must install the dependency ``psychopg2``.
41+
42+You can find an example configuration below:
43+
44+.. code:: yaml
45+
46+ - name : postgresql
47+ engine : postgresql
48+ database : my_database
49+ username : searx
50+ password : password
51+ query_str : 'SELECT * from my_table WHERE my_column = %(query)s'
52+ shortcut : psql
53+
54+
55+MySQL
56+-----
57+
58+MySQL is said to be the most popular open source database.
59+
60+Before enabling MySQL engine, you must install the package ``mysql-connector-python``.
61+
62+The authentication plugin is configurable by setting ``auth_plugin`` in the attributes.
63+By default it is set to ``caching_sha2_password``.
64+
65+This is an example configuration for quering a MySQL server:
66+
67+.. code:: yaml
68+
69+ - name : mysql
70+ engine : mysql_server
71+ database : my_database
72+ username : searx
73+ password : password
74+ limit : 5
75+ query_str : 'SELECT * from my_table WHERE my_column=%(query)s'
76+ shortcut : mysql
77+
78+
79+SQLite
80+------
81+
82+SQLite is a small, fast and reliable SQL database engine. It does not require
83+any extra dependency.
84+
85+You can read from your database ``my_database`` using this example configuration:
86+
87+.. code:: yaml
88+
89+ - name : sqlite
90+ engine : sqlite
91+ shortcut: sq
92+ database : my_database
93+ query_str : 'SELECT * FROM my_table WHERE my_column=:query'
94+
95+
96+Next steps
97+==========
98+
99+The next step is to add support for more data stores, e.g. Redis and MongoDB.
100+
101+Acknowledgement
102+===============
103+
104+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
105+
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/
112+
113+
114+| Happy hacking.
115+| kvch // 2021.05.23 23:16
116+
117+
docs/build-templates/morty.rst+1−1
@@ -32,7 +32,7 @@
3232 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
3333 (${SERVICE_USER}) $ wget --progress=bar -O \"${GO_TAR}\" \\
3434 \"${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}\"
3636 (${SERVICE_USER}) $ which go
3737 ${SERVICE_HOME}/local/go/bin/go
3838
docs/conf.py+3−8
@@ -1,7 +1,7 @@
11# -*- coding: utf-8 -*-
2+# SPDX-License-Identifier: AGPL-3.0-or-later
23
34import sys, os
4−from sphinx_build_tools import load_sphinx_config
55from pallets_sphinx_themes import ProjectLink
66
77from searx import brand
@@ -10,7 +10,7 @@ from searx.version import VERSION_STRING
1010# Project --------------------------------------------------------------
1111
1212project = u'searx'
13−copyright = u'2015-2020, Adam Tauber, Noémi Ványi'
13+copyright = u'2015-2021, Adam Tauber, Noémi Ványi'
1414author = u'Adam Tauber'
1515release, version = VERSION_STRING, VERSION_STRING
1616highlight_language = 'none'
@@ -101,6 +101,7 @@ imgmath_font_size = 14
101101
102102html_theme_options = {"index_sidebar_logo": True}
103103html_context = {"project_links": [] }
104+html_context["project_links"].append(ProjectLink("Blog", "blog/index.html"))
104105if brand.GIT_URL:
105106 html_context["project_links"].append(ProjectLink("Source", brand.GIT_URL))
106107if brand.WIKI_URL:
@@ -128,9 +129,3 @@ html_show_sourcelink = False
128129latex_documents = [
129130 (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
130131]
131−
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:
132132
133133.. code:: sh
134134
135− $ make docs-clean docs
135+ $ make docs.clean docs.html
136136 ...
137137 The HTML pages are in dist/docs.
138138
139−.. _make docs-live:
139+.. _make docs.live:
140140
141141live build
142142----------
@@ -144,19 +144,19 @@ live build
144144.. _sphinx-autobuild:
145145 https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
146146
147−.. sidebar:: docs-clean
147+.. sidebar:: docs.clean
148148
149149 It is recommended to assert a complete rebuild before deploying (use
150− ``docs-clean``).
150+ ``docs.clean``).
151151
152152Live 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
154154URL in your favorite browser and rebuilds every time a reST file has been
155155changed.
156156
157157.. code:: sh
158158
159− $ make docs-live
159+ $ make docs.live
160160 ...
161161 The HTML pages are in dist/docs.
162162 ... Serving on http://0.0.0.0:8000
@@ -169,7 +169,7 @@ argument. E.g to find and use a free port, use:
169169
170170.. code:: sh
171171
172− $ SPHINXOPTS="--port 0" make docs-live
172+ $ SPHINXOPTS="--port 0" make docs.live
173173 ...
174174 ... Serving on http://0.0.0.0:50593
175175 ...
@@ -180,21 +180,10 @@ argument. E.g to find and use a free port, use:
180180deploy on github.io
181181-------------------
182182
183−To deploy documentation at :docs:`github.io <.>` use Makefile target
184−:ref:`make gh-pages`, which will builds the documentation, clones searx into a sub
185−folder ``gh-pages``, cleans it, copies the doc build into and runs all the
186−needed git add, commit and push:
183+To deploy documentation at :docs:`github.io <.>` use Makefile target :ref:`make
184+docs.gh-pages`, which builds the documentation and runs all the needed git add,
185+commit and push:
187186
188187.. code:: sh
189188
190− $ make docs-clean gh-pages
191− ...
192− SPHINX docs --> file://<...>/dist/docs
193− The HTML pages are in dist/docs.
194− ...
195− Cloning into 'gh-pages' ...
196− ...
197− cd gh-pages; git checkout gh-pages >/dev/null
198− Switched to a new branch 'gh-pages'
199− ...
200− doc available at --> https://searx.github.io/searx
189+ $ make docs.clean docs.gh-pages
docs/dev/engine_overview.rst+3−1
@@ -58,6 +58,8 @@ argument type information
5858name string name of search-engine
5959engine string name of searx-engine
6060 (filename without ``.py``)
61+enable_http bool enable HTTP
62+ (by default only HTTPS is enabled).
6163shortcut string shortcut of search-engine
6264timeout string specific timeout for search-engine
6365display_error_messages boolean display error messages on the web UI
@@ -169,7 +171,7 @@ headers set HTTP header information
169171data set HTTP data information
170172cookies set HTTP cookies
171173verify bool Performing SSL-Validity check
172−allow_redirects bool Follow redirects
174+follow_redirects bool Follow redirects
173175max_redirects int maximum redirects, hard limit
174176soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
175177raise_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 @@
11.. _makefile:
22
3−================
4−Makefile Targets
5−================
3+========
4+Makefile
5+========
66
77.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
88
99.. sidebar:: build environment
1010
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
12+ install`.
1213
1314 To install system requirements follow :ref:`buildhosts`.
1415
15−With the aim to simplify development cycles, started with :pull:`1756` a
16−``Makefile`` based boilerplate was added. If you are not familiar with
17−Makefiles, we recommend to read gnu-make_ introduction.
16+All relevant build tasks are implemented in :origin:`manage.sh` and for CI or
17+IDE integration a small ``Makefile`` wrapper is available. If you are not
18+familiar with Makefiles, we recommend to read gnu-make_ introduction.
1819
1920The usage is simple, just type ``make {target-name}`` to *build* a target.
2021Calling the ``help`` target gives a first overview (``make help``):
2122
2223.. program-output:: bash -c "cd ..; make --no-print-directory help"
2324
24−
2525.. contents:: Contents
2626 :depth: 2
2727 :local:
2828 :backlinks: entry
2929
30−.. _make pyenv:
30+.. _make install:
3131
3232Python environment
3333==================
@@ -36,31 +36,42 @@ Python environment
3636
3737 ``source ./local/py3/bin/activate``
3838
39−With Makefile we do no longer need to build up the virtualenv manually (as
40−described in the :ref:`devquickstart` guide). Jump into your git working tree
41−and release a ``make pyenv``:
42−
43−.. code:: sh
39+We do no longer need to build up the virtualenv manually. Jump into your git
40+working tree and release a ``make install`` to get a virtualenv with a
41+*developer install* of searx (:origin:`setup.py`). ::
4442
4543 $ cd ~/searx-clone
46− $ make pyenv
47− PYENV usage: source ./local/py3/bin/activate
44+ $ make install
45+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
4846 ...
47+ PYENV OK
48+ PYENV [install] pip install -e 'searx[test]'
49+ ...
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
4954
50−With target ``pyenv`` a development environment (aka virtualenv) was build up in
51−``./local/py3/``. To make a *developer install* of searx (:origin:`setup.py`)
52−into this environment, use make target ``install``:
53−
54−.. code:: sh
55+If you release ``make install`` multiple times the installation will only
56+rebuild if the sha256 sum of the *requirement files* fails. With other words:
57+the check fails if you edit the requirements listed in
58+:origin:`requirements-dev.txt` and :origin:`requirements.txt`). ::
5559
5660 $ make install
57− PYENV usage: source ./local/py3/bin/activate
58− PYENV using virtualenv from ./local/py3
59− PYENV install .
60−
61−You have never to think about intermediate targets like ``pyenv`` or
62−``install``, the ``Makefile`` chains them as requisites. Just run your main
63−target.
61+ PYENV OK
62+ PYENV [virtualenv] requirements.sha256 failed
63+ [virtualenv] - 6cea6eb6def9e14a18bf32f8a3e... ./requirements-dev.txt
64+ [virtualenv] - 471efef6c73558e391c3adb35f4... ./requirements.txt
65+ ...
66+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
67+ ...
68+ PYENV OK
69+ PYENV [install] pip install -e 'searx[test]'
70+ ...
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
6475
6576.. sidebar:: drop environment
6677
@@ -68,10 +79,7 @@ target.
6879 <make clean>` first.
6980
7081If you think, something goes wrong with your ./local environment or you change
71−the :origin:`setup.py` file (or the requirements listed in
72−:origin:`requirements-dev.txt` and :origin:`requirements.txt`), you have to call
73−:ref:`make clean`.
74−
82+the :origin:`setup.py` file, you have to call :ref:`make clean`.
7583
7684.. _make run:
7785
@@ -81,117 +89,113 @@ the :origin:`setup.py` file (or the requirements listed in
8189To get up a running a developer instance simply call ``make run``. This enables
8290*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
8391instance, disables *debug* option again and opens the URL in your favorite WEB
84−browser (:man:`xdg-open`):
85−
86−.. code:: sh
92+browser (:man:`xdg-open`)::
8793
88− $ make run
89− PYENV usage: source ./local/py3/bin/activate
90− PYENV install .
91− ./local/py3/bin/python ./searx/webapp.py
92− ...
93− INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
94− ...
94+ $ make run
95+ PYENV OK
96+ SEARX_DEBUG=1 ./manage.sh pyenv.cmd python ./searx/webapp.py
97+ ...
98+ INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
9599
96100.. _make clean:
97101
98102``make clean``
99103==============
100104
101−Drop all intermediate files, all builds, but keep sources untouched. Includes
102−target ``pyclean`` which drops ./local environment. Before calling ``make
103−clean`` stop all processes using :ref:`make pyenv`.
104−
105−.. code:: sh
105+Drop all intermediate files, all builds, but keep sources untouched. Before
106+calling ``make clean`` stop all processes using :ref:`make install`. ::
106107
107108 $ make clean
108− CLEAN pyclean
109− CLEAN clean
109+ CLEAN pyenv
110+ PYENV [virtualenv] drop ./local/py3
111+ CLEAN docs -- ./build/docs ./dist/docs
112+ CLEAN locally installed npm dependencies
113+ CLEAN test stuff
114+ CLEAN common files
110115
111116.. _make docs:
112117
113−``make docs docs-live docs-clean``
114−==================================
118+``make docs docs.autobuild docs.clean``
119+=======================================
115120
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 /
117122Documentation <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,
119124adjust your :ref:`settings global`.
120125
121−.. _make books:
126+.. _make docs.gh-pages:
122127
123−``make books/{name}.html books/{name}.pdf``
124−===========================================
128+``make docs.gh-pages``
129+======================
125130
126−.. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
127−.. _XeTeX: https://tug.org/xetex/
131+To deploy on github.io first adjust your :ref:`settings global`. For any
132+further read :ref:`deploy on github.io`.
128133
129−.. sidebar:: info
134+.. _make test:
130135
131− To build PDF a XeTeX_ is needed, see :ref:`buildhosts`.
136+``make test``
137+=============
132138
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.::
133141
134−The ``books/{name}.*`` targets are building *books*. A *book* is a
135−sub-directory containing a ``conf.py`` file. One example is the user handbook
136−which can deployed separately (:origin:`docs/user/conf.py`). Such ``conf.py``
137−do inherit from :origin:`docs/conf.py` and overwrite values to fit *book's*
138−needs.
142+ $ make test.pep8 test.unit test.sh
143+ TEST test.pep8 OK
144+ ...
145+ TEST test.unit OK
146+ ...
147+ TEST test.sh OK
139148
140−With the help of Intersphinx_ (:ref:`reST smart ref`) the links to searx’s
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.
149+.. _make test.sh:
144150
145−Use ``make docs-help`` to see which books available:
151+``make test.sh``
152+================
146153
147−.. program-output:: bash -c "cd ..; make --no-print-directory docs-help"
148− :ellipsis: 0,-6
154+:ref:`sh lint` / if you have changed some bash scripting run this test before
155+commit.
149156
157+.. _make test.pylint:
150158
151−.. _make gh-pages:
159+``make test.pylint``
160+====================
152161
153−``make gh-pages``
154−=================
162+.. _Pylint: https://www.pylint.org/
155163
156−To deploy on github.io first adjust your :ref:`settings global`. For any
157−further read :ref:`deploy on github.io`.
164+Pylint_ is known as one of the best source-code, bug and quality checker for the
165+Python programming language. The pylint profile we use at searx project is
166+found in project's root folder :origin:`.pylintrc`.
158167
159−.. _make test:
168+.. _make search.checker:
160169
161−``make test``
162−=============
170+``search.checker.{engine name}``
171+================================
163172
164−Runs a series of tests: ``test.pep8``, ``test.unit``, ``test.robot`` and does
165−additional :ref:`pylint checks <make pylint>`. You can run tests selective,
166−e.g.:
173+To check all engines::
167174
168−.. code:: sh
175+ make search.checker
169176
170− $ make test.pep8 test.unit test.sh
171− . ./local/py3/bin/activate; ./manage.sh pep8_check
172− [!] Running pep8 check
173− . ./local/py3/bin/activate; ./manage.sh unit_tests
174− [!] Running unit tests
177+To check a engine with whitespace in the name like *google news* replace space
178+by underline::
175179
176−.. _make pylint:
180+ make search.checker.google_news
177181
178−``make pylint``
179−===============
182+To see HTTP requests and more use SEARX_DEBUG::
180183
181−.. _Pylint: https://www.pylint.org/
184+ make SEARX_DEBUG=1 search.checker.google_news
185+
186+.. _3xx: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection
182187
183−Before commiting its recommend to do some (more) linting. Pylint_ is known as
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`.
188+To filter out HTTP redirects (3xx_)::
189189
190−Code quality is a ongoing process. Don't try to fix all messages from Pylint,
191−run Pylint and check if your changed lines are bringing up new messages. If so,
192−fix it. By this, code quality gets incremental better and if there comes the
193−day, the linting is balanced out, we might decide to add Pylint as a quality
194−gate.
190+ make SEARX_DEBUG=1 search.checker.google_news | grep -A1 "HTTP/1.1\" 3[0-9][0-9]"
191+ ...
192+ Engine google news Checking
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+ 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
195+ --
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
198+ --
195199
196200
197201``make pybuild``
@@ -200,9 +204,7 @@ gate.
200204.. _PyPi: https://pypi.org/
201205.. _twine: https://twine.readthedocs.io/en/latest/
202206
203−Build Python packages in ``./dist/py``.
204−
205−.. code:: sh
207+Build Python packages in ``./dist/py``::
206208
207209 $ make pybuild
208210 ...
@@ -210,9 +212,11 @@ Build Python packages in ``./dist/py``.
210212 running sdist
211213 running egg_info
212214 ...
213− $ ls ./dist/py/
214− searx-0.15.0-py3-none-any.whl searx-0.15.0.tar.gz
215+ running bdist_wheel
216+
217+ $ ls ./dist
218+ searx-0.18.0-py3-none-any.whl searx-0.18.0.tar.gz
215219
216−To upload packages to PyPi_, there is also a ``upload-pypi`` target. It needs
217−twine_ to be installed. Since you are not the owner of :pypi:`searx` you will
218−never need the latter.
220+To upload packages to PyPi_, there is also a ``pypi.upload`` target (to test use
221+``pypi.upload.test``). Since you are not the owner of :pypi:`searx` you will
222+never need to upload.
docs/dev/reST.rst+6−7
@@ -15,8 +15,8 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read
1515:ref:`docs build`.
1616
1717The 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
19−<make docs-live>` to build HTML while editing.
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.
2020
2121.. sidebar:: Further reading
2222
@@ -1276,13 +1276,12 @@ Templating
12761276
12771277.. sidebar:: Build environment
12781278
1279− All *generic-doc* tasks are running in the :ref:`build environment <make
1280− pyenv>`.
1279+ All *generic-doc* tasks are running in the :ref:`make install`.
12811280
12821281Templating is suitable for documentation which is created generic at the build
1283−time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
1284−environment <make pyenv>` (with searx modules installed). We use this e.g. to
1285−build chapter: :ref:`engines generic`. Below the jinja directive from the
1282+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
1283+install` (with searx modules installed). We use this e.g. to build chapter:
1284+:ref:`engines generic`. Below the jinja directive from the
12861285:origin:`docs/admin/engines.rst` is shown:
12871286
12881287.. literalinclude:: ../admin/engines.rst
docs/user/conf.pydeleted−21
@@ -1,21 +0,0 @@
1−# -*- coding: utf-8; mode: python -*-
2−"""Configuration for the Searx user handbook
3−"""
4−project = 'Searx User-HB'
5−version = release = VERSION_STRING
6−
7−intersphinx_mapping['searx'] = (brand.DOCS_URL, None)
8−
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]).
12−latex_documents = [
13− ('index' # startdocname
14− , 'searx-user-hb.tex' # targetname
15− , '' # take title from .rst
16− , author # author
17− , 'howto' # documentclass
18− , False # toctree_only
19− ),
20−]
21−
docs/utils/index.rst+3−3
@@ -1,9 +1,9 @@
11.. _searx_utils:
22.. _toolboxing:
33
4−========================================
5−Tooling box ``utils`` for administrators
6−========================================
4+===================
5+Admin's tooling box
6+===================
77
88In the folder :origin:`utils/` we maintain some tools useful for administrators.
99
docs/utils/lxc.sh.rst+3−3
@@ -119,15 +119,15 @@ of coffee).::
119119
120120To build (live) documentation inside a archlinux_ container::
121121
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
123123 ...
124124 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
125125
126126To get IP of the container and the port number *live docs* is listening::
127127
128− $ sudo ./utils/lxc.sh show suite | grep docs-live
128+ $ sudo ./utils/lxc.sh show suite | grep docs.live
129129 ...
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/
131131
132132
133133.. _lxc.sh help:
managenew file+504
@@ -0,0 +1,504 @@
1+#!/usr/bin/env bash
2+# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
3+# SPDX-License-Identifier: AGPL-3.0-or-later
4+# shellcheck disable=SC2031
5+
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"
10+source_dot_config
11+
12+# config
13+
14+PY_SETUP_EXTRAS='[test]'
15+NPM_PACKAGES="less@2.7 less-plugin-clean-css grunt-cli"
16+GECKODRIVER_VERSION="v0.30.0"
17+# SPHINXOPTS=
18+
19+# These py files are linted by test.pylint(), all other files are linted by
20+# test.pep8()
21+PYLINT_FILES=(
22+ searx/preferences.py
23+ searx/testing.py
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
42+)
43+
44+PYLINT_SEARX_DISABLE_OPTION="\
45+I,C,R,\
46+W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,\
47+E1136"
48+PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES="supported_languages,language_aliases"
49+PYLINT_OPTIONS="-m pylint -j 0 --rcfile .pylintrc"
50+
51+help() {
52+ cat <<EOF
53+buildenv
54+ rebuild ./utils/brand.env
55+babel.compile
56+ pybabel compile ./searx/translations
57+data.*
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.
61+docs.*
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
67+docker
68+ build : build docker image
69+ push : build and push docker image
70+gecko.driver
71+ download & install geckodriver if not already installed (required for
72+ robot_tests)
73+node.*
74+ env : download & install npm dependencies locally
75+ clean : drop npm installations
76+py.*
77+ build : Build python packages at ./${PYDIST}
78+ clean : delete virtualenv and intermediate py files
79+pyenv.* :
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
84+pypi.upload:
85+ Upload python packages to PyPi (to test use pypi.upload.test)
86+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
93+themes.* :
94+ all : build all themes
95+ oscar : build oscar theme
96+ simple : build simple theme
97+EOF
98+}
99+
100+
101+if [ "$VERBOSE" = "1" ]; then
102+ SPHINX_VERBOSE="-v"
103+ PYLINT_VERBOSE="-v"
104+fi
105+
106+# needed by sphinx-docs
107+export DOCS_BUILD
108+
109+buildenv() {
110+ SEARX_DEBUG=1 pyenv.cmd python utils/build_env.py 2>&1 \
111+ | prefix_stdout "${_Blue}BUILDENV${_creset} "
112+ return "${PIPESTATUS[0]}"
113+}
114+
115+babel.compile() {
116+ build_msg BABEL compile
117+ pyenv.cmd pybabel compile -d "${REPO_ROOT}/searx/translations"
118+ dump_return $?
119+}
120+
121+
122+data.all() {
123+ data.languages
124+ data.useragents
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
131+}
132+
133+
134+data.languages() {
135+ ( set -e
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"
140+ )
141+ dump_return $?
142+}
143+
144+data.useragents() {
145+ build_msg DATA "update searx/data/useragents.json"
146+ pyenv.cmd python searx_extra/update/update_firefox_version.py
147+ dump_return $?
148+}
149+
150+docs.prebuild() {
151+ build_msg DOCS "build ${DOCS_BUILD}/includes"
152+ (
153+ set -e
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"
159+ )
160+ dump_return $?
161+}
162+
163+docker.push() {
164+ docker.build push
165+}
166+
167+# shellcheck disable=SC2119
168+docker.build() {
169+ pyenv.install
170+
171+ build_msg DOCKER build
172+ # run installation in a subprocess and activate pyenv
173+
174+ # See https://www.shellcheck.net/wiki/SC1001 and others ..
175+ # shellcheck disable=SC2031,SC2230,SC2002,SC2236,SC2143,SC1001
176+ ( set -e
177+ # shellcheck source=/dev/null
178+ source "${PY_ENV_BIN}/activate"
179+
180+ # Check if it is a git repository
181+ if [ ! -d .git ]; then
182+ die 1 "This is not Git repository"
183+ fi
184+ if [ ! -x "$(which git)" ]; then
185+ die 1 "git is not installed"
186+ fi
187+
188+ if ! git remote get-url origin 2> /dev/null; then
189+ die 1 "there is no remote origin"
190+ fi
191+
192+ # This is a git repository
193+
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}')
197+
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"
203+ fi
204+
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"
208+
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"
219+ fi
220+
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}"
224+
225+ # build Docker image
226+ build_msg DOCKER "Building image ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
227+ docker build \
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}" .
237+
238+ if [ "$1" = "push" ]; then
239+ docker push "${SEARX_IMAGE_NAME}:latest"
240+ docker push "${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
241+ fi
242+ )
243+ dump_return $?
244+}
245+
246+# shellcheck disable=SC2119
247+gecko.driver() {
248+ pyenv.install
249+
250+ build_msg INSTALL "gecko.driver"
251+ # run installation in a subprocess and activate pyenv
252+ ( set -e
253+ # shellcheck source=/dev/null
254+ source "${PY_ENV_BIN}/activate"
255+
256+ # TODO : check the current geckodriver version
257+ geckodriver -V > /dev/null 2>&1 || NOTFOUND=1
258+ set +e
259+ if [ -z "$NOTFOUND" ]; then
260+ build_msg INSTALL "geckodriver already installed"
261+ return
262+ fi
263+ PLATFORM="$(python3 -c 'import platform; print(platform.system().lower(), platform.architecture()[0])')"
264+ case "$PLATFORM" in
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";;
270+ esac
271+ GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-$ARCH.tar.gz";
272+
273+ build_msg GECKO "Installing ${PY_ENV_BIN}/geckodriver from $GECKODRIVER_URL"
274+
275+ FILE="$(mktemp)"
276+ wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "${PY_ENV_BIN}" -f "$FILE" geckodriver
277+ rm -- "$FILE"
278+ chmod 755 -- "${PY_ENV_BIN}/geckodriver"
279+ )
280+ dump_return $?
281+}
282+
283+node.env() {
284+ local err=0
285+ pushd "${REPO_ROOT}" &> /dev/null
286+ # shellcheck disable=SC2230
287+ which npm &> /dev/null || die 1 'node.env - npm is not found!'
288+
289+ ( set -e
290+ # shellcheck disable=SC2030
291+ PATH="$(npm bin):$PATH"
292+ export PATH
293+
294+ build_msg INSTALL "npm install $NPM_PACKAGES"
295+ # shellcheck disable=SC2086
296+ npm install $NPM_PACKAGES
297+
298+ cd "${REPO_ROOT}/searx/static/themes/oscar"
299+ build_msg INSTALL "($(pwd)) npm install"
300+ npm install
301+
302+ build_msg INSTALL "($(pwd)) npm install"
303+ cd "${REPO_ROOT}/searx/static/themes/simple"
304+ npm install
305+ )
306+ err=$?
307+ popd &> /dev/null
308+ dump_return "$err"
309+}
310+
311+node.clean() {
312+
313+ build_msg CLEAN "locally installed npm dependencies"
314+ rm -rf \
315+ ./node_modules \
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
321+ dump_return $?
322+}
323+
324+py.build() {
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}"
329+}
330+
331+py.clean() {
332+ build_msg CLEAN pyenv
333+ ( set -e
334+ pyenv.drop
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 {} +
340+ )
341+}
342+
343+pyenv.check() {
344+ cat <<EOF
345+import yaml
346+print('import yaml --> OK')
347+EOF
348+}
349+
350+pyenv.install() {
351+
352+ if ! pyenv.OK; then
353+ py.clean > /dev/null
354+ fi
355+ if pyenv.install.OK > /dev/null; then
356+ return 0
357+ fi
358+ ( set -e
359+ pyenv
360+ build_msg PYENV "[install] pip install -e 'searx${PY_SETUP_EXTRAS}'"
361+ "${PY_ENV_BIN}/python" -m pip install -e ".${PY_SETUP_EXTRAS}"
362+ buildenv
363+ ) || die 42 "error while build & install pyenv (${PY_ENV_BIN})"
364+}
365+
366+pyenv.uninstall() {
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] "
370+
371+}
372+
373+pypi.upload() {
374+ py.clean
375+ py.build
376+ # https://github.com/pypa/twine
377+ pyenv.cmd twine upload "${PYDIST}"/*
378+}
379+
380+pypi.upload.test() {
381+ py.clean
382+ py.build
383+ pyenv.cmd twine upload -r testpypi "${PYDIST}"/*
384+}
385+
386+test.pylint() {
387+ # shellcheck disable=SC2086
388+ ( set -e
389+ build_msg TEST "[pylint] \$PYLINT_FILES"
390+ pyenv.cmd python ${PYLINT_OPTIONS} ${PYLINT_VERBOSE} \
391+ "${PYLINT_FILES[@]}"
392+
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}" \
397+ searx/engines
398+
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 \
403+ tests
404+ )
405+ dump_return $?
406+}
407+
408+test.pep8() {
409+ build_msg TEST 'pycodestyle (formerly pep8)'
410+ local _exclude=""
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" \
416+ searx tests
417+ dump_return $?
418+}
419+
420+test.unit() {
421+ build_msg TEST 'tests/unit'
422+ pyenv.cmd python -m nose2 -s tests/unit
423+ dump_return $?
424+}
425+
426+test.coverage() {
427+ build_msg TEST 'unit test coverage'
428+ ( set -e
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
432+ )
433+ dump_return $?
434+}
435+
436+test.robot() {
437+ build_msg TEST 'robot'
438+ gecko.driver
439+ PYTHONPATH=. pyenv.cmd python searx/testing.py robot
440+ dump_return $?
441+}
442+
443+test.clean() {
444+ build_msg CLEAN "test stuff"
445+ rm -rf geckodriver.log .coverage coverage/
446+ dump_return $?
447+}
448+
449+themes.all() {
450+ ( set -e
451+ node.env
452+ themes.oscar
453+ themes.simple
454+ )
455+ dump_return $?
456+}
457+
458+themes.oscar() {
459+ local gruntfile=searx/static/themes/oscar/gruntfile.js
460+ build_msg GRUNT "${gruntfile}"
461+ PATH="$(npm bin):$PATH" grunt --gruntfile "${gruntfile}"
462+ dump_return $?
463+}
464+
465+themes.simple() {
466+ local gruntfile=searx/static/themes/simple/gruntfile.js
467+ build_msg GRUNT "${gruntfile}"
468+ PATH="$(npm bin):$PATH" grunt --gruntfile "${gruntfile}"
469+ dump_return $?
470+}
471+
472+# shellcheck disable=SC2119
473+main() {
474+
475+ local _type
476+ local cmd="$1"; shift
477+
478+ if [ "$cmd" == "" ]; then
479+ help
480+ err_msg "missing command"
481+ return 42
482+ fi
483+
484+ case "$cmd" in
485+ --getenv) var="$1"; echo "${!var}";;
486+ --help) help;;
487+ --*)
488+ help
489+ err_msg "unknown option $cmd"
490+ return 42
491+ ;;
492+ *)
493+ _type="$(type -t "$cmd")"
494+ if [ "$_type" != 'function' ]; then
495+ err_msg "unknown command $1 / use --help"
496+ return 42
497+ else
498+ "$cmd" "$@"
499+ fi
500+ ;;
501+ esac
502+}
503+
504+main "$@"
manage.shdeleted−205
@@ -1,205 +0,0 @@
1−#!/bin/sh
2−
3−export LANG=C
4−
5−BASE_DIR="$(dirname -- "`readlink -f -- "$0"`")"
6−
7−cd -- "$BASE_DIR"
8−set -e
9−
10−# subshell
11−PYTHONPATH="$BASE_DIR"
12−SEARX_DIR="$BASE_DIR/searx"
13−ACTION="$1"
14−
15−. "${BASE_DIR}/utils/brand.env"
16−
17−#
18−# Python
19−#
20−
21−update_packages() {
22− pip install --upgrade pip
23− pip install --upgrade setuptools
24− pip install -Ur "$BASE_DIR/requirements.txt"
25−}
26−
27−update_dev_packages() {
28− update_packages
29− pip install -Ur "$BASE_DIR/requirements-dev.txt"
30−}
31−
32−install_geckodriver() {
33− echo '[!] Checking geckodriver'
34− # TODO : check the current geckodriver version
35− set -e
36− geckodriver -V > /dev/null 2>&1 || NOTFOUND=1
37− set +e
38− if [ -z "$NOTFOUND" ]; then
39− return
40− fi
41− GECKODRIVER_VERSION="v0.28.0"
42− PLATFORM="`python3 -c "import platform; print(platform.system().lower(), platform.architecture()[0])"`"
43− case "$PLATFORM" in
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";;
49− esac
50− GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-$ARCH.tar.gz";
51−
52− if [ -z "$1" ]; then
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"
55− exit
56− else
57− GECKODRIVER_DIR="$VIRTUAL_ENV/bin"
58− fi
59− else
60− GECKODRIVER_DIR="$1"
61− mkdir -p -- "$GECKODRIVER_DIR"
62− fi
63−
64− printf "Installing %s/geckodriver from\n %s" "$GECKODRIVER_DIR" "$GECKODRIVER_URL"
65−
66− FILE="`mktemp`"
67− wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "$GECKODRIVER_DIR" -f "$FILE" geckodriver
68− rm -- "$FILE"
69− chmod 777 -- "$GECKODRIVER_DIR/geckodriver"
70−}
71−
72−locales() {
73− pybabel compile -d "$SEARX_DIR/translations"
74−}
75−
76−
77−#
78−# Web
79−#
80−
81−npm_path_setup() {
82− which npm || (printf 'Error: npm is not found\n'; exit 1)
83− export PATH="$(npm bin)":$PATH
84−}
85−
86−npm_packages() {
87− npm_path_setup
88−
89− echo '[!] install NPM packages'
90− cd -- "$BASE_DIR"
91− npm install less@2.7 less-plugin-clean-css grunt-cli
92−
93− echo '[!] install NPM packages for oscar theme'
94− cd -- "$BASE_DIR/searx/static/themes/oscar"
95− npm install
96−
97− echo '[!] install NPM packages for simple theme'
98− cd -- "$BASE_DIR/searx/static/themes/simple"
99− npm install
100−}
101−
102−docker_build() {
103− # Check if it is a git repository
104− if [ ! -d .git ]; then
105− echo "This is not Git repository"
106− exit 1
107− fi
108−
109− if [ ! -x "$(which git)" ]; then
110− echo "git is not installed"
111− exit 1
112− fi
113−
114− if [ ! git remote get-url origin 2> /dev/null ]; then
115− echo "there is no remote origin"
116− exit 1
117− fi
118−
119− # This is a git repository
120−
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}')
124−
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"
130− fi
131−
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"
135−
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"
145− exit 1
146− fi
147−
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"
151−
152− # build Docker image
153− echo "Building image ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
154− sudo docker build \
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} .
164−
165− if [ "$1" = "push" ]; then
166− sudo docker push ${SEARX_IMAGE_NAME}:latest
167− sudo docker push ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}
168− fi
169−}
170−
171−#
172−# Help
173−#
174−
175−help() {
176− [ -z "$1" ] || printf 'Error: %s\n' "$1"
177− echo "Searx manage.sh help
178−
179−Commands
180−========
181− help - This text
182−
183− Build requirements
184− ------------------
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
189−
190− Build
191− -----
192− locales - Compile locales
193−
194−Environment:
195− GIT_URL: ${GIT_URL}
196− ISSUE_URL: ${ISSUE_URL}
197− SEARX_URL: ${SEARX_URL}
198− DOCS_URL: ${DOCS_URL}
199− PUBLIC_INSTANCES: ${PUBLIC_INSTANCES}
200−"
201−}
202−
203−[ "$(command -V "$ACTION" | grep ' function$')" = "" ] \
204− && help "action not found" \
205− || "$ACTION" "$2"
requirements-dev.txt+17−14
@@ -1,17 +1,20 @@
11mock==4.0.3
22nose2[coverage_plugin]==0.10.0
33cov-core==1.15.0
4−pycodestyle==2.6.0
5−pylint==2.7.2
6−splinter==0.14.0
7−transifex-client==0.14.2
8−selenium==3.141.0
9−twine==3.3.0
10−Pallets-Sphinx-Themes==1.2.3
11−Sphinx==3.5.1
12−sphinx-issues==1.2.0
13−sphinx-jinja==1.1.1
14−sphinx-tabs==2.0.1
15−sphinxcontrib-programoutput==0.16
16−sphinx-autobuild==2020.9.1
17−linuxdoc==20210110
4+pycodestyle==2.8.0
5+pylint==2.12.2
6+splinter==0.17.0
7+transifex-client==0.14.3; python_version < '3.10'
8+transifex-client==0.12.1; python_version == '3.10'
9+selenium==4.1.0
10+twine==3.7.1
11+Pallets-Sphinx-Themes==2.0.2
12+docutils==0.16
13+Sphinx==4.4.0
14+sphinx-issues==3.0.1
15+sphinx-jinja==1.4.0
16+sphinx-tabs==3.2.0
17+sphinxcontrib-programoutput==0.17
18+sphinx-autobuild==2021.3.14
19+linuxdoc==20211220
20+aiounittest==1.4.1
requirements.txt+15−11
@@ -1,12 +1,16 @@
1−certifi==2020.12.05
2−babel==2.9.0
1+certifi==2021.10.8
2+babel==2.9.1
33flask-babel==2.0.0
4−flask==1.1.2
5−idna==2.10
6−jinja2==2.11.3
7−lxml==4.6.2
8−pygments==2.1.3
9−python-dateutil==2.8.1
10−pyyaml==5.4.1
11−requests[socks]==2.25.1
12−langdetect==1.0.8
4+flask==2.0.2
5+jinja2==3.0.3
6+lxml==4.7.1
7+pygments==2.8.0
8+python-dateutil==2.8.2
9+pyyaml==6.0
10+httpx[http2]==0.21.3
11+Brotli==1.0.9
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
15+langdetect==1.0.9
16+setproctitle==1.2.2
searx/answerers/__init__.py+1−1
@@ -32,7 +32,7 @@ def ask(query):
3232 results = []
3333 query_parts = list(filter(None, query.query.split()))
3434
35− if query_parts[0] not in answerers_by_keywords:
35+ if not query_parts or query_parts[0] not in answerers_by_keywords:
3636 return results
3737
3838 for answerer in answerers_by_keywords[query_parts[0]]:
searx/autocomplete.py+36−84
@@ -20,95 +20,36 @@ from lxml import etree
2020from json import loads
2121from urllib.parse import urlencode
2222
23+from httpx import HTTPError
24+
25+
2326from searx import settings
24−from searx.languages import language_codes
25−from searx.engines import (
26− categories, engines, engine_shortcuts
27−)
28−from searx.poolrequests import get as http_get
27+from searx.data import ENGINES_LANGUAGES
28+from searx.network import get as http_get
29+from searx.exceptions import SearxEngineResponseException
2930
3031
3132def get(*args, **kwargs):
3233 if 'timeout' not in kwargs:
3334 kwargs['timeout'] = settings['outgoing']['request_timeout']
34−
35+ kwargs['raise_for_httperror'] = True
3536 return http_get(*args, **kwargs)
3637
3738
38−def searx_bang(full_query):
39− '''check if the searchQuery contain a bang, and create fitting autocompleter results'''
40− # check if there is a query which can be parsed
41− if len(full_query.getQuery()) == 0:
42− return []
39+def brave(query, lang):
40+ # brave search autocompleter
41+ url = 'https://search.brave.com/api/suggest?{query}'
42+
43+ resp = get(url.format(query=urlencode({'q': query})))
4344
4445 results = []
4546
46− # check if current query stats with !bang
47− first_char = full_query.getQuery()[0]
48− if first_char == '!' or first_char == '?':
49− if len(full_query.getQuery()) == 1:
50− # show some example queries
51− # TODO, check if engine is not avaliable
52− results.append(first_char + "images")
53− results.append(first_char + "wikipedia")
54− results.append(first_char + "osm")
55− else:
56− engine_query = full_query.getQuery()[1:]
57−
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))
62−
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(' ', '_')))
67−
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))
72−
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")
81− else:
82− engine_query = full_query.getQuery()[1:]
83−
84− for lc in language_codes:
85− lang_id, lang_name, country, english_name = map(str.lower, lc)
86−
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]))
91− else:
92− results.append(':{lang_id}'.format(lang_id=lang_id))
93−
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))
97−
98− # check if query starts with country
99− if country.startswith(engine_query.replace('_', ' ')):
100− results.append(':{country}'.format(country=country.replace(' ', '_')))
101−
102− # remove duplicates
103− result_set = set(results)
104−
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)
109−
110− # convert result_set back to list
111− return list(result_set)
47+ if resp.ok:
48+ data = loads(resp.text)
49+ for suggestion in data[1]:
50+ results.append(suggestion)
51+
52+ return results
11253
11354
11455def dbpedia(query, lang):
@@ -153,12 +94,11 @@ def google(query, lang):
15394
15495def startpage(query, lang):
15596 # startpage autocompleter
156− url = 'https://startpage.com/do/suggest?{query}'
157−
158− resp = get(url.format(query=urlencode({'query': query}))).text.split('\n')
159− if len(resp) > 1:
160− return resp
161− return []
97+ lui = ENGINES_LANGUAGES['startpage'].get(lang, 'english')
98+ url = 'https://startpage.com/suggestions?{query}'
99+ resp = get(url.format(query=urlencode({'q': query, 'segment': 'startpage.udog', 'lui': lui})))
100+ data = resp.json()
101+ return [e['text'] for e in data.get('suggestions', []) if 'text' in e]
162102
163103
164104def swisscows(query, lang):
@@ -196,7 +136,8 @@ def wikipedia(query, lang):
196136 return []
197137
198138
199−backends = {'dbpedia': dbpedia,
139+backends = {'brave': brave,
140+ 'dbpedia': dbpedia,
200141 'duckduckgo': duckduckgo,
201142 'google': google,
202143 'startpage': startpage,
@@ -204,3 +145,14 @@ backends = {'dbpedia': dbpedia,
204145 'qwant': qwant,
205146 'wikipedia': wikipedia
206147 }
148+
149+
150+def search_autocomplete(backend_name, query, lang):
151+ backend = backends.get(backend_name)
152+ if backend is None:
153+ return []
154+
155+ try:
156+ return backend(query, lang)
157+ except (HTTPError, SearxEngineResponseException):
158+ return []
searx/data/__init__.py+39−14
@@ -1,25 +1,50 @@
1+# SPDX-License-Identifier: AGPL-3.0-or-later
2+# lint: pylint
3+"""This module holds the *data* created by::
4+
5+ make data.all
6+
7+"""
8+
9+__all__ = [
10+ 'ENGINES_LANGUAGES',
11+ 'CURRENCIES',
12+ 'USER_AGENTS',
13+ 'EXTERNAL_URLS',
14+ 'WIKIDATA_UNITS',
15+ 'EXTERNAL_BANGS',
16+ 'OSM_KEYS_TAGS',
17+ 'ahmia_blacklist_loader',
18+]
19+
120import json
221from pathlib import Path
322
4−
5−__init__ = ['ENGINES_LANGUGAGES', 'CURRENCIES', 'USER_AGENTS', 'EXTERNAL_URLS', 'WIKIDATA_UNITS', 'EXTERNAL_BANGS',
6− 'bangs_loader', 'ahmia_blacklist_loader']
723data_dir = Path(__file__).parent
824
925
10−def load(filename):
11− with open(data_dir / filename, encoding='utf-8') as fd:
12− return json.load(fd)
26+def _load(filename):
27+ with open(data_dir / filename, encoding='utf-8') as f:
28+ return json.load(f)
1329
1430
1531def ahmia_blacklist_loader():
16− with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as fd:
17− return fd.read().split()
32+ """Load data from `ahmia_blacklist.txt` and return a list of MD5 values of onion
33+ names. The MD5 values are fetched by::
34+
35+ searx_extra/update/update_ahmia_blacklist.py
36+
37+ This function is used by :py:mod:`searx.plugins.ahmia_filter`.
38+
39+ """
40+ with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as f:
41+ return f.read().split()
1842
1943
20−ENGINES_LANGUAGES = load('engines_languages.json')
21−CURRENCIES = load('currencies.json')
22−USER_AGENTS = load('useragents.json')
23−EXTERNAL_URLS = load('external_urls.json')
24−WIKIDATA_UNITS = load('wikidata_units.json')
25−EXTERNAL_BANGS = load('external_bangs.json')
44+ENGINES_LANGUAGES = _load('engines_languages.json')
45+CURRENCIES = _load('currencies.json')
46+USER_AGENTS = _load('useragents.json')
47+EXTERNAL_URLS = _load('external_urls.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+14388
This diff is too big to show here.
searx/data/currencies.json+347−603
This diff is too big to show here.
searx/data/engines_languages.json+417−1089
This diff is too big to show here.
searx/data/external_bangs.json+5826−5825
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−4
This diff is too big to show here.
searx/data/wikidata_units.json+138−20
This diff is too big to show here.
searx/engines/__init__.py+10−37
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/bandcamp.pynew file+73
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/dictzone.py+1−1
This diff is too big to show here.
searx/engines/duckduckgo.py+97−47
This diff is too big to show here.
searx/engines/duckduckgo_images.py+1−1
This diff is too big to show here.
searx/engines/elasticsearch.py+1−2
This diff is too big to show here.
searx/engines/gigablast.py+25−14
This diff is too big to show here.
searx/engines/google.py+81−54
This diff is too big to show here.
searx/engines/google_images.py+6−7
This diff is too big to show here.
searx/engines/google_news.py+6−7
This diff is too big to show here.
searx/engines/google_scholar.py+4−5
This diff is too big to show here.
searx/engines/google_videos.py+5−6
This diff is too big to show here.
searx/engines/imdb.pynew file+55
This diff is too big to show here.
searx/engines/ina.py+1−3
This diff is too big to show here.
searx/engines/invidious.py+2−2
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/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−78
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.py+1−1
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/seznam.py+23−21
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−20
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+2−2
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−2
This diff is too big to show here.
searx/engines/yahoo.py+93−91
This diff is too big to show here.
searx/engines/yahoo_news.py+73−73
This diff is too big to show here.
searx/engines/yggtorrent.py+3−3
This diff is too big to show here.
searx/engines/youtube_noapi.py+72−8
This diff is too big to show here.
searx/external_urls.py+14−2
This diff is too big to show here.
searx/languages.py+1
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−223
This diff is too big to show here.
searx/preferences.py+8−8
This diff is too big to show here.
searx/query.py+286−118
This diff is too big to show here.
searx/results.py+24−6
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+23−24
This diff is too big to show here.
searx/settings.yml+500−81
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.
searx/testing.py+3−3
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
Binary file not shown.
searx/translations/hr/LC_MESSAGES/messages.po+23−22
This diff is too big to show here.
searx/translations/hu/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/ia/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/it/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/it/LC_MESSAGES/messages.po+23−23
This diff is too big to show here.
searx/translations/ja/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/lt/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/lt/LC_MESSAGES/messages.po+24−24
This diff is too big to show here.
searx/translations/nl/LC_MESSAGES/messages.mo
Binary file not shown.
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
Binary file not shown.
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
Binary file not shown.
searx/translations/pl/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/pt/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/pt_BR/LC_MESSAGES/messages.mo
Binary file not shown.
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
Binary file not shown.
searx/translations/ru/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/ru/LC_MESSAGES/messages.po+22−21
This diff is too big to show here.
searx/translations/sk/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/sl/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/sr/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/sr/LC_MESSAGES/messages.po+24−23
This diff is too big to show here.
searx/translations/sv/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/sv/LC_MESSAGES/messages.po+22−22
This diff is too big to show here.
searx/translations/ta/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/te/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/tr/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/tr/LC_MESSAGES/messages.po+135−134
This diff is too big to show here.
searx/translations/uk/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/vi/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/zh_CN/LC_MESSAGES/messages.mo
Binary file not shown.
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
Binary file not shown.
searx/translations/zh_TW/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/zh_TW/LC_MESSAGES/messages.po+19−18
This diff is too big to show here.
searx/utils.py+13−7
This diff is too big to show here.
searx/version.py+2−2
This diff is too big to show here.
searx/webadapter.py+14−2
This diff is too big to show here.
searx/webapp.py+185−98
This diff is too big to show here.
searx_extra/standalone_searx.py+1−1
This diff is too big to show here.
searx_extra/update/update_engine_descriptions.py+3−3
This diff is too big to show here.
searx_extra/update/update_external_bangs.py+4−4
This diff is too big to show here.
searx_extra/update/update_osm_keys_tags.pynew file+209
This diff is too big to show here.
searx_extra/update/update_pygments.pynew file+138
This diff is too big to show here.
tests/unit/network/__init__.pynew file
No changes to the content.
tests/unit/network/test_network.pynew file+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−6
This diff is too big to show here.
tests/unit/test_poolrequests.pydeleted−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_utils.py+2−2
This diff is too big to show here.
tests/unit/test_webapp.py+14−4
This diff is too big to show here.
utils/filtron.sh+2−2
This diff is too big to show here.
utils/lib.sh+311−4
This diff is too big to show here.
utils/lxc-searx.env+1−2
This diff is too big to show here.
utils/lxc.sh+5−6
This diff is too big to show here.
utils/makefile.include+10−49
This diff is too big to show here.
utils/makefile.pythondeleted−269
This diff is too big to show here.
utils/makefile.sphinxdeleted−199
This diff is too big to show here.
utils/searx.sh+5−5
This diff is too big to show here.
utils/site-python/sphinx_build_tools.pydeleted−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.