on 9485179 help sign in
.github/dependabot.ymldeleted−10
since splitsnapshots
unifiedsplit
@@ -1,10 +0,0 @@
1−# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
2−version: 2
3−updates:
4− - package-ecosystem: "pip"
5− directory: "/"
6− schedule:
7− interval: "weekly"
8− day: "friday"
9− open-pull-requests-limit: 5
10− target-branch: "master"
.github/workflows/data-update.ymldeleted−66
@@ -1,66 +0,0 @@
1−name: "Update searx.data"
2−on:
3− schedule:
4− - cron: "05 06 1 * *"
5− workflow_dispatch:
6−
7−jobs:
8− updateData:
9− name: Update data - ${{ matrix.fetch }}
10− runs-on: ubuntu-20.04
11− if: ${{ github.repository_owner == 'searx'}}
12− strategy:
13− matrix:
14− fetch:
15− - update_ahmia_blacklist.py
16− - update_currencies.py
17− - update_external_bangs.py
18− - update_firefox_version.py
19− - update_languages.py
20− - update_wikidata_units.py
21− steps:
22− - name: Checkout
23− uses: actions/checkout@v2
24−
25− - name: Install Ubuntu packages
26− run: |
27− sudo ./utils/searx.sh install packages
28−
29− - name: Set up Python
30− uses: actions/setup-python@v2
31− with:
32− python-version: '3.10'
33− architecture: 'x64'
34−
35− - name: Install Python dependencies
36− run: |
37− make V=1 install
38−
39− - name: Fetch data
40− env:
41− FETCH_SCRIPT: ./searx_extra/update/${{ matrix.fetch }}
42− run: |
43− V=1 ./manage pyenv.cmd python "$FETCH_SCRIPT"
44−
45− - name: Create Pull Request
46− id: cpr
47− uses: peter-evans/create-pull-request@v3
48− with:
49− token: ${{ secrets.DATA_PR_TOKEN }}
50− commit-message: Update searx.data - ${{ matrix.fetch }}
51− committer: searx-bot <noreply@github.com>
52− author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
53− signoff: false
54− branch: update_data_${{ matrix.fetch }}
55− delete-branch: true
56− draft: false
57− title: 'Update searx.data - ${{ matrix.fetch }}'
58− body: |
59− Update searx.data - ${{ matrix.fetch }}
60− labels: |
61− data
62−
63− - name: Check outputs
64− run: |
65− echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
66− echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
.github/workflows/integration.yml+12−46
@@ -1,19 +1,15 @@
1name: Integration
1name: Integration
2
2
3−on:
4− push:
5− branches: ["master"]
6− pull_request:
3+on: [push, pull_request]
7− branches: ["master"]
8
4
9jobs:
5jobs:
10 python:
6 python:
11 name: Python ${{ matrix.python-version }}
7 name: Python ${{ matrix.python-version }}
12− runs-on: ubuntu-20.04
8+ runs-on: ubuntu-latest
13 strategy:
9 strategy:
14 matrix:
10 matrix:
15− os: [ubuntu-20.04]
11+ os: [ubuntu-latest]
16− python-version: [3.7, 3.8, 3.9, "3.10"]
12+ python-version: [3.5, 3.6, 3.7, 3.8]
17 steps:
13 steps:
18 - name: Checkout
14 - name: Checkout
19 uses: actions/checkout@v2
15 uses: actions/checkout@v2
@@ -38,7 +34,7 @@ jobs:
38 make V=1 install
34 make V=1 install
39 make V=1 gecko.driver
35 make V=1 gecko.driver
40 - name: Run tests
36 - name: Run tests
41− run: make V=1 ci.test
37+ run: make V=1 test
42 - name: Test coverage
38 - name: Test coverage
43 run: make V=1 test.coverage
39 run: make V=1 test.coverage
44 - name: Store coverage result
40 - name: Store coverage result
@@ -50,60 +46,41 @@ jobs:
50
46
51 themes:
47 themes:
52 name: Themes
48 name: Themes
53− runs-on: ubuntu-20.04
49+ runs-on: ubuntu-latest
54 steps:
50 steps:
55 - name: Checkout
51 - name: Checkout
56 uses: actions/checkout@v2
52 uses: actions/checkout@v2
57 - name: Install Ubuntu packages
53 - name: Install Ubuntu packages
58 run: sudo ./utils/searx.sh install packages
54 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') }}
70 - name: Install node dependencies
55 - name: Install node dependencies
71 run: make V=1 node.env
56 run: make V=1 node.env
72 - name: Build themes
57 - name: Build themes
73− run: make V=1 themes.all
58+ run: make V=1 themes
74
59
75 documentation:
60 documentation:
76 name: Documentation
61 name: Documentation
77− runs-on: ubuntu-20.04
62+ runs-on: ubuntu-latest
78 steps:
63 steps:
79 - name: Checkout
64 - name: Checkout
80 uses: actions/checkout@v2
65 uses: actions/checkout@v2
81 with:
66 with:
82− fetch-depth: '0'
83 persist-credentials: false
67 persist-credentials: false
84 - name: Install Ubuntu packages
68 - name: Install Ubuntu packages
85 run: sudo ./utils/searx.sh install buildhost
69 run: sudo ./utils/searx.sh install buildhost
86 - name: Set up Python
70 - name: Set up Python
87 uses: actions/setup-python@v2
71 uses: actions/setup-python@v2
88 with:
72 with:
89− python-version: '3.10'
73+ python-version: '3.9'
90 architecture: 'x64'
74 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') }}
97 - name: Build documentation
75 - name: Build documentation
98− run: |
76+ run: SEARX_DEBUG=1 make V=1 travis-gh-pages
99− make V=1 docs.clean docs.html
100 - name: Deploy
77 - name: Deploy
101 if: github.ref == 'refs/heads/master'
78 if: github.ref == 'refs/heads/master'
102 uses: JamesIves/github-pages-deploy-action@3.7.1
79 uses: JamesIves/github-pages-deploy-action@3.7.1
103 with:
80 with:
104 GITHUB_TOKEN: ${{ github.token }}
81 GITHUB_TOKEN: ${{ github.token }}
105 BRANCH: gh-pages
82 BRANCH: gh-pages
106− FOLDER: dist/docs
83+ FOLDER: gh-pages
107 CLEAN: true # Automatically remove deleted files from the deploy branch
84 CLEAN: true # Automatically remove deleted files from the deploy branch
108
85
109 dockers:
86 dockers:
@@ -115,7 +92,7 @@ jobs:
115 - documentation
92 - documentation
116 env:
93 env:
117 DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
94 DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
118− runs-on: ubuntu-20.04
95+ runs-on: ubuntu-latest
119 steps:
96 steps:
120 - name: Checkout
97 - name: Checkout
121 if: env.DOCKERHUB_USERNAME != null
98 if: env.DOCKERHUB_USERNAME != null
@@ -123,17 +100,6 @@ jobs:
123 with:
100 with:
124 # make sure "make docker.push" can get the git history
101 # make sure "make docker.push" can get the git history
125 fetch-depth: '0'
102 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') }}
137 - name: Set up QEMU
103 - name: Set up QEMU
138 if: env.DOCKERHUB_USERNAME != null
104 if: env.DOCKERHUB_USERNAME != null
139 uses: docker/setup-qemu-action@v1
105 uses: docker/setup-qemu-action@v1
.gitignore−2
@@ -26,5 +26,3 @@ dist/
26local/
26local/
27gh-pages/
27gh-pages/
28searx.egg-info/
28searx.egg-info/
29−.env
30−geckodriver.log
.pylintrc+1−1
@@ -59,7 +59,7 @@ confidence=
59# --enable=similarities". If you want to run only the classes checker, but have
59# --enable=similarities". If you want to run only the classes checker, but have
60# no Warning level messages displayed, use"--disable=all --enable=classes
60# no Warning level messages displayed, use"--disable=all --enable=classes
61# --disable=W"
61# --disable=W"
62−disable=bad-whitespace, duplicate-code, consider-using-f-string
62+disable=bad-whitespace, duplicate-code
63
63
64# Enable the message, report, category or checker with the given id(s). You can
64# Enable the message, report, category or checker with the given id(s). You can
65# either give multiple identifier separated by comma (,) or put this option
65# either give multiple identifier separated by comma (,) or put this option
AUTHORS.rst+6−15
@@ -1,4 +1,4 @@
1−Searx was created by Adam Tauber and is maintained by Adam Tauber, Noémi Ványi, @pofilo, Gaspard d'Hautefeuille and Émilien Devos.
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.
2
2
3Major contributing authors:
3Major contributing authors:
4
4
@@ -12,9 +12,8 @@ Major contributing authors:
12- @pofilo
12- @pofilo
13- Markus Heiser @return42
13- Markus Heiser @return42
14- Émilien Devos @unixfox
14- Émilien Devos @unixfox
15−- Alexandre Flament
16
15
17−People who have submitted patches/translations, reported bugs, consulted features or
16+People who have submitted patches/translates, reported bugs, consulted features or
18generally made searx better:
17generally made searx better:
19
18
20- Laszlo Hammerl
19- Laszlo Hammerl
@@ -67,6 +66,7 @@ generally made searx better:
67- @firebovine
66- @firebovine
68- Lorenzo J. Lucchini @luccoj
67- Lorenzo J. Lucchini @luccoj
69- @eig8phei
68- @eig8phei
69+- Joachim Cherqui
70- @maxigas
70- @maxigas
71- Jannik Winkel @kiney
71- Jannik Winkel @kiney
72- @juanitobananas
72- @juanitobananas
@@ -154,15 +154,6 @@ generally made searx better:
154- @mrwormo
154- @mrwormo
155- Xiaoyu WEI @xywei
155- Xiaoyu WEI @xywei
156- @joshu9h
156- @joshu9h
157−- Daniel Hones
157+
158−- @cyclaero
158+
159−- @thezeroalpha
159+
160−- @Tobi823
161−- @archiecodes
162−- @BBaoVanC
163−- @datagram1
164−- @lucky13820
165−- @jhigginbotham
166−- @xenrox
167−- @OliveiraHermogenes
168−- Paul Alcock @Guilvareux
CHANGELOG.rst+3−156
@@ -1,156 +1,3 @@
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−
1540.18.0 2020.12.14
10.18.0 2020.12.14
155=================
2=================
156
3
@@ -181,7 +28,7 @@ New settings.yml
181- ``server.method: "POST"`` - Make default query submission method configurable ( #2130 )
28- ``server.method: "POST"`` - Make default query submission method configurable ( #2130 )
182- ``server.default_http_headers`` - add default http headers ( #2295 )
29- ``server.default_http_headers`` - add default http headers ( #2295 )
183- ``engines.*.proxies`` - Using proxy only for specific engines ( #1827 #2319 ), see https://searx.github.io/searx/dev/engine_overview.html#settings-yml
30- ``engines.*.proxies`` - Using proxy only for specific engines ( #1827 #2319 ), see https://searx.github.io/searx/dev/engine_overview.html#settings-yml
184−- ``enabled_plugins`` - Enabled plugins ( a05c660e3036ad8d02072fc6731af54c2ed6151c )
31+- ``enabled_plugins`` - Enabled plugins ( a05c660e3036ad8d02072fc6731af54c2ed6151c )
185- ``preferences.lock`` - Let admins lock user preferences ( #2270 )
32- ``preferences.lock`` - Let admins lock user preferences ( #2270 )
186
33
187Oscar theme
34Oscar theme
@@ -191,10 +38,10 @@ Oscar theme
191
38
192 - Make infoboxes shorter by default.
39 - Make infoboxes shorter by default.
193 - Hide the main image by default as well and set a maximum height even when expanded.
40 - Hide the main image by default as well and set a maximum height even when expanded.
194− - Add a toggle at the bottom of the infobox to expand it or to shrink it again.
41+ - Add a toggle at the bottom of the infobox to expand it or to shrink it again.
195 - Fix pointhi style
42 - Fix pointhi style
196- query suggestion does not keep the language tag of the original query ( #1314 )
43- query suggestion does not keep the language tag of the original query ( #1314 )
197−- fix the clear button ( #2306 )
44+- fix the clear button ( #2306 )
198
45
199Simple theme
46Simple theme
200~~~~~~~~~~~~
47~~~~~~~~~~~~
Dockerfile+15−17
@@ -1,22 +1,29 @@
1−FROM alpine:3.15
1+FROM alpine:3.12
2ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
2ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
3EXPOSE 8080
3EXPOSE 8080
4VOLUME /etc/searx
4VOLUME /etc/searx
5VOLUME /var/log/uwsgi
5VOLUME /var/log/uwsgi
6
6
7+ARG GIT_URL=unknown
8+ARG VERSION_GITCOMMIT=unknown
9+ARG SEARX_GIT_VERSION=unknown
10+
7ARG SEARX_GID=977
11ARG SEARX_GID=977
8ARG SEARX_UID=977
12ARG SEARX_UID=977
9
13
10RUN addgroup -g ${SEARX_GID} searx && \
14RUN addgroup -g ${SEARX_GID} searx && \
11 adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
15 adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
12
16
17+ARG TIMESTAMP_SETTINGS=0
18+ARG TIMESTAMP_UWSGI=0
19+ARG LABEL_VCS_REF=
20+ARG LABEL_VCS_URL=
21+
13ENV INSTANCE_NAME=searx \
22ENV INSTANCE_NAME=searx \
14 AUTOCOMPLETE= \
23 AUTOCOMPLETE= \
15 BASE_URL= \
24 BASE_URL= \
16 MORTY_KEY= \
25 MORTY_KEY= \
17− MORTY_URL= \
26+ MORTY_URL=
18− SEARX_SETTINGS_PATH=/etc/searx/settings.yml \
19− UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
20
27
21WORKDIR /usr/local/searx
28WORKDIR /usr/local/searx
22
29
@@ -46,19 +53,14 @@ RUN apk upgrade --no-cache \
46 uwsgi \
53 uwsgi \
47 uwsgi-python3 \
54 uwsgi-python3 \
48 brotli \
55 brotli \
49− && pip3 install --upgrade pip wheel setuptools \
56+ && pip3 install --upgrade pip \
50 && pip3 install --no-cache -r requirements.txt \
57 && pip3 install --no-cache -r requirements.txt \
51 && apk del build-dependencies \
58 && apk del build-dependencies \
52 && rm -rf /root/.cache
59 && rm -rf /root/.cache
53
60
54−COPY searx ./searx
61+COPY --chown=searx:searx . .
55−COPY dockerfiles ./dockerfiles
56
62
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; \
63+RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \
62 touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
64 touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
63 touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
65 touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
64 if [ ! -z $VERSION_GITCOMMIT ]; then\
66 if [ ! -z $VERSION_GITCOMMIT ]; then\
@@ -68,12 +70,8 @@ RUN /usr/bin/python3 -m compileall -q searx; \
68 -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
70 -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
69 -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
71 -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
70
72
71−# Keep these arguments at the end to prevent redundant layer rebuilds
73+# Keep this argument at the end since it change each time
72ARG LABEL_DATE=
74ARG LABEL_DATE=
73−ARG GIT_URL=unknown
74−ARG SEARX_GIT_VERSION=unknown
75−ARG LABEL_VCS_REF=
76−ARG LABEL_VCS_URL=
77LABEL maintainer="searx <${GIT_URL}>" \
75LABEL maintainer="searx <${GIT_URL}>" \
78 description="A privacy-respecting, hackable metasearch engine." \
76 description="A privacy-respecting, hackable metasearch engine." \
79 version="${SEARX_GIT_VERSION}" \
77 version="${SEARX_GIT_VERSION}" \
Makefile+213−79
@@ -1,107 +1,241 @@
1# -*- coding: utf-8; mode: makefile-gmake -*-
1# -*- coding: utf-8; mode: makefile-gmake -*-
2−# SPDX-License-Identifier: AGPL-3.0-or-later
3−
4.DEFAULT_GOAL=help
2.DEFAULT_GOAL=help
5−export MTOOLS=./manage
6
3
7include utils/makefile.include
4include utils/makefile.include
8
5
9−all: clean install
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
10+PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES := supported_languages,language_aliases
10
11
11−PHONY += help
12+include utils/makefile.python
13+include utils/makefile.sphinx
12
14
13−help:
15+all: clean install
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'
24
16
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
45+
46+PHONY += install
47+install: buildenv pyenvinstall
48+
49+PHONY += uninstall
50+uninstall: pyenvuninstall
51+
52+PHONY += clean
53+clean: pyclean docs-clean node.clean test.clean
54+ $(call cmd,common_clean)
25
55
26PHONY += run
56PHONY += run
27−run: install
57+run: buildenv pyenvinstall
28 $(Q) ( \
58 $(Q) ( \
29 sleep 2 ; \
59 sleep 2 ; \
30 xdg-open http://127.0.0.1:8888/ ; \
60 xdg-open http://127.0.0.1:8888/ ; \
31 ) &
61 ) &
32− SEARX_DEBUG=1 ./manage pyenv.cmd python ./searx/webapp.py
62+ SEARX_DEBUG=1 $(PY_ENV)/bin/python ./searx/webapp.py
33
63
34−PHONY += install uninstall
64+# docs
35−install uninstall:
65+# ----
36− $(Q)./manage pyenv.$@
37
66
67+sphinx-doc-prebuilds:: buildenv pyenvinstall prebuild-includes
68+
38−PHONY += clean
69+PHONY += docs
39−clean: py.clean docs.clean node.clean test.clean
70+docs: sphinx-doc-prebuilds
40− $(Q)./manage build_msg CLEAN "common files"
71+ $(call cmd,sphinx,html,docs,docs)
41− $(Q)find . -name '*.orig' -exec rm -f {} +
72+
42− $(Q)find . -name '*.rej' -exec rm -f {} +
73+PHONY += docs-live
43− $(Q)find . -name '*~' -exec rm -f {} +
74+docs-live: sphinx-doc-prebuilds
44− $(Q)find . -name '*.bak' -exec rm -f {} +
75+ $(call cmd,sphinx_autobuild,html,docs,docs)
45−
76+
46−PHONY += search.checker search.checker.%
77+PHONY += prebuild-includes
47−search.checker: install
78+prebuild-includes:
48− $(Q)./manage pyenv.cmd searx-checker -v
79+ $(Q)mkdir -p $(DOCS_BUILD)/includes
49−
80+ $(Q)./utils/searx.sh doc | cat > $(DOCS_BUILD)/includes/searx.rst
50−search.checker.%: install
81+ $(Q)./utils/filtron.sh doc | cat > $(DOCS_BUILD)/includes/filtron.rst
51− $(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
82+ $(Q)./utils/morty.sh doc | cat > $(DOCS_BUILD)/includes/morty.rst
52−
83+
53−PHONY += ci.test test test.sh
84+
54−ci.test: test.pep8 test.pylint test.unit test.robot
85+$(GH_PAGES)::
55−test: ci.test
86+ @echo "doc available at --> $(DOCS_URL)"
56−test.sh:
87+
57− $(Q)shellcheck -x -s bash \
88+# update project files
58− utils/brand.env \
89+# --------------------
59− ./manage \
90+
60− utils/lib.sh \
91+PHONY += project engines.languages useragents.update buildenv
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"
68
92
93+project: buildenv useragents.update engines.languages
69
94
70−# wrap ./manage script
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
71
102
72−MANAGE += buildenv
103+useragents.update: pyenvinstall
73−MANAGE += babel.compile
104+ $(Q)echo "Update searx/data/useragents.json with the most recent versions of Firefox."
74−MANAGE += data.all data.languages data.useragents
105+ $(Q)$(PY_ENV_ACT); python utils/fetch_firefox_version.py
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
84
106
85−PHONY += $(MANAGE)
107+buildenv: pyenv
108+ $(Q)$(PY_ENV_ACT); SEARX_DEBUG=1 python utils/build_env.py
86
109
87−$(MANAGE):
110+# node / npm
88− $(Q)$(MTOOLS) $@
111+# ----------
89
112
90−# deprecated
113+node.env: buildenv
114+ $(Q)./manage.sh npm_packages
91
115
92−PHONY += docs docs-clean docs-live docker themes
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
93
125
94−docs: docs.html
126+# build themes
95− $(Q)./manage build_msg WARN $@ is deprecated use docs.html
127+# ------------
96
128
97−docs-clean: docs.clean
129+PHONY += themes.bootstrap themes themes.oscar themes.simple
98− $(Q)./manage build_msg WARN $@ is deprecated use docs.clean
130+themes: buildenv themes.bootstrap themes.oscar themes.simple
99
131
100−docs-live: docs.live
132+quiet_cmd_lessc = LESSC $3
101− $(Q)./manage build_msg WARN $@ is deprecated use docs.live
133+ cmd_lessc = PATH="$$(npm bin):$$PATH" \
134+ lessc --clean-css="--s1 --advanced --compatibility=ie9" "searx/static/$2" "searx/static/$3"
102
135
103−docker: docker.build
136+quiet_cmd_grunt = GRUNT $2
104− $(Q)./manage build_msg WARN $@ is deprecated use docker.build
137+ cmd_grunt = PATH="$$(npm bin):$$PATH" \
138+ grunt --gruntfile "$2"
105
139
106−themes: themes.all
140+themes.oscar: node.env
107− $(Q)./manage build_msg WARN $@ is deprecated use themes.all
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+# test
170+# ----
171+
172+PHONY += test test.sh test.pylint test.pep8 test.unit test.coverage test.robot
173+test: buildenv test.pylint test.pep8 test.unit gecko.driver test.robot
174+
175+PYLINT_FILES=\
176+ searx/preferences.py \
177+ searx/testing.py \
178+ searx/engines/gigablast.py \
179+ searx/engines/deviantart.py \
180+ searx/engines/digg.py
181+
182+test.pylint: pyenvinstall
183+ $(call cmd,pylint,$(PYLINT_FILES))
184+ $(call cmd,pylint,\
185+ --disable=$(PYLINT_SEARX_DISABLE_OPTION) \
186+ --additional-builtins=$(PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES) \
187+ searx/engines \
188+ )
189+ $(call cmd,pylint,\
190+ --disable=$(PYLINT_SEARX_DISABLE_OPTION) \
191+ --ignore=searx/engines \
192+ searx tests \
193+ )
194+
195+# ignored rules:
196+# E402 module level import not at top of file
197+# W503 line break before binary operator
198+
199+# ubu1604: uses shellcheck v0.3.7 (from 04/2015), no longer supported!
200+test.sh:
201+ shellcheck -x -s bash utils/brand.env
202+ shellcheck -x utils/lib.sh
203+ shellcheck -x utils/filtron.sh
204+ shellcheck -x utils/searx.sh
205+ shellcheck -x utils/morty.sh
206+ shellcheck -x utils/lxc.sh
207+ shellcheck -x utils/lxc-searx.env
208+ shellcheck -x .config.sh
209+
210+test.pep8: pyenvinstall
211+ @echo "TEST pycodestyle (formerly pep8)"
212+ $(Q)$(PY_ENV_ACT); pycodestyle --exclude='searx/static, searx/languages.py, $(foreach f,$(PYLINT_FILES),$(f),)' \
213+ --max-line-length=120 --ignore "E117,E252,E402,E722,E741,W503,W504,W605" searx tests
214+
215+test.unit: pyenvinstall
216+ @echo "TEST tests/unit"
217+ $(Q)$(PY_ENV_ACT); python -m nose2 -s tests/unit
218+
219+test.coverage: pyenvinstall
220+ @echo "TEST unit test coverage"
221+ $(Q)$(PY_ENV_ACT); \
222+ python -m nose2 -C --log-capture --with-coverage --coverage searx -s tests/unit \
223+ && coverage report \
224+ && coverage html \
225+
226+test.robot: pyenvinstall gecko.driver
227+ @echo "TEST robot"
228+ $(Q)$(PY_ENV_ACT); PYTHONPATH=. python searx/testing.py robot
229+
230+test.clean:
231+ @echo "CLEAN intermediate test stuff"
232+ $(Q)rm -rf geckodriver.log .coverage coverage/
233+
234+
235+# travis
236+# ------
237+
238+travis.codecov:
239+ $(Q)$(PY_ENV_BIN)/python -m pip install codecov
240+
241+.PHONY: $(PHONY)
README.rst+2−2
@@ -17,7 +17,7 @@
17|OpenCollective searx backers|
17|OpenCollective searx backers|
18|OpenCollective searx sponsors|
18|OpenCollective searx sponsors|
19
19
20−Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **sɜːks**.
20+Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **səːks**.
21
21
22.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
22.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
23
23
@@ -61,7 +61,7 @@ our homepage_.
61.. _homepage: https://searx.github.io/searx
61.. _homepage: https://searx.github.io/searx
62
62
63contact:
63contact:
64− openhub_ // twitter_ // IRC: #searx @ Libera (irc.libera.chat)
64+ openhub_ // twitter_ // IRC: #searx @ freenode
65
65
66.. _openhub: https://www.openhub.net/p/searx
66.. _openhub: https://www.openhub.net/p/searx
67.. _twitter: https://twitter.com/Searx_engine
67.. _twitter: https://twitter.com/Searx_engine
dockerfiles/docker-entrypoint.sh+3
@@ -24,6 +24,9 @@ if [ -z "${BIND_ADDRESS}" ]; then
24 export BIND_ADDRESS="${DEFAULT_BIND_ADDRESS}"
24 export BIND_ADDRESS="${DEFAULT_BIND_ADDRESS}"
25fi
25fi
26
26
27+export UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
28+export SEARX_SETTINGS_PATH=/etc/searx/settings.yml
29+
27# Parse special command line
30# Parse special command line
28# see docs/admin/installation-docker.rst
31# see docs/admin/installation-docker.rst
29# display the help message without the version
32# display the help message without the version
dockerfiles/uwsgi.ini−3
@@ -42,6 +42,3 @@ static-map = /static=/usr/local/searx/searx/static
42static-expires = /* 864000
42static-expires = /* 864000
43static-gzip-all = True
43static-gzip-all = True
44offload-threads = %k
44offload-threads = %k
45−
46−# Cache
47−cache2 = name=searxcache,items=2000,blocks=2000,blocksize=4096,bitmap=1
docs/admin/buildhosts.rst+4−4
@@ -49,9 +49,9 @@ Build docs
49 - dvisvgm_
49 - dvisvgm_
50
50
51Most of the sphinx requirements are installed from :origin:`setup.py` and the
51Most of the sphinx requirements are installed from :origin:`setup.py` and the
52−docs can be build from scratch with ``make docs.html``. For better math and
52+docs can be build from scratch with ``make docs``. For better math and image
53−image processing additional packages are needed. The XeTeX_ needed not only for
53+processing additional packages are needed. The XeTeX_ needed not only for PDF
54−PDF creation, its also needed for :ref:`math` when HTML output is build.
54+creation, its also needed for :ref:`math` when HTML output is build.
55
55
56To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
56To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
57as images (``sphinx.ext.imgmath`` extension).
57as images (``sphinx.ext.imgmath`` extension).
@@ -64,7 +64,7 @@ to ``imgmath``:
64 :start-after: # sphinx.ext.imgmath setup
64 :start-after: # sphinx.ext.imgmath setup
65 :end-before: # sphinx.ext.imgmath setup END
65 :end-before: # sphinx.ext.imgmath setup END
66
66
67−If your docs build (``make docs.html``) shows warnings like this::
67+If your docs build (``make docs``) shows warnings like this::
68
68
69 WARNING: dot(1) not found, for better output quality install \
69 WARNING: dot(1) not found, for better output quality install \
70 graphviz from https://www.graphviz.org
70 graphviz from https://www.graphviz.org
docs/admin/filtron.rst+1−1
@@ -173,7 +173,7 @@ Use it along with ``nginx`` with the following example configuration.
173 location /searx {
173 location /searx {
174 proxy_pass http://127.0.0.1:4004/;
174 proxy_pass http://127.0.0.1:4004/;
175
175
176− proxy_set_header Host $host;
176+ proxy_set_header Host $http_host;
177 proxy_set_header Connection $http_connection;
177 proxy_set_header Connection $http_connection;
178 proxy_set_header X-Real-IP $remote_addr;
178 proxy_set_header X-Real-IP $remote_addr;
179 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
179 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
docs/admin/installation-apache.rst+7−8
@@ -180,6 +180,10 @@ modules and create a `Location`_ configuration for the searx site. In most
180distributions you have to un-comment the lines in the main configuration file,
180distributions you have to un-comment the lines in the main configuration file,
181except in :ref:`The Debian Layout`.
181except in :ref:`The Debian Layout`.
182
182
183+To pass the HTTP HOST header
184+With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
185+proxied host.
186+
183.. tabs::
187.. tabs::
184
188
185 .. group-tab:: Ubuntu / debian
189 .. group-tab:: Ubuntu / debian
@@ -227,11 +231,6 @@ except in :ref:`The Debian Layout`.
227 LoadModule proxy_module modules/mod_proxy.so
231 LoadModule proxy_module modules/mod_proxy.so
228 LoadModule proxy_http_module modules/mod_proxy_http.so
232 LoadModule proxy_http_module modules/mod_proxy_http.so
229
233
230−With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
231−proxied host.
232−
233−.. _apache searx via filtron plus morty:
234−
235.. tabs::
234.. tabs::
236
235
237 .. group-tab:: searx via filtron plus morty
236 .. group-tab:: searx via filtron plus morty
@@ -286,15 +285,15 @@ proxied host.
286
285
287 </Location>
286 </Location>
288
287
288+ Note that reverse proxy advised to be used in case of single-user or
289− For a fully result proxification add :ref:`morty's <searx morty>` **public
289+ low-traffic instances. For a fully result proxification add :ref:`morty's
290− URL** to your :origin:`searx/settings.yml`:
290+ <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
291
291
292 .. code:: yaml
292 .. code:: yaml
293
293
294 result_proxy:
294 result_proxy:
295 # replace example.org with your server's public name
295 # replace example.org with your server's public name
296 url : https://example.org/morty
296 url : https://example.org/morty
297− key : !!binary "insert_your_morty_proxy_key_here"
298
297
299 server:
298 server:
300 image_proxy : True
299 image_proxy : True
docs/admin/installation-docker.rst+1−1
@@ -51,7 +51,7 @@ It's also possible to build searx from the embedded Dockerfile.
51
51
52 git clone https://github.com/searx/searx.git
52 git clone https://github.com/searx/searx.git
53 cd searx
53 cd searx
54− make docker.build
54+ make docker
55
55
56
56
57Public instance
57Public instance
docs/admin/installation-nginx.rst+12−14
@@ -163,8 +163,6 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
163 Create configuration at ``/etc/nginx/conf.d/searx`` and place a
163 Create configuration at ``/etc/nginx/conf.d/searx`` and place a
164 symlink to sites-enabled:
164 symlink to sites-enabled:
165
165
166−.. _nginx searx via filtron plus morty:
167−
168.. tabs::
166.. tabs::
169
167
170 .. group-tab:: searx via filtron plus morty
168 .. group-tab:: searx via filtron plus morty
@@ -182,7 +180,7 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
182 location /searx {
180 location /searx {
183 proxy_pass http://127.0.0.1:4004/;
181 proxy_pass http://127.0.0.1:4004/;
184
182
185− proxy_set_header Host $host;
183+ proxy_set_header Host $http_host;
186 proxy_set_header Connection $http_connection;
184 proxy_set_header Connection $http_connection;
187 proxy_set_header X-Real-IP $remote_addr;
185 proxy_set_header X-Real-IP $remote_addr;
188 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
186 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -190,8 +188,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
190 proxy_set_header X-Script-Name /searx;
188 proxy_set_header X-Script-Name /searx;
191 }
189 }
192
190
193− location /searx/static/ {
191+ location /searx/static {
194− alias /usr/local/searx/searx-src/searx/static/;
192+ alias /usr/local/searx/searx-src/searx/static;
195 }
193 }
196
194
197
195
@@ -205,28 +203,28 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
205 location /morty {
203 location /morty {
206 proxy_pass http://127.0.0.1:3000/;
204 proxy_pass http://127.0.0.1:3000/;
207
205
208− proxy_set_header Host $host;
206+ proxy_set_header Host $http_host;
209 proxy_set_header Connection $http_connection;
207 proxy_set_header Connection $http_connection;
210 proxy_set_header X-Real-IP $remote_addr;
208 proxy_set_header X-Real-IP $remote_addr;
211 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
209 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
212 proxy_set_header X-Scheme $scheme;
210 proxy_set_header X-Scheme $scheme;
213 }
211 }
214
212
213+ Note that reverse proxy advised to be used in case of single-user or
215− For a fully result proxification add :ref:`morty's <searx morty>` **public
214+ low-traffic instances. For a fully result proxification add :ref:`morty's
216− URL** to your :origin:`searx/settings.yml`:
215+ <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
217
216
218 .. code:: yaml
217 .. code:: yaml
219
218
220 result_proxy:
219 result_proxy:
221 # replace example.org with your server's public name
220 # replace example.org with your server's public name
222 url : https://example.org/morty
221 url : https://example.org/morty
223− key : !!binary "insert_your_morty_proxy_key_here"
224
222
225 server:
223 server:
226 image_proxy : True
224 image_proxy : True
227
225
228
226
229− .. group-tab:: proxy or uWSGI
227+ .. group-tab:: proxy or uWSGI
230
228
231 Be warned, with this setup, your instance isn't :ref:`protected <searx
229 Be warned, with this setup, your instance isn't :ref:`protected <searx
232 filtron>`. Nevertheless it is good enough for intranet usage and it is a
230 filtron>`. Nevertheless it is good enough for intranet usage and it is a
@@ -309,8 +307,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
309 proxy_buffering off;
307 proxy_buffering off;
310 }
308 }
311
309
312− location /searx/static/ {
310+ location /searx/static {
313− alias /usr/local/searx/searx-src/searx/static/;
311+ alias /usr/local/searx/searx-src/searx/static;
314 }
312 }
315
313
316 The ``X-Script-Name /searx`` is needed by the searx implementation to
314 The ``X-Script-Name /searx`` is needed by the searx implementation to
@@ -328,8 +326,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
328 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
326 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
329 }
327 }
330
328
331− location /searx/static/ {
329+ location /searx/static {
332− alias /usr/local/searx/searx-src/searx/;
330+ alias /usr/local/searx/searx-src/searx;
333 }
331 }
334
332
335 For searx to work correctly the ``base_url`` must be set in the
333 For searx to work correctly the ``base_url`` must be set in the
docs/admin/installation-searx.rst+4−11
@@ -61,7 +61,7 @@ from the login (*~/.profile*):
61
61
62.. tip::
62.. tip::
63
63
64− Open a second terminal for the configuration tasks and leave the ``(searx)$``
64+ Open a second terminal for the configuration tasks and left the ``(searx)$``
65 terminal open for the tasks below.
65 terminal open for the tasks below.
66
66
67
67
@@ -70,20 +70,13 @@ from the login (*~/.profile*):
70Configuration
70Configuration
71=============
71=============
72
72
73−.. sidebar:: ``use_default_settings: True``
74−
75− - :ref:`settings global`
76− - :ref:`settings location`
77− - :ref:`settings use_default_settings`
78− - :origin:`/etc/searx/settings.yml <utils/templates/etc/searx/use_default_settings.yml>`
79−
80To create a initial ``/etc/searx/settings.yml`` you can start with a copy of the
73To create a initial ``/etc/searx/settings.yml`` you can start with a copy of the
81file :origin:`utils/templates/etc/searx/use_default_settings.yml`. This setup
74file :origin:`utils/templates/etc/searx/use_default_settings.yml`. This setup
82−:ref:`use default settings <settings use_default_settings>` from
75+:option:ref:`use default settings <settings use_default_settings>` from
83:origin:`searx/settings.yml` and is recommended since :pull:`2291` is merged.
76:origin:`searx/settings.yml` and is recommended since :pull:`2291` is merged.
84
77
85−For a *minimal setup*, configure like shown below – replace ``searx@$(uname
78+For minimal Setup, configure like shown below – replace ``searx@\$(uname -n)``
86−-n)`` with a name of your choice, set ``ultrasecretkey`` -- *and/or* edit
79+with a name of your choice, set ``ultrasecretkey`` -- *and/or* edit
87``/etc/searx/settings.yml`` to your needs.
80``/etc/searx/settings.yml`` to your needs.
88
81
89.. kernel-include:: $DOCS_BUILD/includes/searx.rst
82.. kernel-include:: $DOCS_BUILD/includes/searx.rst
docs/admin/installation.rst+1−6
@@ -39,18 +39,13 @@ install from ``root``, take into account that the scripts are creating a
39these new created users do need read access to the clone of searx, which is not
39these new created users do need read access to the clone of searx, which is not
40the case if you clone into a folder below ``/root``.
40the case if you clone into a folder below ``/root``.
41
41
42+
42.. code:: bash
43.. code:: bash
43
44
44 $ cd ~/Downloads
45 $ cd ~/Downloads
45 $ git clone https://github.com/searx/searx searx
46 $ git clone https://github.com/searx/searx searx
46 $ cd searx
47 $ cd searx
47
48
48−.. sidebar:: further read
49−
50− - :ref:`toolboxing`
51− - :ref:`update searx`
52− - :ref:`inspect searx`
53−
54**Install** :ref:`searx service <searx.sh>`
49**Install** :ref:`searx service <searx.sh>`
55
50
56This installs searx as described in :ref:`installation basic`.
51This installs searx as described in :ref:`installation basic`.
docs/admin/morty.rst+4−11
@@ -16,22 +16,15 @@ By default searx can only act as an image proxy for result images, but it is
16possible to proxify all the result URLs with an external service, morty_.
16possible to proxify all the result URLs with an external service, morty_.
17
17
18To use this feature, morty has to be installed and activated in searx's
18To use this feature, morty has to be installed and activated in searx's
19+``settings.yml``.
20+
19−``settings.yml``. Add the following snippet to your ``settings.yml`` and
21+Add the following snippet to your ``settings.yml`` and restart searx:
20−restart searx:
21
22
22.. code:: yaml
23.. code:: yaml
23
24
24 result_proxy:
25 result_proxy:
25 url : http://127.0.0.1:3000/
26 url : http://127.0.0.1:3000/
26− key : !!binary "insert_your_morty_proxy_key_here"
27+ key : your_morty_proxy_key
27−
28−Note that the example above (``http://127.0.0.1:3000``) is only for single-user
29−instances without a HTTP proxy. If your morty service is public, the url is the
30−address of the reverse proxy (e.g ``https://example.org/morty``).
31−
32−For more information about *result proxy* have a look at *"searx via filtron
33−plus morty"* in the :ref:`nginx <nginx searx via filtron plus morty>` and
34−:ref:`apache <apache searx via filtron plus morty>` sections.
35
28
36``url``
29``url``
37 Is the address of the running morty service.
30 Is the address of the running morty service.
docs/admin/settings.rst+72−138
@@ -27,8 +27,7 @@ First, searx will try to load settings.yml from these locations:
271. the full path specified in the ``SEARX_SETTINGS_PATH`` environment variable.
271. the full path specified in the ``SEARX_SETTINGS_PATH`` environment variable.
282. ``/etc/searx/settings.yml``
282. ``/etc/searx/settings.yml``
29
29
30−If these files don't exist (or are empty or can't be read), searx uses the
30+If these files don't exist (or are empty or can't be read), searx uses the :origin:`searx/settings.yml` file.
31−:origin:`searx/settings.yml` file.
32
31
33
32
34.. _settings global:
33.. _settings global:
@@ -36,9 +35,6 @@ If these files don't exist (or are empty or can't be read), searx uses the
36Global Settings
35Global Settings
37===============
36===============
38
37
39−``general:``
40−------------
41−
42.. code:: yaml
38.. code:: yaml
43
39
44 general:
40 general:
@@ -58,7 +54,7 @@ Global Settings
58 messages in the browser too, so this must be deactivated in production.
54 messages in the browser too, so this must be deactivated in production.
59
55
60``contact_url``:
56``contact_url``:
61− Contact ``mailto:`` address or WEB form.
57+ Contact mail address or WEB form.
62
58
63``git_url`` and ``git_branch``:
59``git_url`` and ``git_branch``:
64 Changes this, to point to your searx fork (branch).
60 Changes this, to point to your searx fork (branch).
@@ -73,9 +69,6 @@ Global Settings
73 Link to your tweets (or ``False``)
69 Link to your tweets (or ``False``)
74
70
75
71
76−``server:``
77−-----------
78−
79.. code:: yaml
72.. code:: yaml
80
73
81 server:
74 server:
@@ -121,8 +114,6 @@ Global Settings
121``default_http_headers``:
114``default_http_headers``:
122 Set additional HTTP headers, see `#755 <https://github.com/searx/searx/issues/715>`__
115 Set additional HTTP headers, see `#755 <https://github.com/searx/searx/issues/715>`__
123
116
124−``outgoing:``
125−-------------
126
117
127.. code:: yaml
118.. code:: yaml
128
119
@@ -130,12 +121,14 @@ Global Settings
130 request_timeout : 2.0 # default timeout in seconds, can be override by engine
121 request_timeout : 2.0 # default timeout in seconds, can be override by engine
131 # max_request_timeout: 10.0 # the maximum timeout in seconds
122 # max_request_timeout: 10.0 # the maximum timeout in seconds
132 useragent_suffix : "" # informations like an email address to the administrator
123 useragent_suffix : "" # informations like an email address to the administrator
133− pool_connections : 100 # Maximum number of allowable connections, or None for no limits. The default is 100.
124+ pool_connections : 100 # Number of different hosts
134− pool_maxsize : 10 # Number of allowable keep-alive connections, or None to always allow. The default is 10.
125+ pool_maxsize : 10 # Number of simultaneous requests by host
135− enable_http2: True # See https://www.python-httpx.org/http2/
136 # uncomment below section if you want to use a proxy
126 # uncomment below section if you want to use a proxy
137 # proxies:
127 # proxies:
138− # all://:
128+ # http:
129+ # - http://proxy1:8080
130+ # - http://proxy2:8080
131+ # https:
139 # - http://proxy1:8080
132 # - http://proxy1:8080
140 # - http://proxy2:8080
133 # - http://proxy2:8080
141 # uncomment below section only if you have more than one network interface
134 # uncomment below section only if you have more than one network interface
@@ -143,7 +136,6 @@ Global Settings
143 # source_ips:
136 # source_ips:
144 # - 1.1.1.1
137 # - 1.1.1.1
145 # - 1.1.1.2
138 # - 1.1.1.2
146− # - fe80::/126
147
139
148
140
149``request_timeout`` :
141``request_timeout`` :
@@ -156,50 +148,20 @@ Global Settings
156 Suffix to the user-agent searx uses to send requests to others engines. If an
148 Suffix to the user-agent searx uses to send requests to others engines. If an
157 engine wish to block you, a contact info here may be useful to avoid that.
149 engine wish to block you, a contact info here may be useful to avoid that.
158
150
159−``keepalive_expiry``:
151+.. _requests proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies
160− Number of seconds to keep a connection in the pool. By default 5.0 seconds.
152+.. _PySocks: https://pypi.org/project/PySocks/
161−
162−.. _httpx proxies: https://www.python-httpx.org/advanced/#http-proxying
163
153
164``proxies`` :
154``proxies`` :
165− Define one or more proxies you wish to use, see `httpx proxies`_.
155+ Define one or more proxies you wish to use, see `requests proxies`_.
166 If there are more than one proxy for one protocol (http, https),
156 If there are more than one proxy for one protocol (http, https),
167 requests to the engines are distributed in a round-robin fashion.
157 requests to the engines are distributed in a round-robin fashion.
168
158
159+ - Proxy: `see <https://2.python-requests.org/en/latest/user/advanced/#proxies>`__.
160+ - SOCKS proxies are also supported: `see <https://2.python-requests.org/en/latest/user/advanced/#socks>`__
161+
169``source_ips`` :
162``source_ips`` :
170 If you use multiple network interfaces, define from which IP the requests must
163 If you use multiple network interfaces, define from which IP the requests must
171− be made. Example:
164+ be made. This parameter is ignored when ``proxies`` is set.
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.
199−
200−
201−``locales:``
202−------------
203
165
204.. code:: yaml
166.. code:: yaml
205
167
@@ -241,13 +203,6 @@ Engine settings
241 api_key : 'apikey'
203 api_key : 'apikey'
242 disabled : True
204 disabled : True
243 language : en_US
205 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
251 #proxies:
206 #proxies:
252 # http:
207 # http:
253 # - http://proxy1:8080
208 # - http://proxy1:8080
@@ -302,12 +257,6 @@ Engine settings
302``display_error_messages`` : default ``True``
257``display_error_messages`` : default ``True``
303 When an engine returns an error, the message is displayed on the user interface.
258 When an engine returns an error, the message is displayed on the user interface.
304
259
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−
311.. note::
260.. note::
312
261
313 A few more options are possible, but they are pretty specific to some
262 A few more options are possible, but they are pretty specific to some
@@ -319,76 +268,61 @@ Engine settings
319use_default_settings
268use_default_settings
320====================
269====================
321
270
322−.. sidebar:: ``use_default_settings: True``
271+.. note::
323
272
324− - :ref:`settings location`
273+ If searx is cloned from a git repository, most probably there is no need to have an user settings.
325− - :ref:`use_default_settings.yml`
274+
326− - :origin:`/etc/searx/settings.yml <utils/templates/etc/searx/use_default_settings.yml>`
327−
328−The user defined ``settings.yml`` is loaded from the :ref:`settings location`
329−and can relied on the default configuration :origin:`searx/settings.yml` using:
275+The user defined settings.yml can relied on the default configuration :origin:`searx/settings.yml` using ``use_default_settings: True``.
330−
276+
331− ``use_default_settings: True``
332−
333−``server:``
334− In the following example, the actual settings are the default settings defined
277+In the following example, the actual settings are the default settings defined in :origin:`searx/settings.yml` with the exception of the ``secret_key`` and the ``bind_address``:
335− in :origin:`searx/settings.yml` with the exception of the ``secret_key`` and
278+
336− the ``bind_address``:
337−
338− .. code-block:: yaml
279+.. code-block:: yaml
339−
280+
340− use_default_settings: True
281+ use_default_settings: True
341− server:
282+ server:
342− secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
283+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
343− bind_address: "0.0.0.0"
284+ bind_address: "0.0.0.0"
344−
285+
345−``engines:``
346− With ``use_default_settings: True``, each settings can be override in a
286+With ``use_default_settings: True``, each settings can be override in a similar way, the ``engines`` section is merged according to the engine ``name``.
347− similar way, the ``engines`` section is merged according to the engine
287+
348− ``name``. In this example, searx will load all the engine and the arch linux
288+In this example, searx will load all the engine and the arch linux wiki engine has a :ref:`token<private engines>`:
349− wiki engine has a :ref:`token<private engines>`:
289+
350−
351− .. code-block:: yaml
290+.. code-block:: yaml
352−
291+
353− use_default_settings: True
292+ use_default_settings: True
354− server:
293+ server:
355− secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
294+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
356− engines:
295+ engines:
357− - name: arch linux wiki
296+ - name: arch linux wiki
358− tokens: ['$ecretValue']
297+ tokens: ['$ecretValue']
359−
298+
360−``engines:`` / ``remove:``
361− It is possible to remove some engines from the default settings. The following
299+It is possible to remove some engines from the default settings. The following example is similar to the above one, but searx doesn't load the the google engine:
362− example is similar to the above one, but searx doesn't load the the google
300+
363− engine:
364−
365− .. code-block:: yaml
301+.. code-block:: yaml
366−
302+
367− use_default_settings:
303+ use_default_settings:
368− engines:
304+ engines:
369− remove:
305+ remove:
370− - google
306+ - google
371− server:
307+ server:
372− secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
308+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
373− engines:
309+ engines:
374− - name: arch linux wiki
310+ - name: arch linux wiki
375− tokens: ['$ecretValue']
311+ tokens: ['$ecretValue']
376−
312+
377−``engines:`` / ``keep_only:``
378− As an alternative, it is possible to specify the engines to keep. In the
313+As an alternative, it is possible to specify the engines to keep. In the following example, searx has only two engines:
379− following example, searx has only two engines:
314+
380−
381− .. code-block:: yaml
315+.. code-block:: yaml
382−
316+
383− use_default_settings:
317+ use_default_settings:
384− engines:
318+ engines:
385− keep_only:
319+ keep_only:
386− - google
320+ - google
387− - duckduckgo
321+ - duckduckgo
388− server:
322+ server:
389− secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
323+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
390− engines:
324+ engines:
391− - name: google
325+ - name: google
392− tokens: ['$ecretValue']
326+ tokens: ['$ecretValue']
393− - name: duckduckgo
327+ - name: duckduckgo
394− tokens: ['$ecretValue']
328+ tokens: ['$ecretValue']
docs/admin/update-searx.rst+10−46
@@ -4,56 +4,20 @@
4How to update
4How to update
5=============
5=============
6
6
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−
18.. code:: sh
7.. code:: sh
19
8
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:
9+ sudo -H -u searx -i
29−
10+ (searx)$ git stash
30−======================
11+ (searx)$ git pull origin master
31−How to inspect & debug
12+ (searx)$ git stash apply
32−======================
13+ (searx)$ ./manage.sh update_packages
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
51
14
52− sudo -H ./utils/filtron.sh inspect service
15+Restart uwsgi:
53
16
54−**Inspect** :ref:`result proxy <morty.sh>`
17+.. tabs::
55
18
56−.. code:: bash
19+ .. group-tab:: Ubuntu / debian
57
20
58− sudo -H ./utils/morty.sh inspect service
21+ .. code:: sh
59
22
23+ sudo -H systemctl restart uwsgi
docs/blog/index.rst+3−6
@@ -3,15 +3,12 @@ Blog
3====
3====
4
4
5.. toctree::
5.. toctree::
6− :titlesonly:
6+ :maxdepth: 2
7− :reversed:
7+ :caption: Contents
8
8
9+ lxcdev-202006
9 python3
10 python3
10 admin
11 admin
11 intro-offline
12 intro-offline
12 private-engines
13 private-engines
13− lxcdev-202006
14 command-line-engines
14 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.
31
31
32 The environment in which we run all our development processes matters!
32 The environment in which we run all our development processes matters!
33
33
34−The :ref:`makefile` and the :ref:`make install` encapsulate a lot for us, but they
34+The :ref:`makefile` and the :ref:`make pyenv` encapsulate a lot for us, but they
35do not have access to all prerequisites. For example, there may have
35do not have access to all prerequisites. For example, there may have
36dependencies on packages that are installed on the developer's desktop, but
36dependencies on packages that are installed on the developer's desktop, but
37usually are not preinstalled on a server or client system. Another examples
37usually are not preinstalled on a server or client system. Another examples
@@ -356,7 +356,7 @@ daily usage:
356 .. code:: sh
356 .. code:: sh
357
357
358 $ sudo -H ./utils/lxc.sh cmd searx-archlinux \
358 $ sudo -H ./utils/lxc.sh cmd searx-archlinux \
359− make docs.html
359+ make docs
360
360
361.. _blog-lxcdev-202006 abstract:
361.. _blog-lxcdev-202006 abstract:
362
362
@@ -407,7 +407,7 @@ To get remarks from the suite of the archlinux container we can use:
407 ...
407 ...
408 [searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
408 [searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
409 [searx-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/
409 [searx-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/
410− [searx-archlinux] INFO: (eth0) docs.live: http://10.174.184.156:8080/
410+ [searx-archlinux] INFO: (eth0) docs-live: http://10.174.184.156:8080/
411 [searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
411 [searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
412 ...
412 ...
413
413
docs/blog/search-database-engines.rstdeleted−95
@@ -1,95 +0,0 @@
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.rstdeleted−114
@@ -1,114 +0,0 @@
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.rstdeleted−117
@@ -1,117 +0,0 @@
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 @@
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
33 (${SERVICE_USER}) $ wget --progress=bar -O \"${GO_TAR}\" \\
33 (${SERVICE_USER}) $ wget --progress=bar -O \"${GO_TAR}\" \\
34 \"${GO_PKG_URL}\"
34 \"${GO_PKG_URL}\"
35− (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local -xzf \"${GO_TAR}\"
35+ (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local/go -xzf \"${GO_TAR}\"
36 (${SERVICE_USER}) $ which go
36 (${SERVICE_USER}) $ which go
37 ${SERVICE_HOME}/local/go/bin/go
37 ${SERVICE_HOME}/local/go/bin/go
38
38
docs/build-templates/searx.rst−1
@@ -116,7 +116,6 @@ ${fedora_build}
116 pip install -U pip
116 pip install -U pip
117 pip install -U setuptools
117 pip install -U setuptools
118 pip install -U wheel
118 pip install -U wheel
119− pip install -U pyyaml
120
119
121 # jump to searx's working tree and install searx into virtualenv
120 # jump to searx's working tree and install searx into virtualenv
122 (${SERVICE_USER})$ cd \"$SEARX_SRC\"
121 (${SERVICE_USER})$ cd \"$SEARX_SRC\"
docs/conf.py+8−3
@@ -1,7 +1,7 @@
1# -*- coding: utf-8 -*-
1# -*- coding: utf-8 -*-
2−# SPDX-License-Identifier: AGPL-3.0-or-later
3
2
4import sys, os
3import sys, os
4+from sphinx_build_tools import load_sphinx_config
5from pallets_sphinx_themes import ProjectLink
5from pallets_sphinx_themes import ProjectLink
6
6
7from searx import brand
7from searx import brand
@@ -10,7 +10,7 @@ from searx.version import VERSION_STRING
10# Project --------------------------------------------------------------
10# Project --------------------------------------------------------------
11
11
12project = u'searx'
12project = u'searx'
13−copyright = u'2015-2021, Adam Tauber, Noémi Ványi'
13+copyright = u'2015-2020, Adam Tauber, Noémi Ványi'
14author = u'Adam Tauber'
14author = u'Adam Tauber'
15release, version = VERSION_STRING, VERSION_STRING
15release, version = VERSION_STRING, VERSION_STRING
16highlight_language = 'none'
16highlight_language = 'none'
@@ -101,7 +101,6 @@ imgmath_font_size = 14
101
101
102html_theme_options = {"index_sidebar_logo": True}
102html_theme_options = {"index_sidebar_logo": True}
103html_context = {"project_links": [] }
103html_context = {"project_links": [] }
104−html_context["project_links"].append(ProjectLink("Blog", "blog/index.html"))
105if brand.GIT_URL:
104if brand.GIT_URL:
106 html_context["project_links"].append(ProjectLink("Source", brand.GIT_URL))
105 html_context["project_links"].append(ProjectLink("Source", brand.GIT_URL))
107if brand.WIKI_URL:
106if brand.WIKI_URL:
@@ -129,3 +128,9 @@ html_show_sourcelink = False
129latex_documents = [
128latex_documents = [
130 (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
129 (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
131]
130]
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+22−11
@@ -132,11 +132,11 @@ Here is an example which makes a complete rebuild:
132
132
133.. code:: sh
133.. code:: sh
134
134
135− $ make docs.clean docs.html
135+ $ make docs-clean docs
136 ...
136 ...
137 The HTML pages are in dist/docs.
137 The HTML pages are in dist/docs.
138
138
139−.. _make docs.live:
139+.. _make docs-live:
140
140
141live build
141live build
142----------
142----------
@@ -144,19 +144,19 @@ live build
144.. _sphinx-autobuild:
144.. _sphinx-autobuild:
145 https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
145 https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
146
146
147−.. sidebar:: docs.clean
147+.. sidebar:: docs-clean
148
148
149 It is recommended to assert a complete rebuild before deploying (use
149 It is recommended to assert a complete rebuild before deploying (use
150− ``docs.clean``).
150+ ``docs-clean``).
151
151
152Live build is like WYSIWYG. If you want to edit the documentation, its
152Live build is like WYSIWYG. If you want to edit the documentation, its
153−recommended to use. The Makefile target ``docs.live`` builds the docs, opens
153+recommended to use. The Makefile target ``docs-live`` builds the docs, opens
154URL in your favorite browser and rebuilds every time a reST file has been
154URL in your favorite browser and rebuilds every time a reST file has been
155changed.
155changed.
156
156
157.. code:: sh
157.. code:: sh
158
158
159− $ make docs.live
159+ $ make docs-live
160 ...
160 ...
161 The HTML pages are in dist/docs.
161 The HTML pages are in dist/docs.
162 ... Serving on http://0.0.0.0:8000
162 ... Serving on http://0.0.0.0:8000
@@ -169,7 +169,7 @@ argument. E.g to find and use a free port, use:
169
169
170.. code:: sh
170.. code:: sh
171
171
172− $ SPHINXOPTS="--port 0" make docs.live
172+ $ SPHINXOPTS="--port 0" make docs-live
173 ...
173 ...
174 ... Serving on http://0.0.0.0:50593
174 ... Serving on http://0.0.0.0:50593
175 ...
175 ...
@@ -180,10 +180,21 @@ argument. E.g to find and use a free port, use:
180deploy on github.io
180deploy on github.io
181-------------------
181-------------------
182
182
183−To deploy documentation at :docs:`github.io <.>` use Makefile target :ref:`make
183+To deploy documentation at :docs:`github.io <.>` use Makefile target
184−docs.gh-pages`, which builds the documentation and runs all the needed git add,
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
185−commit and push:
186+needed git add, commit and push:
186
187
187.. code:: sh
188.. code:: sh
188
189
189− $ make docs.clean docs.gh-pages
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
docs/dev/engine_overview.rst+2−3
@@ -42,6 +42,7 @@ argument type information
42======================= =========== ========================================================
42======================= =========== ========================================================
43categories list pages, in which the engine is working
43categories list pages, in which the engine is working
44paging boolean support multible pages
44paging boolean support multible pages
45+language_support boolean support language choosing
45time_range_support boolean support search time range
46time_range_support boolean support search time range
46engine_type str ``online`` by default, other possibles values are
47engine_type str ``online`` by default, other possibles values are
47 ``offline``, ``online_dictionnary``, ``online_currency``
48 ``offline``, ``online_dictionnary``, ``online_currency``
@@ -58,8 +59,6 @@ argument type information
58name string name of search-engine
59name string name of search-engine
59engine string name of searx-engine
60engine string name of searx-engine
60 (filename without ``.py``)
61 (filename without ``.py``)
61−enable_http bool enable HTTP
62− (by default only HTTPS is enabled).
63shortcut string shortcut of search-engine
62shortcut string shortcut of search-engine
64timeout string specific timeout for search-engine
63timeout string specific timeout for search-engine
65display_error_messages boolean display error messages on the web UI
64display_error_messages boolean display error messages on the web UI
@@ -98,6 +97,7 @@ example code
98 # engine dependent config
97 # engine dependent config
99 categories = ['general']
98 categories = ['general']
100 paging = True
99 paging = True
100+ language_support = True
101
101
102
102
103making a request
103making a request
@@ -171,7 +171,6 @@ headers set HTTP header information
171data set HTTP data information
171data set HTTP data information
172cookies set HTTP cookies
172cookies set HTTP cookies
173verify bool Performing SSL-Validity check
173verify bool Performing SSL-Validity check
174−follow_redirects bool Follow redirects
175max_redirects int maximum redirects, hard limit
174max_redirects int maximum redirects, hard limit
176soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
175soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
177raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
176raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
docs/dev/makefile.rst+112−116
@@ -1,33 +1,33 @@
1.. _makefile:
1.. _makefile:
2
2
3−========
3+================
4−Makefile
4+Makefile Targets
5−========
5+================
6
6
7.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
7.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
8
8
9.. sidebar:: build environment
9.. sidebar:: build environment
10
10
11− Before looking deeper at the targets, first read about :ref:`make
11+ Before looking deeper at the targets, first read about :ref:`make pyenv`.
12− install`.
13
12
14 To install system requirements follow :ref:`buildhosts`.
13 To install system requirements follow :ref:`buildhosts`.
15
14
16−All relevant build tasks are implemented in :origin:`manage.sh` and for CI or
15+With the aim to simplify development cycles, started with :pull:`1756` a
17−IDE integration a small ``Makefile`` wrapper is available. If you are not
16+``Makefile`` based boilerplate was added. If you are not familiar with
18−familiar with Makefiles, we recommend to read gnu-make_ introduction.
17+Makefiles, we recommend to read gnu-make_ introduction.
19
18
20The usage is simple, just type ``make {target-name}`` to *build* a target.
19The usage is simple, just type ``make {target-name}`` to *build* a target.
21Calling the ``help`` target gives a first overview (``make help``):
20Calling the ``help`` target gives a first overview (``make help``):
22
21
23.. program-output:: bash -c "cd ..; make --no-print-directory help"
22.. program-output:: bash -c "cd ..; make --no-print-directory help"
24
23
24+
25.. contents:: Contents
25.. contents:: Contents
26 :depth: 2
26 :depth: 2
27 :local:
27 :local:
28 :backlinks: entry
28 :backlinks: entry
29
29
30−.. _make install:
30+.. _make pyenv:
31
31
32Python environment
32Python environment
33==================
33==================
@@ -36,42 +36,31 @@ Python environment
36
36
37 ``source ./local/py3/bin/activate``
37 ``source ./local/py3/bin/activate``
38
38
39−We do no longer need to build up the virtualenv manually. Jump into your git
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
40−working tree and release a ``make install`` to get a virtualenv with a
41+and release a ``make pyenv``:
41−*developer install* of searx (:origin:`setup.py`). ::
42+
43+.. code:: sh
42
44
43 $ cd ~/searx-clone
45 $ cd ~/searx-clone
44− $ make install
46+ $ make pyenv
45− PYENV [virtualenv] installing ./requirements*.txt into local/py3
47+ PYENV usage: source ./local/py3/bin/activate
46 ...
48 ...
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
54
49
55−If you release ``make install`` multiple times the installation will only
50+With target ``pyenv`` a development environment (aka virtualenv) was build up in
56−rebuild if the sha256 sum of the *requirement files* fails. With other words:
51+``./local/py3/``. To make a *developer install* of searx (:origin:`setup.py`)
57−the check fails if you edit the requirements listed in
52+into this environment, use make target ``install``:
58−:origin:`requirements-dev.txt` and :origin:`requirements.txt`). ::
53+
54+.. code:: sh
59
55
60 $ make install
56 $ make install
61− PYENV OK
57+ PYENV usage: source ./local/py3/bin/activate
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
58+ PYENV using virtualenv from ./local/py3
67− ...
68− PYENV OK
69− PYENV [install] pip install -e 'searx[test]'
59+ PYENV install .
70− ...
60+
71− Successfully installed argparse-1.4.0 searx
61+You have never to think about intermediate targets like ``pyenv`` or
72− BUILDENV INFO:searx:load the default settings from ./searx/settings.yml
62+``install``, the ``Makefile`` chains them as requisites. Just run your main
73− BUILDENV INFO:searx:Initialisation done
63+target.
74− BUILDENV build utils/brand.env
75
64
76.. sidebar:: drop environment
65.. sidebar:: drop environment
77
66
@@ -79,7 +68,10 @@ the check fails if you edit the requirements listed in
79 <make clean>` first.
68 <make clean>` first.
80
69
81If you think, something goes wrong with your ./local environment or you change
70If you think, something goes wrong with your ./local environment or you change
82−the :origin:`setup.py` file, you have to call :ref:`make clean`.
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+
83
75
84.. _make run:
76.. _make run:
85
77
@@ -89,113 +81,117 @@ the :origin:`setup.py` file, you have to call :ref:`make clean`.
89To get up a running a developer instance simply call ``make run``. This enables
81To get up a running a developer instance simply call ``make run``. This enables
90*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
82*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
91instance, disables *debug* option again and opens the URL in your favorite WEB
83instance, disables *debug* option again and opens the URL in your favorite WEB
92−browser (:man:`xdg-open`)::
84+browser (:man:`xdg-open`):
93
85
86+.. code:: sh
87+
94− $ make run
88+ $ make run
95− PYENV OK
89+ PYENV usage: source ./local/py3/bin/activate
90+ PYENV install .
96− SEARX_DEBUG=1 ./manage.sh pyenv.cmd python ./searx/webapp.py
91+ ./local/py3/bin/python ./searx/webapp.py
97− ...
92+ ...
98− INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
93+ INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
94+ ...
99
95
100.. _make clean:
96.. _make clean:
101
97
102``make clean``
98``make clean``
103==============
99==============
104
100
105−Drop all intermediate files, all builds, but keep sources untouched. Before
101+Drop all intermediate files, all builds, but keep sources untouched. Includes
102+target ``pyclean`` which drops ./local environment. Before calling ``make
106−calling ``make clean`` stop all processes using :ref:`make install`. ::
103+clean`` stop all processes using :ref:`make pyenv`.
104+
105+.. code:: sh
107
106
108 $ make clean
107 $ make clean
109− CLEAN pyenv
108+ CLEAN pyclean
110− PYENV [virtualenv] drop ./local/py3
109+ CLEAN clean
111− CLEAN docs -- ./build/docs ./dist/docs
112− CLEAN locally installed npm dependencies
113− CLEAN test stuff
114− CLEAN common files
115
110
116.. _make docs:
111.. _make docs:
117
112
118−``make docs docs.autobuild docs.clean``
113+``make docs docs-live docs-clean``
119−=======================================
114+==================================
120
115
121−We describe the usage of the ``doc.*`` targets in the :ref:`How to contribute /
116+We describe the usage of the ``doc*`` targets in the :ref:`How to contribute /
122Documentation <contrib docs>` section. If you want to edit the documentation
117Documentation <contrib docs>` section. If you want to edit the documentation
123−read our :ref:`make docs.live` section. If you are working in your own brand,
118+read our :ref:`make docs-live` section. If you are working in your own brand,
124adjust your :ref:`settings global`.
119adjust your :ref:`settings global`.
125
120
126−.. _make docs.gh-pages:
121+.. _make books:
127
122
128−``make docs.gh-pages``
123+``make books/{name}.html books/{name}.pdf``
129−======================
124+===========================================
130
125
131−To deploy on github.io first adjust your :ref:`settings global`. For any
126+.. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
132−further read :ref:`deploy on github.io`.
127+.. _XeTeX: https://tug.org/xetex/
133
128
134−.. _make test:
129+.. sidebar:: info
135
130
136−``make test``
131+ To build PDF a XeTeX_ is needed, see :ref:`buildhosts`.
137−=============
138
132
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.::
141
133
142− $ make test.pep8 test.unit test.sh
134+The ``books/{name}.*`` targets are building *books*. A *book* is a
143− TEST test.pep8 OK
135+sub-directory containing a ``conf.py`` file. One example is the user handbook
144− ...
136+which can deployed separately (:origin:`docs/user/conf.py`). Such ``conf.py``
145− TEST test.unit OK
137+do inherit from :origin:`docs/conf.py` and overwrite values to fit *book's*
146− ...
138+needs.
147− TEST test.sh OK
148−
149−.. _make test.sh:
150
139
151−``make test.sh``
140+With the help of Intersphinx_ (:ref:`reST smart ref`) the links to searx’s
152−================
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.
153
144
154−:ref:`sh lint` / if you have changed some bash scripting run this test before
145+Use ``make docs-help`` to see which books available:
155−commit.
156
146
157−.. _make test.pylint:
147+.. program-output:: bash -c "cd ..; make --no-print-directory docs-help"
148+ :ellipsis: 0,-6
158
149
159−``make test.pylint``
160−====================
161
150
162−.. _Pylint: https://www.pylint.org/
151+.. _make gh-pages:
163
152
164−Pylint_ is known as one of the best source-code, bug and quality checker for the
153+``make gh-pages``
165−Python programming language. The pylint profile we use at searx project is
154+=================
166−found in project's root folder :origin:`.pylintrc`.
167
155
168−.. _make search.checker:
156+To deploy on github.io first adjust your :ref:`settings global`. For any
157+further read :ref:`deploy on github.io`.
169
158
170−``search.checker.{engine name}``
159+.. _make test:
171−================================
172
160
173−To check all engines::
161+``make test``
162+=============
174
163
175− make search.checker
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.:
176
167
177−To check a engine with whitespace in the name like *google news* replace space
168+.. code:: sh
178−by underline::
179
169
180− make search.checker.google_news
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
181
175
182−To see HTTP requests and more use SEARX_DEBUG::
176+.. _make pylint:
183
177
184− make SEARX_DEBUG=1 search.checker.google_news
178+``make pylint``
179+===============
185
180
186−.. _3xx: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection
181+.. _Pylint: https://www.pylint.org/
187
182
188−To filter out HTTP redirects (3xx_)::
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`.
189
189
190− make SEARX_DEBUG=1 search.checker.google_news | grep -A1 "HTTP/1.1\" 3[0-9][0-9]"
190+Code quality is a ongoing process. Don't try to fix all messages from Pylint,
191− ...
191+run Pylint and check if your changed lines are bringing up new messages. If so,
192− Engine google news Checking
192+fix it. By this, code quality gets incremental better and if there comes the
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
193+day, the linting is balanced out, we might decide to add Pylint as a quality
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
194+gate.
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− --
199
195
200
196
201``make pybuild``
197``make pybuild``
@@ -204,7 +200,9 @@ To filter out HTTP redirects (3xx_)::
204.. _PyPi: https://pypi.org/
200.. _PyPi: https://pypi.org/
205.. _twine: https://twine.readthedocs.io/en/latest/
201.. _twine: https://twine.readthedocs.io/en/latest/
206
202
207−Build Python packages in ``./dist/py``::
203+Build Python packages in ``./dist/py``.
204+
205+.. code:: sh
208
206
209 $ make pybuild
207 $ make pybuild
210 ...
208 ...
@@ -212,11 +210,9 @@ Build Python packages in ``./dist/py``::
212 running sdist
210 running sdist
213 running egg_info
211 running egg_info
214 ...
212 ...
215− running bdist_wheel
216−
217− $ ls ./dist
213+ $ ls ./dist/py/
218− searx-0.18.0-py3-none-any.whl searx-0.18.0.tar.gz
214+ searx-0.15.0-py3-none-any.whl searx-0.15.0.tar.gz
219
215
220−To upload packages to PyPi_, there is also a ``pypi.upload`` target (to test use
216+To upload packages to PyPi_, there is also a ``upload-pypi`` target. It needs
221−``pypi.upload.test``). Since you are not the owner of :pypi:`searx` you will
217+twine_ to be installed. Since you are not the owner of :pypi:`searx` you will
222−never need to upload.
218+never need the latter.
docs/dev/reST.rst+7−6
@@ -15,8 +15,8 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read
15:ref:`docs build`.
15:ref:`docs build`.
16
16
17The source files of Searx's documentation are located at :origin:`docs`. Sphinx
17The source files of Searx's documentation are located at :origin:`docs`. Sphinx
18−assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs.live
18+assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs-live
19−<make docs.live>` to build HTML while editing.
19+<make docs-live>` to build HTML while editing.
20
20
21.. sidebar:: Further reading
21.. sidebar:: Further reading
22
22
@@ -1276,12 +1276,13 @@ Templating
1276
1276
1277.. sidebar:: Build environment
1277.. sidebar:: Build environment
1278
1278
1279− All *generic-doc* tasks are running in the :ref:`make install`.
1279+ All *generic-doc* tasks are running in the :ref:`build environment <make
1280+ pyenv>`.
1280
1281
1281Templating is suitable for documentation which is created generic at the build
1282Templating is suitable for documentation which is created generic at the build
1282−time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
1283+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
1283−install` (with searx modules installed). We use this e.g. to build chapter:
1284+environment <make pyenv>` (with searx modules installed). We use this e.g. to
1284−:ref:`engines generic`. Below the jinja directive from the
1285+build chapter: :ref:`engines generic`. Below the jinja directive from the
1285:origin:`docs/admin/engines.rst` is shown:
1286:origin:`docs/admin/engines.rst` is shown:
1286
1287
1287.. literalinclude:: ../admin/engines.rst
1288.. literalinclude:: ../admin/engines.rst
docs/dev/search_api.rst+1−1
@@ -6,7 +6,7 @@ Search API
6
6
7The search supports both ``GET`` and ``POST``.
7The search supports both ``GET`` and ``POST``.
8
8
9−Furthermore, two endpoints ``/`` and ``/search`` are available for querying.
9+Furthermore, two enpoints ``/`` and ``/search`` are available for querying.
10
10
11
11
12``GET /``
12``GET /``
docs/index.rst−1
@@ -30,7 +30,6 @@ anyone, you can set up your own, see :ref:`installation`.
30 user/index
30 user/index
31 admin/index
31 admin/index
32 dev/index
32 dev/index
33− searx_extra/index
34 utils/index
33 utils/index
35 blog/index
34 blog/index
36
35
docs/searx_extra/index.rstdeleted−14
@@ -1,14 +0,0 @@
1−.. _searx_extra:
2−
3−======================================================
4−Tooling box ``searx_extra`` for developers and users
5−======================================================
6−
7−In the folder :origin:`searx_extra/` we maintain some tools useful for
8−developers and users.
9−
10−.. toctree::
11− :maxdepth: 2
12− :caption: Contents
13−
14− standalone_searx.py
docs/searx_extra/standalone_searx.py.rstdeleted−9
@@ -1,9 +0,0 @@
1−
2−.. _standalone_searx.py:
3−
4−===================================
5−``searx_extra/standalone_searx.py``
6−===================================
7−
8−.. automodule:: searx_extra.standalone_searx
9− :members:
docs/user/conf.pynew file+21
@@ -0,0 +1,21 @@
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'] = (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/user/search_syntax.rst−24
@@ -40,27 +40,3 @@ Image search:
40Custom language in wikipedia:
40Custom language in wikipedia:
41
41
42- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
42- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
43−
44−Multilingual Search
45−===================
46−
47−Searx does not support true multilingual search.
48−You have to use the language prefix in your search query when searching in a different language.
49−
50−But there is a workaround:
51−By adding a new search engine with a different language, Searx will search in your default and other language.
52−
53−Example configuration in settings.yml for a German and English speaker:
54− .. code-block:: yaml
55−
56− search:
57− language : "de"
58− ...
59−
60− engines:
61− - name : google english
62− engine : google
63− language : english
64− ...
65−
66−When searching, the default google engine will return German results and "google english" will return English results.
docs/utils/index.rst+6−4
@@ -1,11 +1,12 @@
1.. _searx_utils:
1.. _searx_utils:
2.. _toolboxing:
2.. _toolboxing:
3
3
4−===================
4+=======================
5−Admin's tooling box
5+Tooling box ``utils/*``
6−===================
6+=======================
7
7
8−In the folder :origin:`utils/` we maintain some tools useful for administrators.
8+In the folder :origin:`utils/` we maintain some tools useful for admins and
9+developers.
9
10
10.. toctree::
11.. toctree::
11 :maxdepth: 2
12 :maxdepth: 2
@@ -15,6 +16,7 @@ In the folder :origin:`utils/` we maintain some tools useful for administrators.
15 filtron.sh
16 filtron.sh
16 morty.sh
17 morty.sh
17 lxc.sh
18 lxc.sh
19+ standalone_searx.py
18
20
19.. _toolboxing common:
21.. _toolboxing common:
20
22
docs/utils/lxc.sh.rst+3−3
@@ -119,15 +119,15 @@ of coffee).::
119
119
120To build (live) documentation inside a archlinux_ container::
120To build (live) documentation inside a archlinux_ container::
121
121
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
123 ...
123 ...
124 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
124 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
125
125
126To get IP of the container and the port number *live docs* is listening::
126To get IP of the container and the port number *live docs* is listening::
127
127
128− $ sudo ./utils/lxc.sh show suite | grep docs.live
128+ $ sudo ./utils/lxc.sh show suite | grep docs-live
129 ...
129 ...
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/
131
131
132
132
133.. _lxc.sh help:
133.. _lxc.sh help:
docs/utils/standalone_searx.py.rstnew file+11
@@ -0,0 +1,11 @@
1+
2+.. _standalone_searx.py:
3+
4+=============================
5+``utils/standalone_searx.py``
6+=============================
7+
8+.. automodule:: standalone_searx
9+ :members:
10+
11+
managedeleted−504
@@ -1,504 +0,0 @@
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.shnew file+205
@@ -0,0 +1,205 @@
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 searx/brand.py and utils/brand.env
127+ git update-index -q --refresh
128+ if [ ! -z "$(git diff-index --name-only HEAD -- | grep -v 'searx/brand.py' | 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+22−19
@@ -1,20 +1,23 @@
1−mock==4.0.3
1+mock==4.0.3; python_version >= "3.6"
2+mock==2.0.0; python_version < "3.6"
2−nose2[coverage_plugin]==0.10.0
3+nose2[coverage_plugin]==0.9.2
3cov-core==1.15.0
4cov-core==1.15.0
4−pycodestyle==2.8.0
5+pycodestyle==2.6.0
5−pylint==2.12.2
6+pylint==2.6.0
6−splinter==0.17.0
7+splinter==0.14.0
7−transifex-client==0.14.3; python_version < '3.10'
8+transifex-client==0.14.2
8−transifex-client==0.12.1; python_version == '3.10'
9+unittest2==1.1.0
9−selenium==4.1.0
10+selenium==3.141.0
10−twine==3.7.1
11+twine==3.3.0; python_version >= "3.6"
12+twine==1.15.0; python_version < "3.6"
11−Pallets-Sphinx-Themes==2.0.2
13+Pallets-Sphinx-Themes==1.2.3
12−docutils==0.16
14+Sphinx==3.4.1; python_version >= '3.6'
13−Sphinx==4.4.0
15+Sphinx==3.0.1; python_version < '3.6'
14−sphinx-issues==3.0.1
16+sphinx-issues==1.2.0
15−sphinx-jinja==1.4.0
17+sphinx-jinja==1.1.1
18+sphinx-tabs==1.3.0; python_version >= '3.6'
16−sphinx-tabs==3.2.0
19+sphinx-tabs==1.1.13; python_version < '3.6'
17−sphinxcontrib-programoutput==0.17
20+sphinxcontrib-programoutput==0.16
21+sphinx-autobuild==2020.9.1; python_version >= '3.6'
18−sphinx-autobuild==2021.3.14
22+sphinx-autobuild==0.7.1; python_version < '3.6'
19−linuxdoc==20211220
23+linuxdoc==20210110
20−aiounittest==1.4.1
requirements.txt+11−15
@@ -1,16 +1,12 @@
1−certifi==2021.10.8
1+certifi==2020.12.05
2−babel==2.9.1
2+babel==2.9.0
3flask-babel==2.0.0
3flask-babel==2.0.0
4−flask==2.0.2
4+flask==1.1.2
5+idna==2.10
5−jinja2==3.0.3
6+jinja2==2.11.2
6−lxml==4.7.1
7+lxml==4.6.2
7−pygments==2.8.0
8+pygments==2.1.3
9+pyopenssl==20.0.1
8−python-dateutil==2.8.2
10+python-dateutil==2.8.1
9−pyyaml==6.0
11+pyyaml==5.3.1
10−httpx[http2]==0.21.3
12+requests[socks]==2.25.1
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/__init__.py−46
@@ -60,49 +60,3 @@ if 'SEARX_SECRET' in environ:
60 settings['server']['secret_key'] = environ['SEARX_SECRET']
60 settings['server']['secret_key'] = environ['SEARX_SECRET']
61if 'SEARX_BIND_ADDRESS' in environ:
61if 'SEARX_BIND_ADDRESS' in environ:
62 settings['server']['bind_address'] = environ['SEARX_BIND_ADDRESS']
62 settings['server']['bind_address'] = environ['SEARX_BIND_ADDRESS']
63−
64−
65−class _brand_namespace:
66−
67− @classmethod
68− def get_val(cls, group, name, default=''):
69− return settings.get(group, {}).get(name) or default
70−
71− @property
72− def SEARX_URL(self):
73− return self.get_val('server', 'base_url')
74−
75− @property
76− def CONTACT_URL(self):
77− return self.get_val('general', 'contact_url')
78−
79− @property
80− def GIT_URL(self):
81− return self.get_val('brand', 'git_url')
82−
83− @property
84− def GIT_BRANCH(self):
85− return self.get_val('brand', 'git_branch')
86−
87− @property
88− def ISSUE_URL(self):
89− return self.get_val('brand', 'issue_url')
90−
91− @property
92− def DOCS_URL(self):
93− return self.get_val('brand', 'docs_url')
94−
95− @property
96− def PUBLIC_INSTANCES(self):
97− return self.get_val('brand', 'public_instances')
98−
99− @property
100− def WIKI_URL(self):
101− return self.get_val('brand', 'wiki_url')
102−
103− @property
104− def TWITTER_URL(self):
105− return self.get_val('brand', 'twitter_url')
106−
107−
108−brand = _brand_namespace()
searx/answerers/__init__.py+1−1
@@ -32,7 +32,7 @@ def ask(query):
32 results = []
32 results = []
33 query_parts = list(filter(None, query.query.split()))
33 query_parts = list(filter(None, query.query.split()))
34
34
35− if not query_parts or query_parts[0] not in answerers_by_keywords:
35+ if query_parts[0] not in answerers_by_keywords:
36 return results
36 return results
37
37
38 for answerer in answerers_by_keywords[query_parts[0]]:
38 for answerer in answerers_by_keywords[query_parts[0]]:
searx/autocomplete.py+84−36
@@ -20,36 +20,95 @@ from lxml import etree
20from json import loads
20from json import loads
21from urllib.parse import urlencode
21from urllib.parse import urlencode
22
22
23−from httpx import HTTPError
24−
25−
26from searx import settings
23from searx import settings
27−from searx.data import ENGINES_LANGUAGES
24+from searx.languages import language_codes
25+from searx.engines import (
26+ categories, engines, engine_shortcuts
27+)
28−from searx.network import get as http_get
28+from searx.poolrequests import get as http_get
29−from searx.exceptions import SearxEngineResponseException
30
29
31
30
32def get(*args, **kwargs):
31def get(*args, **kwargs):
33 if 'timeout' not in kwargs:
32 if 'timeout' not in kwargs:
34 kwargs['timeout'] = settings['outgoing']['request_timeout']
33 kwargs['timeout'] = settings['outgoing']['request_timeout']
35− kwargs['raise_for_httperror'] = True
36− return http_get(*args, **kwargs)
37
34
35+ return http_get(*args, **kwargs)
38
36
39−def brave(query, lang):
40− # brave search autocompleter
41− url = 'https://search.brave.com/api/suggest?{query}'
42
37
43− resp = get(url.format(query=urlencode({'q': query})))
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 []
44
43
45 results = []
44 results = []
46
45
47− if resp.ok:
46+ # check if current query stats with !bang
48− data = loads(resp.text)
47+ first_char = full_query.getQuery()[0]
49− for suggestion in data[1]:
48+ if first_char == '!' or first_char == '?':
50− results.append(suggestion)
49+ if len(full_query.getQuery()) == 1:
51−
50+ # show some example queries
52− return results
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)
53
112
54
113
55def dbpedia(query, lang):
114def dbpedia(query, lang):
@@ -94,11 +153,12 @@ def google(query, lang):
94
153
95def startpage(query, lang):
154def startpage(query, lang):
96 # startpage autocompleter
155 # startpage autocompleter
97− lui = ENGINES_LANGUAGES['startpage'].get(lang, 'english')
98− url = 'https://startpage.com/suggestions?{query}'
156+ url = 'https://startpage.com/do/suggest?{query}'
157+
99− resp = get(url.format(query=urlencode({'q': query, 'segment': 'startpage.udog', 'lui': lui})))
158+ resp = get(url.format(query=urlencode({'query': query}))).text.split('\n')
100− data = resp.json()
159+ if len(resp) > 1:
101− return [e['text'] for e in data.get('suggestions', []) if 'text' in e]
160+ return resp
161+ return []
102
162
103
163
104def swisscows(query, lang):
164def swisscows(query, lang):
@@ -136,8 +196,7 @@ def wikipedia(query, lang):
136 return []
196 return []
137
197
138
198
139−backends = {'brave': brave,
140− 'dbpedia': dbpedia,
199+backends = {'dbpedia': dbpedia,
141 'duckduckgo': duckduckgo,
200 'duckduckgo': duckduckgo,
142 'google': google,
201 'google': google,
143 'startpage': startpage,
202 'startpage': startpage,
@@ -145,14 +204,3 @@ backends = {'brave': brave,
145 'qwant': qwant,
204 'qwant': qwant,
146 'wikipedia': wikipedia
205 'wikipedia': wikipedia
147 }
206 }
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/brand.pynew file+9
@@ -0,0 +1,9 @@
1+SEARX_URL = ''
2+GIT_URL = 'https://github.com/searx/searx'
3+GIT_BRANCH = 'master'
4+ISSUE_URL = 'https://github.com/searx/searx/issues'
5+DOCS_URL = 'https://searx.github.io/searx'
6+PUBLIC_INSTANCES = 'https://searx.space'
7+CONTACT_URL = ''
8+WIKI_URL = 'https://github.com/searx/searx/wiki'
9+TWITTER_URL = 'https://twitter.com/Searx_engine'
searx/data/__init__.py+17−38
@@ -1,50 +1,29 @@
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−
20import json
1import json
21from pathlib import Path
2from pathlib import Path
22
3
23−data_dir = Path(__file__).parent
24
4
5+__init__ = ['ENGINES_LANGUGAGES', 'CURRENCIES', 'USER_AGENTS', 'EXTERNAL_URLS', 'WIKIDATA_UNITS',
6+ 'bangs_loader', 'ahmia_blacklist_loader']
7+data_dir = Path(__file__).parent
25
8
26−def _load(filename):
27− with open(data_dir / filename, encoding='utf-8') as f:
28− return json.load(f)
29
9
10+def load(filename):
11+ # add str(...) for Python 3.5
12+ with open(str(data_dir / filename), encoding='utf-8') as fd:
13+ return json.load(fd)
30
14
31−def ahmia_blacklist_loader():
32− """Load data from `ahmia_blacklist.txt` and return a list of MD5 values of onion
33− names. The MD5 values are fetched by::
34
15
35− searx_extra/update/update_ahmia_blacklist.py
16+def bangs_loader():
17+ return load('bangs.json')
36
18
37− This function is used by :py:mod:`searx.plugins.ahmia_filter`.
38
19
39− """
20+def ahmia_blacklist_loader():
40− with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as f:
21+ with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as fd:
41− return f.read().split()
22+ return fd.read().split()
42
23
43
24
44−ENGINES_LANGUAGES = _load('engines_languages.json')
25+ENGINES_LANGUAGES = load('engines_languages.json')
45−CURRENCIES = _load('currencies.json')
26+CURRENCIES = load('currencies.json')
46−USER_AGENTS = _load('useragents.json')
27+USER_AGENTS = load('useragents.json')
47−EXTERNAL_URLS = _load('external_urls.json')
28+EXTERNAL_URLS = load('external_urls.json')
48−WIKIDATA_UNITS = _load('wikidata_units.json')
29+WIKIDATA_UNITS = load('wikidata_units.json')
49−EXTERNAL_BANGS = _load('external_bangs.json')
50−OSM_KEYS_TAGS = _load('osm_keys_tags.json')
searx/data/ahmia_blacklist.txt−19553

This diff is too big to show here.

searx/data/bangs.jsonnew file+67913

This diff is too big to show here.

searx/data/currencies.json+7619−14643

This diff is too big to show here.

searx/data/engines_languages.json+1486−656

This diff is too big to show here.

searx/data/external_bangs.jsondeleted−19068

This diff is too big to show here.

searx/data/osm_keys_tags.jsondeleted−15416

This diff is too big to show here.

searx/data/useragents.json+3−4

This diff is too big to show here.

searx/data/wikidata_units.json+58−275

This diff is too big to show here.

searx/engines/1337x.py−14

This diff is too big to show here.

searx/engines/__init__.py+40−19

This diff is too big to show here.

searx/engines/acgsou.pynew file+70

This diff is too big to show here.

searx/engines/ahmia.py+9−12

This diff is too big to show here.

searx/engines/apkmirror.py+25−30

This diff is too big to show here.

searx/engines/archlinux.py+9−12

This diff is too big to show here.

searx/engines/arxiv.py+9−10

This diff is too big to show here.

searx/engines/bandcamp.pydeleted−73

This diff is too big to show here.

searx/engines/base.py+11−10

This diff is too big to show here.

searx/engines/bing.py+12−11

This diff is too big to show here.

searx/engines/bing_images.py+12−12

This diff is too big to show here.

searx/engines/bing_news.py+10−11

This diff is too big to show here.

searx/engines/bing_videos.py+9−11

This diff is too big to show here.

searx/engines/btdigg.py+8−14

This diff is too big to show here.

searx/engines/ccengine.pydeleted−53

This diff is too big to show here.

searx/engines/command.py+16−5

This diff is too big to show here.

searx/engines/core.pydeleted−82

This diff is too big to show here.

searx/engines/currency_convert.py−14

This diff is too big to show here.

searx/engines/dailymotion.py+11−11

This diff is too big to show here.

searx/engines/deezer.py+8−11

This diff is too big to show here.

searx/engines/deviantart.py+10−11

This diff is too big to show here.

searx/engines/dictzone.py+8−11

This diff is too big to show here.

searx/engines/digbt.py+8−10

This diff is too big to show here.

searx/engines/digg.py+8−11

This diff is too big to show here.

searx/engines/doku.py+11−14

This diff is too big to show here.

searx/engines/duckduckgo.py+53−110

This diff is too big to show here.

searx/engines/duckduckgo_definitions.py+8−12

This diff is too big to show here.

searx/engines/duckduckgo_images.py+13−15

This diff is too big to show here.

searx/engines/duden.py+7−11

This diff is too big to show here.

searx/engines/dummy-offline.py+3−11

This diff is too big to show here.

searx/engines/dummy.py+3−11

This diff is too big to show here.

searx/engines/ebay.py+9−14

This diff is too big to show here.

searx/engines/elasticsearch.py+2−6

This diff is too big to show here.

searx/engines/etools.py+8−11

This diff is too big to show here.

searx/engines/fdroid.py+7−11

This diff is too big to show here.

searx/engines/flickr.py+9−11

This diff is too big to show here.

searx/engines/flickr_noapi.py+11−12

This diff is too big to show here.

searx/engines/framalibre.py+8−11

This diff is too big to show here.

searx/engines/freesound.pydeleted−69

This diff is too big to show here.

searx/engines/frinkiac.py+8−15

This diff is too big to show here.

searx/engines/genius.py+10−12

This diff is too big to show here.

searx/engines/gentoo.py+10−11

This diff is too big to show here.

searx/engines/gigablast.py+23−35

This diff is too big to show here.

searx/engines/github.py+9−12

This diff is too big to show here.

searx/engines/google.py+79−132

This diff is too big to show here.

searx/engines/google_images.py+91−82

This diff is too big to show here.

searx/engines/google_news.py+57−167

This diff is too big to show here.

searx/engines/google_scholar.pydeleted−156

This diff is too big to show here.

searx/engines/google_videos.py+68−173

This diff is too big to show here.

searx/engines/imdb.pydeleted−55

This diff is too big to show here.

searx/engines/ina.py+15−14

This diff is too big to show here.

searx/engines/invidious.py+14−29

This diff is too big to show here.

searx/engines/json_engine.py+5−17

This diff is too big to show here.

searx/engines/kickass.py+8−11

This diff is too big to show here.

searx/engines/loc.pydeleted−68

This diff is too big to show here.

searx/engines/mediathekviewweb.pydeleted−68

This diff is too big to show here.

searx/engines/mediawiki.py+12−12

This diff is too big to show here.

searx/engines/meilisearch.pydeleted−59

This diff is too big to show here.

searx/engines/microsoft_academic.py+40−37

This diff is too big to show here.

searx/engines/mixcloud.py+8−11

This diff is too big to show here.

searx/engines/mongodb.pydeleted−61

This diff is too big to show here.

searx/engines/mysql_server.pydeleted−62

This diff is too big to show here.

searx/engines/not_evil.pynew file+64

This diff is too big to show here.

searx/engines/nyaa.py+7−11

This diff is too big to show here.

searx/engines/onesearch.pydeleted−57

This diff is too big to show here.

searx/engines/opensemantic.py+9−13

This diff is too big to show here.

searx/engines/openstreetmap.py+74−407

This diff is too big to show here.

searx/engines/pdbe.py+8−11

This diff is too big to show here.

searx/engines/peertube.py+19−21

This diff is too big to show here.

searx/engines/photon.py+9−11

This diff is too big to show here.

searx/engines/piratebay.py+9−14

This diff is too big to show here.

searx/engines/postgresql.pydeleted−69

This diff is too big to show here.

searx/engines/prowlarr.pydeleted−80

This diff is too big to show here.

searx/engines/pubmed.py+11−15

This diff is too big to show here.

searx/engines/qwant.py+86−193

This diff is too big to show here.

searx/engines/recoll.py+6−13

This diff is too big to show here.

searx/engines/reddit.py+8−11

This diff is too big to show here.

searx/engines/redis_server.pydeleted−69

This diff is too big to show here.

searx/engines/rumble.pydeleted−81

This diff is too big to show here.

searx/engines/scanr_structures.py+8−11

This diff is too big to show here.

searx/engines/searchcode_code.py+9−11

This diff is too big to show here.

searx/engines/searx_engine.py+8−10

This diff is too big to show here.

searx/engines/semantic_scholar.pydeleted−42

This diff is too big to show here.

searx/engines/sepiasearch.py+9−14

This diff is too big to show here.

searx/engines/seznam.pydeleted−66

This diff is too big to show here.

searx/engines/sjp.pydeleted−92

This diff is too big to show here.

searx/engines/solidtorrents.pydeleted−53

This diff is too big to show here.

searx/engines/solr.pydeleted−74

This diff is too big to show here.

searx/engines/soundcloud.py+11−13

This diff is too big to show here.

searx/engines/spotify.py+10−14

This diff is too big to show here.

searx/engines/springer.pydeleted−74

This diff is too big to show here.

searx/engines/sqlite.pydeleted−51

This diff is too big to show here.

searx/engines/stackexchange.pydeleted−67

This diff is too big to show here.

searx/engines/stackoverflow.pynew file+62

This diff is too big to show here.

searx/engines/startpage.py+30−112

This diff is too big to show here.

searx/engines/tineye.pydeleted−86

This diff is too big to show here.

searx/engines/tokyotoshokan.py+8−11

This diff is too big to show here.

searx/engines/torrentz.py+9−11

This diff is too big to show here.

searx/engines/translated.py+7−11

This diff is too big to show here.

searx/engines/unsplash.py+8−11

This diff is too big to show here.

searx/engines/vimeo.py+13−14

This diff is too big to show here.

searx/engines/wikidata.py+10−12

This diff is too big to show here.

searx/engines/wikipedia.py+11−30

This diff is too big to show here.

searx/engines/wolframalpha_api.py+9−14

This diff is too big to show here.

searx/engines/wolframalpha_noapi.py+10−15

This diff is too big to show here.

searx/engines/wordnik.pydeleted−77

This diff is too big to show here.

searx/engines/www1x.py+8−11

This diff is too big to show here.

searx/engines/xpath.py+1−5

This diff is too big to show here.

searx/engines/xpath_flex.pydeleted−121

This diff is too big to show here.

searx/engines/yacy.py+16−16

This diff is too big to show here.

searx/engines/yahoo.py+101−104

This diff is too big to show here.

searx/engines/yahoo_news.py+82−85

This diff is too big to show here.

searx/engines/yandex.pynew file+69

This diff is too big to show here.

searx/engines/yggtorrent.py+13−18

This diff is too big to show here.

searx/engines/youtube_api.py+10−14

This diff is too big to show here.

searx/engines/youtube_noapi.py+17−85

This diff is too big to show here.

searx/external_bang.py+26−76

This diff is too big to show here.

searx/external_urls.py+2−14

This diff is too big to show here.

searx/languages.py+3−1

This diff is too big to show here.

searx/metrology/error_recorder.py+17−14

This diff is too big to show here.

searx/network/__init__.pydeleted−188

This diff is too big to show here.

searx/network/client.pydeleted−219

This diff is too big to show here.

searx/network/network.pydeleted−358

This diff is too big to show here.

searx/plugins/__init__.py−2

This diff is too big to show here.

searx/plugins/hostname_replace.pydeleted−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.pynew file+221

This diff is too big to show here.

searx/preferences.py+8−8

This diff is too big to show here.

searx/query.py+118−286

This diff is too big to show here.

searx/network/raise_for_httperror.py → searx/raise_for_httperror.pyrenamed

The content is the same.

searx/results.py+6−24

This diff is too big to show here.

searx/search/__init__.py+61−9

This diff is too big to show here.

searx/search/checker/__init__.pydeleted−4

This diff is too big to show here.

searx/search/checker/__main__.pydeleted−95

This diff is too big to show here.

searx/search/checker/background.pydeleted−125

This diff is too big to show here.

searx/search/checker/impl.pydeleted−416

This diff is too big to show here.

searx/search/models.pydeleted−71

This diff is too big to show here.

searx/search/processors/abstract.py+2−15

This diff is too big to show here.

searx/search/processors/online.py+25−74

This diff is too big to show here.

searx/search/processors/online_currency.py−12

This diff is too big to show here.

searx/search/processors/online_dictionary.py−18

This diff is too big to show here.

searx/settings.yml+138−812

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+2−8

This diff is too big to show here.

searx/shared/__init__.pydeleted−31

This diff is too big to show here.

searx/shared/shared_abstract.pydeleted−21

This diff is too big to show here.

searx/shared/shared_simple.pydeleted−39

This diff is too big to show here.

searx/shared/shared_uwsgi.pydeleted−64

This diff is too big to show here.

searx/static/css/bootstrap.min.cssnew file+1

This diff is too big to show here.

searx/static/fonts/glyphicons-halflings-regular.eotnew file

Binary file not shown.

searx/static/fonts/glyphicons-halflings-regular.svgnew file+229

This diff is too big to show here.

searx/static/fonts/glyphicons-halflings-regular.ttfnew file

Binary file not shown.

searx/static/fonts/glyphicons-halflings-regular.woffnew file

Binary file not shown.

searx/static/js/bootstrap.min.jsnew file+6

This diff is too big to show here.

searx/static/js/html5shiv.min.jsnew file+4

This diff is too big to show here.

searx/static/js/jquery-1.11.1.min.jsnew file+4

This diff is too big to show here.

searx/static/js/require-2.1.15.min.jsnew file+36

This diff is too big to show here.

searx/static/js/respond.min.jsnew file+5

This diff is too big to show here.

searx/static/js/typeahead.bundle.min.jsnew file+7

This diff is too big to show here.

searx/static/less/bootstrap/.csscomb.jsonnew file+297

This diff is too big to show here.

searx/static/less/bootstrap/.csslintrcnew file+19

This diff is too big to show here.

searx/static/less/bootstrap/alerts.lessnew file+68

This diff is too big to show here.

searx/static/less/bootstrap/badges.lessnew file+55

This diff is too big to show here.

searx/static/less/bootstrap/bootstrap.lessnew file+53

This diff is too big to show here.

searx/static/less/bootstrap/breadcrumbs.lessnew file+26

This diff is too big to show here.

searx/static/less/bootstrap/button-groups.lessnew file+240

This diff is too big to show here.

searx/static/less/bootstrap/buttons.lessnew file+157

This diff is too big to show here.

searx/static/less/bootstrap/carousel.lessnew file+243

This diff is too big to show here.

searx/static/less/bootstrap/close.lessnew file+33

This diff is too big to show here.

searx/static/less/bootstrap/code.lessnew file+68

This diff is too big to show here.

searx/static/less/bootstrap/component-animations.lessnew file+31

This diff is too big to show here.

searx/static/less/bootstrap/dropdowns.lessnew file+215

This diff is too big to show here.

searx/static/less/bootstrap/forms.lessnew file+540

This diff is too big to show here.

searx/static/less/bootstrap/glyphicons.lessnew file+233

This diff is too big to show here.

searx/static/less/bootstrap/grid.lessnew file+84

This diff is too big to show here.

searx/static/less/bootstrap/input-groups.lessnew file+166

This diff is too big to show here.

searx/static/less/bootstrap/jumbotron.lessnew file+48

This diff is too big to show here.

searx/static/less/bootstrap/labels.lessnew file+64

This diff is too big to show here.

searx/static/less/bootstrap/list-group.lessnew file+131

This diff is too big to show here.

searx/static/less/bootstrap/media.lessnew file+56

This diff is too big to show here.

searx/static/less/bootstrap/mixins.lessnew file+39

This diff is too big to show here.

searx/static/less/bootstrap/mixins/alerts.lessnew file+14

This diff is too big to show here.

searx/static/less/bootstrap/mixins/background-variant.lessnew file+8

This diff is too big to show here.

searx/static/less/bootstrap/mixins/border-radius.lessnew file+18

This diff is too big to show here.

searx/static/less/bootstrap/mixins/buttons.lessnew file+50

This diff is too big to show here.

searx/static/less/bootstrap/mixins/center-block.lessnew file+7

This diff is too big to show here.

searx/static/less/bootstrap/mixins/clearfix.lessnew file+22

This diff is too big to show here.

searx/static/less/bootstrap/mixins/forms.lessnew file+81

This diff is too big to show here.

searx/static/less/bootstrap/mixins/gradients.lessnew file+59

This diff is too big to show here.

searx/static/less/bootstrap/mixins/grid-framework.lessnew file+91

This diff is too big to show here.

searx/static/less/bootstrap/mixins/grid.lessnew file+122

This diff is too big to show here.

searx/static/less/bootstrap/mixins/hide-text.lessnew file+21

This diff is too big to show here.

searx/static/less/bootstrap/mixins/image.lessnew file+34

This diff is too big to show here.

searx/static/less/bootstrap/mixins/labels.lessnew file+12

This diff is too big to show here.

searx/static/less/bootstrap/mixins/list-group.lessnew file+29

This diff is too big to show here.

searx/static/less/bootstrap/mixins/nav-divider.lessnew file+10

This diff is too big to show here.

searx/static/less/bootstrap/mixins/nav-vertical-align.lessnew file+9

This diff is too big to show here.

searx/static/less/bootstrap/mixins/opacity.lessnew file+8

This diff is too big to show here.

searx/static/less/bootstrap/mixins/pagination.lessnew file+23

This diff is too big to show here.

searx/static/less/bootstrap/mixins/panels.lessnew file+24

This diff is too big to show here.

searx/static/less/bootstrap/mixins/progress-bar.lessnew file+10

This diff is too big to show here.

searx/static/less/bootstrap/mixins/reset-filter.lessnew file+8

This diff is too big to show here.

searx/static/less/bootstrap/mixins/resize.lessnew file+6

This diff is too big to show here.

searx/static/less/bootstrap/mixins/responsive-visibility.lessnew file+15

This diff is too big to show here.

searx/static/less/bootstrap/mixins/size.lessnew file+10

This diff is too big to show here.

searx/static/less/bootstrap/mixins/tab-focus.lessnew file+9

This diff is too big to show here.

searx/static/less/bootstrap/mixins/table-row.lessnew file+28

This diff is too big to show here.

searx/static/less/bootstrap/mixins/text-emphasis.lessnew file+8

This diff is too big to show here.

searx/static/less/bootstrap/mixins/text-overflow.lessnew file+8

This diff is too big to show here.

searx/static/less/bootstrap/mixins/vendor-prefixes.lessnew file+224

This diff is too big to show here.

searx/static/less/bootstrap/modals.lessnew file+150

This diff is too big to show here.

searx/static/less/bootstrap/navbar.lessnew file+655

This diff is too big to show here.

searx/static/less/bootstrap/navs.lessnew file+242

This diff is too big to show here.

searx/static/less/bootstrap/normalize.lessnew file+425

This diff is too big to show here.

searx/static/less/bootstrap/pager.lessnew file+55

This diff is too big to show here.

searx/static/less/bootstrap/pagination.lessnew file+88

This diff is too big to show here.

searx/static/less/bootstrap/panels.lessnew file+243

This diff is too big to show here.

searx/static/less/bootstrap/popovers.lessnew file+133

This diff is too big to show here.

searx/static/less/bootstrap/print.lessnew file+101

This diff is too big to show here.

searx/static/less/bootstrap/progress-bars.lessnew file+105

This diff is too big to show here.

searx/static/less/bootstrap/responsive-embed.lessnew file+34

This diff is too big to show here.

searx/static/less/bootstrap/responsive-utilities.lessnew file+194

This diff is too big to show here.

searx/static/less/bootstrap/scaffolding.lessnew file+150

This diff is too big to show here.

searx/static/less/bootstrap/tables.lessnew file+233

This diff is too big to show here.

searx/static/less/bootstrap/theme.lessnew file+258

This diff is too big to show here.

searx/static/less/bootstrap/thumbnails.lessnew file+36

This diff is too big to show here.

searx/static/less/bootstrap/tooltip.lessnew file+95

This diff is too big to show here.

searx/static/less/bootstrap/type.lessnew file+313

This diff is too big to show here.

searx/static/less/bootstrap/typeahead.lessnew file+153

This diff is too big to show here.

searx/static/less/bootstrap/utilities.lessnew file+57

This diff is too big to show here.

searx/static/less/bootstrap/variables.lessnew file+846

This diff is too big to show here.

searx/static/less/bootstrap/wells.lessnew file+29

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.cssdeleted−587

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap-theme.min.cssdeleted−6

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap-theme.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap.cssdeleted−6990

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap.min.cssdeleted−5

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/images/layers-2x.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/layers.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/marker-icon-2x.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/marker-icon.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/marker-shadow.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/leaflet.cssdeleted−640

This diff is too big to show here.

searx/static/themes/oscar/css/leaflet.min.css+93−1

This diff is too big to show here.

searx/static/themes/oscar/css/leaflet.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev-dark.css+177−270

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.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev.css+180−283

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.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/pointhi.css+104−185

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.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.eotdeleted

Binary file not shown.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.svgdeleted−288

This diff is too big to show here.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.ttfdeleted

Binary file not shown.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woffdeleted

Binary file not shown.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woff2deleted

Binary file not shown.

searx/static/themes/oscar/gruntfile.js+29−86

This diff is too big to show here.

searx/static/themes/oscar/img/icons/bandcamp.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/map/layers-2x.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/layers.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon-2x-green.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon-2x-orange.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon-2x-red.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon-2x.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon-green.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon-orange.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon-red.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-icon.pngnew file

Binary file not shown.

searx/static/themes/oscar/img/map/marker-shadow.pngnew file

Binary file not shown.

searx/static/themes/oscar/js/bootstrap.bundle.min.jsdeleted−7

This diff is too big to show here.

searx/static/themes/oscar/js/bootstrap.min.jsdeleted−6

This diff is too big to show here.

searx/static/themes/oscar/js/jquery.min.jsdeleted−2

This diff is too big to show here.

searx/static/themes/oscar/js/leaflet-0.7.3.min.jsnew file+9

This diff is too big to show here.

searx/static/themes/oscar/js/leaflet.jsdeleted−6

This diff is too big to show here.

searx/static/themes/oscar/js/searx.js+158−231

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.jsnew file+23

This diff is too big to show here.

searx/static/themes/oscar/src/js/01_init.js → searx/static/themes/oscar/js/searx_src/01_init.jsrenamed+1−5

This diff is too big to show here.

searx/static/themes/oscar/src/js/autocompleter.js → searx/static/themes/oscar/js/searx_src/autocompleter.jsrenamed+13−24

This diff is too big to show here.

searx/static/themes/oscar/src/js/element_modifiers.js → searx/static/themes/oscar/js/searx_src/element_modifiers.jsrenamed−6

This diff is too big to show here.

searx/static/themes/oscar/src/js/infobox.js → searx/static/themes/oscar/js/searx_src/infobox.jsrenamed

The content is the same.

searx/static/themes/oscar/js/searx_src/leaflet_map.jsnew file+167

This diff is too big to show here.

searx/static/themes/oscar/src/js/toggleall.js → searx/static/themes/oscar/js/searx_src/toggleall.jsrenamed

The content is the same.

searx/static/themes/oscar/js/typeahead.bundle.min.jsdeleted−9

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev-dark/oscar.less → searx/static/themes/oscar/less/logicodev-dark/oscar.lessrenamed+4−16

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/advanced.less → searx/static/themes/oscar/less/logicodev/advanced.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/logicodev/checkbox.less → searx/static/themes/oscar/less/logicodev/checkbox.lessrenamed

The content is the same.

searx/static/themes/oscar/less/logicodev/code.lessnew file+101

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/cursor.less → searx/static/themes/oscar/less/logicodev/cursor.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/logicodev/footer.less → searx/static/themes/oscar/less/logicodev/footer.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/logicodev/infobox.less → searx/static/themes/oscar/less/logicodev/infobox.lessrenamed−5

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/navbar.less → searx/static/themes/oscar/less/logicodev/navbar.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/logicodev/onoff.less → searx/static/themes/oscar/less/logicodev/onoff.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/logicodev/oscar.less → searx/static/themes/oscar/less/logicodev/oscar.lessrenamed

The content is the same.

searx/static/themes/oscar/less/logicodev/preferences.lessnew file+15

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/results.less → searx/static/themes/oscar/less/logicodev/results.lessrenamed+7−62

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/search.less → searx/static/themes/oscar/less/logicodev/search.lessrenamed+10−5

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/variables.less → searx/static/themes/oscar/less/logicodev/variables.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/pointhi/advanced.less → searx/static/themes/oscar/less/pointhi/advanced.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/pointhi/checkbox.less → searx/static/themes/oscar/less/pointhi/checkbox.lessrenamed

The content is the same.

searx/static/themes/oscar/less/pointhi/code.lessnew file+79

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/cursor.less → searx/static/themes/oscar/less/pointhi/cursor.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/pointhi/footer.less → searx/static/themes/oscar/less/pointhi/footer.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/pointhi/infobox.less → searx/static/themes/oscar/less/pointhi/infobox.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/pointhi/navbar.less → searx/static/themes/oscar/less/pointhi/navbar.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/pointhi/onoff.less → searx/static/themes/oscar/less/pointhi/onoff.lessrenamed

The content is the same.

searx/static/themes/oscar/src/less/pointhi/oscar.less → searx/static/themes/oscar/less/pointhi/oscar.lessrenamed−2

This diff is too big to show here.

searx/static/themes/oscar/less/pointhi/preferences.lessnew file+3

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/results.less → searx/static/themes/oscar/less/pointhi/results.lessrenamed−4

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/search.less → searx/static/themes/oscar/less/pointhi/search.lessrenamed

The content is the same.

searx/static/themes/oscar/package.json+7−12

This diff is too big to show here.

searx/static/themes/oscar/src/js/leaflet_map.jsdeleted−79

This diff is too big to show here.

searx/static/themes/oscar/src/less/bootstrap/bootstrap.lessdeleted−3

This diff is too big to show here.

searx/static/themes/oscar/src/less/bootstrap/typeahead.lessdeleted−154

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/code.lessdeleted−14

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/preferences.lessdeleted−31

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/pygments.lessdeleted−99

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/code.lessdeleted−2

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/preferences.lessdeleted−19

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/pygments.lessdeleted−99

This diff is too big to show here.

searx/static/themes/simple/css/searx-rtl.css+83−164

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+83−164

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+240−165

This diff is too big to show here.

searx/static/themes/simple/js/searx.min.js+4−5

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/__common__/js/image_layout.js → searx/static/themes/simple/js/searx_src/searx_imageresult.jsrenamed+49−61

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+80−5

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.lessdeleted−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.tplnew file+1

This diff is too big to show here.

searx/templates/oscar/base.html+14−12

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+10−24

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+56−60

This diff is too big to show here.

searx/templates/oscar/result_templates/products.html+1−2

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+1−12

This diff is too big to show here.

searx/templates/simple/base.html+2−1

This diff is too big to show here.

searx/templates/simple/preferences.html+2−13

This diff is too big to show here.

searx/templates/simple/result_templates/map.html+52−35

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

This diff is too big to show here.

searx/translations/bg/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/bo/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ca/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/cs/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/cs/LC_MESSAGES/messages.po+92−93

This diff is too big to show here.

searx/translations/cy/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/da/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/de/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/de/LC_MESSAGES/messages.po+19−21

This diff is too big to show here.

searx/translations/el_GR/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/en/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/eo/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/es/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/es/LC_MESSAGES/messages.po+19−20

This diff is too big to show here.

searx/translations/et/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/et/LC_MESSAGES/messages.po+18−18

This diff is too big to show here.

searx/translations/eu/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/eu/LC_MESSAGES/messages.po+21−22

This diff is too big to show here.

searx/translations/fa_IR/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fi/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fil/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fr/LC_MESSAGES/messages.po+21−21

This diff is too big to show here.

searx/translations/gl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/gl/LC_MESSAGES/messages.po+51−52

This diff is too big to show here.

searx/translations/he/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/he/LC_MESSAGES/messages.po+17−18

This diff is too big to show here.

searx/translations/hr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/hr/LC_MESSAGES/messages.po+22−23

This diff is too big to show here.

searx/translations/hu/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ia/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/it/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/it/LC_MESSAGES/messages.po+23−23

This diff is too big to show here.

searx/translations/ja/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/lt/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/lt/LC_MESSAGES/messages.po+24−24

This diff is too big to show here.

searx/translations/nl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/nl/LC_MESSAGES/messages.po+20−21

This diff is too big to show here.

searx/translations/nl_BE/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/nl_BE/LC_MESSAGES/messages.po+19−20

This diff is too big to show here.

searx/translations/oc/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/pl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/pt/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/pt_BR/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/pt_BR/LC_MESSAGES/messages.po+19−20

This diff is too big to show here.

searx/translations/ro/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ru/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ru/LC_MESSAGES/messages.po+21−22

This diff is too big to show here.

searx/translations/sk/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sr/LC_MESSAGES/messages.po+23−24

This diff is too big to show here.

searx/translations/sv/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sv/LC_MESSAGES/messages.po+22−22

This diff is too big to show here.

searx/translations/ta/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/te/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/tr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/tr/LC_MESSAGES/messages.po+134−135

This diff is too big to show here.

searx/translations/uk/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/vi/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/zh_CN/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/zh_CN/LC_MESSAGES/messages.po+20−21

This diff is too big to show here.

searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/zh_TW/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/zh_TW/LC_MESSAGES/messages.po+18−19

This diff is too big to show here.

searx/utils.py+7−13

This diff is too big to show here.

searx/version.py+2−2

This diff is too big to show here.

searx/webadapter.py+2−14

This diff is too big to show here.

searx/webapp.py+105−200

This diff is too big to show here.

searx/webutils.py+1−4

This diff is too big to show here.

searx_extra/__init__.py

This diff is too big to show here.

searx_extra/update/__init__.py

This diff is too big to show here.

searx_extra/update/update_currencies.py−150

This diff is too big to show here.

searx_extra/update/update_engine_descriptions.py−202

This diff is too big to show here.

searx_extra/update/update_external_bangs.py−157

This diff is too big to show here.

searx_extra/update/update_osm_keys_tags.py−209

This diff is too big to show here.

searx_extra/update/update_pygments.py−138

This diff is too big to show here.

searx_extra/update/update_wikidata_units.py−54

This diff is too big to show here.

setup.py+6−5

This diff is too big to show here.

tests/unit/network/__init__.py

This diff is too big to show here.

tests/unit/network/test_network.py−239

This diff is too big to show here.

tests/unit/test_engines_init.py+1−1

This diff is too big to show here.

tests/unit/test_external_bangs.py−117

This diff is too big to show here.

tests/unit/test_poolrequests.py+89

This diff is too big to show here.

tests/unit/test_query.py−183

This diff is too big to show here.

tests/unit/test_results.py+4−4

This diff is too big to show here.

tests/unit/test_standalone_searx.py+19−1

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+4−28

This diff is too big to show here.

tests/unit/test_webutils.py−22

This diff is too big to show here.

utils/build_env.py+24−20

This diff is too big to show here.

utils/fabfile.py+117

This diff is too big to show here.

utils/fetch_ahmia_blacklist.py+4−1

This diff is too big to show here.

utils/fetch_currencies.py+163

This diff is too big to show here.

utils/fetch_firefox_version.py+6−1

This diff is too big to show here.

utils/fetch_languages.py+8−6

This diff is too big to show here.

utils/fetch_wikidata_units.py+47

This diff is too big to show here.

utils/filtron.sh+2−2

This diff is too big to show here.

utils/google_search.py

This diff is too big to show here.

utils/lib.sh+4−311

This diff is too big to show here.

utils/lxc-searx.env+2−1

This diff is too big to show here.

utils/lxc.sh+6−6

This diff is too big to show here.

utils/makefile.include+49−10

This diff is too big to show here.

utils/makefile.python+252

This diff is too big to show here.

utils/makefile.sphinx+201

This diff is too big to show here.

utils/searx.sh+6−7

This diff is too big to show here.

utils/site-python/sphinx_build_tools.py+48

This diff is too big to show here.

utils/standalone_searx.py+2−2

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.

utils/templates/etc/uwsgi/apps-archlinux/searx.ini+1−4

This diff is too big to show here.

utils/templates/etc/uwsgi/apps-available/searx.ini−3

This diff is too big to show here.

utils/update-translations.sh

This diff is too big to show here.