@@ -26,8 +26,12 @@ fi
26# ---------
26# ---------
28# SEARX_INTERNAL_URL="127.0.0.1:8888"
28# SEARX_INTERNAL_URL="127.0.0.1:8888"
29+# SEARX_SETTINGS_TEMPLATE="${REPO_ROOT}/utils/templates/etc/searx/use_default_settings.yml"
30−# Only change, if you maintain a searx brand in your searx fork.
31+# Only change, if you maintain a searx brand in your searx fork (GIT_URL) which
32+# is not hold by branch 'master'. The branch has to be a local branch, in the
33+# repository from which you install (which is most often the case). If you want
34+# to install branch 'foo', don't forget to run 'git branch foo origin/foo' once.
31# GIT_BRANCH="${GIT_BRANCH:-master}"
35# GIT_BRANCH="${GIT_BRANCH:-master}"
33# filtron.sh
37# filtron.sh
@@ -1,15 +1,6 @@
2branch = True
2branch = True
3−source =
3+source = searx
7− searx/https_rewrite.py
15show_missing = True
6show_missing = True
@@ -25,7 +25,7 @@
25;; Alternatively create the virtualenv, source it and install jedi + epc
25;; Alternatively create the virtualenv, source it and install jedi + epc
26;; (required by `emacs-jedi <https://tkf.github.io/emacs-jedi>`_)::
26;; (required by `emacs-jedi <https://tkf.github.io/emacs-jedi>`_)::
28−;; $ virtualenv --python=python3 "--no-site-packages" ./local/py3
28+;; $ python -m venv ./local/py3
30;; $ source ./local/py3/bin/activate
30;; $ source ./local/py3/bin/activate
31;; (py3)$ # now install into the activated 'py3' environment ..
31;; (py3)$ # now install into the activated 'py3' environment ..
@@ -46,4 +46,11 @@ node_modules/
46*/*/*/node_modules/
46*/*/*/node_modules/
47*/*/*/*/node_modules/
47*/*/*/*/node_modules/
.github/ISSUE_TEMPLATE/bug-report.mdnew file+39
@@ -0,0 +1,39 @@
3+about: Report a bug in Searx
9+<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SEARX -->
11+**Version of Searx, commit number if you are using on master branch and stipulate if you forked Searx**
12+<!-- If you are running on master branch using git execute this command
13+in order to fetch the latest commit ID:
17+If you are using searx-docker then look at the bottom of the Searx page
18+and check for the version after "Powered by searx"
20+Please also stipulate if you are using a forked version of Searx and
21+include a link to the fork source code.
23+**How did you install Searx?**
24+<!-- Did you install Searx using the official wiki or using searx-docker
25+or manually by executing the searx/webapp.py file? -->
27+<!-- A clear and concise description of what the bug is. -->
30+<!-- How can we reproduce this issue? (as minimally and as precisely as possible) -->
33+<!-- A clear and concise description of what you expected to happen. -->
35+**Screenshots & Logs**
36+<!-- If applicable, add screenshots, logs to help explain your problem. -->
38+**Additional context**
39+<!-- Add any other context about the problem here. -->
.github/ISSUE_TEMPLATE/config.ymlnew file+14
@@ -0,0 +1,14 @@
1+blank_issues_enabled: true
3+ - name: Installation issue using the official wiki
4+ url: https://github.com/searx/searx/discussions/new?category_id=32001257
5+ about: Ask for help if you are having some issue with installing Searx using the official wiki.
6+ - name: Installation issue using searx-docker
7+ url: https://github.com/searx/searx/discussions/new?category_id=32001259
8+ about: Ask for help if you are having some issue with installing Searx using searx-docker.
9+ - name: Installation issue without using the official wiki nor searx-docker
10+ url: https://github.com/searx/searx/discussions/new?category_id=32001260
11+ about: Ask for help if you are having some issue with installing Searx manually without using the wiki nor searx-docker.
12+ - name: Report a bug on a public Searx instance
13+ url: https://github.com/searx/searx/discussions/new?category_id=32001412
14+ about: Report a bug that you discovered on a public Searx instance.
.github/ISSUE_TEMPLATE/engine-request.mdnew file+31
@@ -0,0 +1,31 @@
3+about: Request a new engine in Searx
5+labels: enhancement, engine request
9+<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SEARX -->
11+**Working URL to the engine**
12+<!-- Please check if the engine is responding correctly before submitting it. -->
14+**Why do you want to add this engine?**
15+<!-- What's special about this engine? Is it open source or libre? -->
17+**Features of this engine**
18+<!-- Features of this engine: Doesn't track its users, fast, easy to integrate, ... -->
20+**How can Searx fetch the information from this engine?**
21+<!-- List API URL, example code (using the correct markdown) and more
22+that could be useful for the developers in order to implement this engine.
23+If you don't know what to write, let this part blank.>
25+**Applicable category of this engine**
26+<!-- Where should this new engine fit in Searx? Current categories in Searx:
27+general, files, images, it, map, music, news, science, social media and videos.
28+You can add multiple categories at the same time. -->
30+**Additional context**
31+<!-- Add any other context about this engine here. -->
.github/ISSUE_TEMPLATE/feature-request.mdnew file+21
@@ -0,0 +1,21 @@
3+about: Request a new feature in Searx
9+<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SEARX -->
11+**Is your feature request related to a problem? Please describe.**
12+<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
14+**Describe the solution you'd like**
15+<!-- A clear and concise description of what you want to happen. -->
17+**Describe alternatives you've considered**
18+<!-- A clear and concise description of any alternative solutions or features you've considered. -->
20+**Additional context**
21+<!-- Add any other context or screenshots about the feature request here. -->
.github/dependabot.ymlnew file+10
@@ -0,0 +1,10 @@
1+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
4+ - package-ecosystem: "pip"
9+ open-pull-requests-limit: 5
10+ target-branch: "master"
.github/workflows/data-update.ymlnew file+66
@@ -0,0 +1,66 @@
1+name: "Update searx.data"
9+ name: Update data - ${{ matrix.fetch }}
10+ runs-on: ubuntu-20.04
11+ if: ${{ github.repository_owner == 'searx'}}
15+ - update_ahmia_blacklist.py
16+ - update_currencies.py
17+ - update_external_bangs.py
18+ - update_firefox_version.py
19+ - update_languages.py
20+ - update_wikidata_units.py
23+ uses: actions/checkout@v2
25+ - name: Install Ubuntu packages
27+ sudo ./utils/searx.sh install packages
29+ - name: Set up Python
30+ uses: actions/setup-python@v2
32+ python-version: '3.10'
35+ - name: Install Python dependencies
41+ FETCH_SCRIPT: ./searx_extra/update/${{ matrix.fetch }}
43+ V=1 ./manage pyenv.cmd python "$FETCH_SCRIPT"
45+ - name: Create Pull Request
47+ uses: peter-evans/create-pull-request@v3
49+ token: ${{ secrets.DATA_PR_TOKEN }}
50+ commit-message: Update searx.data - ${{ matrix.fetch }}
51+ committer: searx-bot <noreply@github.com>
52+ author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
54+ branch: update_data_${{ matrix.fetch }}
57+ title: 'Update searx.data - ${{ matrix.fetch }}'
59+ Update searx.data - ${{ matrix.fetch }}
63+ - name: Check outputs
65+ echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
66+ echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
.github/workflows/integration.ymlnew file+151
@@ -0,0 +1,151 @@
11+ name: Python ${{ matrix.python-version }}
12+ runs-on: ubuntu-20.04
16+ python-version: [3.7, 3.8, 3.9, "3.10"]
19+ uses: actions/checkout@v2
20+ - name: Install Ubuntu packages
22+ sudo ./utils/searx.sh install packages
23+ sudo apt install firefox
24+ - name: Set up Python
25+ uses: actions/setup-python@v2
27+ python-version: ${{ matrix.python-version }}
29+ - name: Cache Python dependencies
31+ uses: actions/cache@v2
34+ key: python-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt', 'setup.py') }}
35+ - name: Install Python dependencies
36+ if: steps.cache-python.outputs.cache-hit != 'true'
39+ make V=1 gecko.driver
41+ run: make V=1 ci.test
42+ - name: Test coverage
43+ run: make V=1 test.coverage
44+ - name: Store coverage result
45+ uses: actions/upload-artifact@v2
47+ name: coverage-${{ matrix.python-version }}
53+ runs-on: ubuntu-20.04
56+ uses: actions/checkout@v2
57+ - name: Install Ubuntu packages
58+ run: sudo ./utils/searx.sh install packages
59+ - name: Set up Python
60+ uses: actions/setup-python@v2
62+ python-version: '3.9'
64+ - name: Cache Python dependencies
66+ uses: actions/cache@v2
69+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
70+ - name: Install node dependencies
71+ run: make V=1 node.env
73+ run: make V=1 themes.all
77+ runs-on: ubuntu-20.04
80+ uses: actions/checkout@v2
83+ persist-credentials: false
84+ - name: Install Ubuntu packages
85+ run: sudo ./utils/searx.sh install buildhost
86+ - name: Set up Python
87+ uses: actions/setup-python@v2
89+ python-version: '3.10'
91+ - name: Cache Python dependencies
93+ uses: actions/cache@v2
96+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
97+ - name: Build documentation
99+ make V=1 docs.clean docs.html
101+ if: github.ref == 'refs/heads/master'
102+ uses: JamesIves/github-pages-deploy-action@3.7.1
104+ GITHUB_TOKEN: ${{ github.token }}
107+ CLEAN: true # Automatically remove deleted files from the deploy branch
111+ if: github.ref == 'refs/heads/master'
117+ DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
118+ runs-on: ubuntu-20.04
121+ if: env.DOCKERHUB_USERNAME != null
122+ uses: actions/checkout@v2
124+ # make sure "make docker.push" can get the git history
126+ - name: Set up Python
127+ uses: actions/setup-python@v2
129+ python-version: '3.9'
131+ - name: Cache Python dependencies
133+ uses: actions/cache@v2
136+ key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
138+ if: env.DOCKERHUB_USERNAME != null
139+ uses: docker/setup-qemu-action@v1
140+ - name: Set up Docker Buildx
141+ if: env.DOCKERHUB_USERNAME != null
142+ uses: docker/setup-buildx-action@v1
143+ - name: Login to DockerHub
144+ if: env.DOCKERHUB_USERNAME != null
145+ uses: docker/login-action@v1
147+ username: ${{ secrets.DOCKERHUB_USERNAME }}
148+ password: ${{ secrets.DOCKERHUB_TOKEN }}
149+ - name: Build and push
150+ if: env.DOCKERHUB_USERNAME != null
151+ run: make -e GIT_URL=$(git remote get-url origin) docker.push
@@ -15,6 +15,7 @@ setup.cfg
19/node_modules
20/node_modules
@@ -25,3 +26,5 @@ dist/
27searx.egg-info/
28searx.egg-info/
@@ -12,7 +12,7 @@
12# A comma-separated list of package or module names from where C extensions may
12# A comma-separated list of package or module names from where C extensions may
13# be loaded. Extensions are loading into the active Python interpreter and may
13# be loaded. Extensions are loading into the active Python interpreter and may
14# run arbitrary code
14# run arbitrary code
15−extension-pkg-whitelist=
15+extension-pkg-whitelist=lxml.etree
17# Add files or directories to the blacklist. They should be base names, not
17# Add files or directories to the blacklist. They should be base names, not
@@ -59,7 +59,7 @@ confidence=
59# --enable=similarities". If you want to run only the classes checker, but have
59# --enable=similarities". If you want to run only the classes checker, but have
60# no Warning level messages displayed, use"--disable=all --enable=classes
60# no Warning level messages displayed, use"--disable=all --enable=classes
61# --disable=W"
61# --disable=W"
62−disable=bad-whitespace, duplicate-code
62+disable=bad-whitespace, duplicate-code, consider-using-f-string
64# Enable the message, report, category or checker with the given id(s). You can
64# Enable the message, report, category or checker with the given id(s). You can
65# either give multiple identifier separated by comma (,) or put this option
65# either give multiple identifier separated by comma (,) or put this option
@@ -1,57 +0,0 @@
12− - which python; python --version
14− - make V=1 gecko.driver
16− - make V=1 travis.codecov
21− - make V=1 test.coverage
27− if: branch = master AND type != pull_request AND env(DOCKER_USERNAME) IS present
47− - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
48− - make -e GIT_URL=$(git remote get-url origin) docker.push
54− - "irc.freenode.org#searx"
56− - "%{repository}/#%{build_number}/%{branch} (%{author}): %{message} %{build_url}"
@@ -1,4 +1,4 @@
1−Searx was created by Adam Tauber and is maintained by Adam Tauber, Alexandre Flament, Noémi Ványi, @pofilo and Markus Heiser.
1+Searx was created by Adam Tauber and is maintained by Adam Tauber, Noémi Ványi, @pofilo, Gaspard d'Hautefeuille and Émilien Devos.
3Major contributing authors:
3Major contributing authors:
@@ -11,8 +11,10 @@ Major contributing authors:
11- Marc Abonce Seguin @a01200356
11- Marc Abonce Seguin @a01200356
13- Markus Heiser @return42
13- Markus Heiser @return42
14+- Émilien Devos @unixfox
15−People who have submitted patches/translates, reported bugs, consulted features or
17+People who have submitted patches/translations, reported bugs, consulted features or
16generally made searx better:
18generally made searx better:
18- Laszlo Hammerl
20- Laszlo Hammerl
@@ -65,7 +67,6 @@ generally made searx better:
65- @firebovine
67- @firebovine
66- Lorenzo J. Lucchini @luccoj
68- Lorenzo J. Lucchini @luccoj
67- @eig8phei
69- @eig8phei
70- Jannik Winkel @kiney
71- Jannik Winkel @kiney
71- @juanitobananas
72- @juanitobananas
@@ -96,7 +97,7 @@ generally made searx better:
96- Alice Ferrazzi @aliceinwire
97- Alice Ferrazzi @aliceinwire
97- @LiquidLemon
98- @LiquidLemon
99−- @Venca24
100+- Václav Zouzalík @Venca24
101- Ivan Skytte Jørgensen @isj-privacore
102- Ivan Skytte Jørgensen @isj-privacore
@@ -110,7 +111,6 @@ generally made searx better:
110- Nick Espig @nachtalb
111- Nick Espig @nachtalb
111- Rachmadani Haryono @rachmadaniHaryono
112- Rachmadani Haryono @rachmadaniHaryono
112- Frank de Lange @yetangitu
113- Frank de Lange @yetangitu
113−- Émilien Devos @unifox
114- Nicolas Gelot @nfk
114- Nicolas Gelot @nfk
116- Mathieu Brunot @madmath03
116- Mathieu Brunot @madmath03
@@ -124,3 +124,45 @@ generally made searx better:
124- @CaffeinatedTech
124- @CaffeinatedTech
125- Robin Schneider @ypid
125- Robin Schneider @ypid
126- @splintah
126- @splintah
127+- Lukas van den Berk @lukasvdberk
129+- Jason Kaltsikis @jjasonkal
130+- Sion Kazama @KazamaSion
132+- Mostafa Ahangarha @ahangarha
134+- Sophie Tauchert @999eagle
136+- Michael Ilsaas `<https://mikeri.net>`_
138+- rachmadani haryono @rachmadaniHaryono
139+- Mohamad Safadieh @msafadieh
145+- Lukáš Kucharczyk @KucharczykL
146+- Lynda Lopez @lyndalopez544
147+- M. Efe Çetin @efectn
148+- Nícholas Kegler @nicholasks
150+- Scott Wallace @scottwallacesh
167+- @OliveiraHermogenes
168+- Paul Alcock @Guilvareux
@@ -1,3 +1,336 @@
7+- drop support for Python 3.5 ( #2459 )
8+- add support for Python 3.9 ( #2397 #2459 )
9+- update Python dependencies ( #2428 #2459 #2206 ) ⚠️ pyopenssl is not longer required
10+- automatic update of searx.data ( #2555 #2585 #2595 #2592 #2600 )
11+- update searx.data ( #2604 #2605 #2606 #2607 #2415 )
12+- add ability to send engine data to subsequent requests ( #2615 )
13+- add checker ( #2419 #2476 #2481 #2682 #2682 #2657 )
14+- by default allow only HTTPS, not HTTP ( #2641 #2659 )
15+- replace /translations.js with an embedded JSON ( #2660 )
16+- activate raise_for_error by default ( #2557 )
17+- don't dump traceback of SearxEngineResponseException on init ( #2635 )
22+- update nginx configuration ( #2618 )
23+- document workaround for using 2 languages simultaneously ( #2479 )
24+- improve admin-docs about result proxy (morty) configuration ( #2509 )
25+- fixed typo ( #2457 )
30+- `general.contact_url` : add link to contact instance maintainer to footer of each page ( #2391 14c7cc0e118f1d0873b32b34793cdec2c5c9c13e #2412 )
31+- `brand` : move brand options from Makefile to settings.yml ( #2408 #2473 )
36+- oscar: Hide links panel in mobile screens ( #2458 )
37+- oscar: upgrade dependencies ( #2346 #2673 #2662 )
38+- remove legacy, courgette and pix-art themes ( #2344 )
39+- add hyperlink to searx instances list in error message ( #2387 )
40+- preferences: a tooltip is shown when the mouse is over the engine names ( #2661 )
41+- Ignore double-quotes when highlighting query parts ( #2553 )
42+- update autocomplete ( #2593 )
48+- mediathekviewweb ( #2541 )
49+- solidtorrents ( #2626 )
57+- apk_mirror ( #2556 #2642 )
59+- duckduckgo ( #2560 #2559 )
60+- library genesis ( #2448 )
61+- ina ( 0ba71c3644c4d20f70528c10eed1385399ec1c82 )
63+- json_engine ( #2562 )
65+- google images ( #2482 )
66+- google play apps ( 88657fe9c2a41b9be38ee5146e5870672416db12 )
67+- google play movies ( 50ba2b9e87ef61e96da124f906d3aff4c7870e3f )
68+- google news ( #2483 #2498 )
69+- google scholar ( #2611 )
70+- google video ( #2482 )
71+- hoogle ( 6255b33c9dcf0d28f0a3307af988565f69259ce2 )
73+- semantic schollar ( f596f5767bed915a5c3bed59ae26283e53f975ca f596f5767bed915a5c3bed59ae26283e53f975ca )
75+- seznam ( #2564 28286cf3f2308113bf440fb6e7cf326c6ed07889 )
76+- wikipedia ( #2554 #2565 #2681 #2681 )
78+- yahoo news ( #2640 #2655 )
83+- duckduckgo ( 5f450fda74e80bf350eb1493f66cfa61deaf5cea )
84+- geektimes ( 45f0e1a859fa12ce2ae0c24dc356922fcad50c8d )
85+- lobste.rs ( 06b754ad67aa6066aed6df77b5ffb74aabebb040 )
86+- soundcloud ( #2671 )
89+- yggtorrent ( #2573 )
95+- google_play_music ( #2558 )
103+- Fix empty colon in query from selecting Chinese ( #2454 )
104+- Get correct locale with country from browser ( #2531 )
106+Code refactoring / reduce the technical debt
107+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109+- refactor searx.search.SearchQuery and searx.search.EngineRef ( #2398 )
110+- dynamically set language_support variable ( #2499 )
111+- engines: add about variable ( #2460 )
112+- processors ( #2225 5c6a5407a0b124c3323e73c33b81ec1fbd7d2fce )
113+- remove Fabric file ( #2494 )
114+- use unittest from py3, remove unittest2 from py2 ( #2608 )
119+- add notice for the issue templates ( #2447 )
120+- every Sunday, call utils/fetch_*.py scripts and create a PR automatically ( #2500 728e09676400221a064627509a31470d8f6e33bf )
121+- minor change: replace "travis" by "CI" ( #2528 )
126+- update secret key check ( #2411 )
127+- fix makefile targets `books/{name}.*` and `books/user.pdf` ( #2420 #2530 )
128+- upload-pypi-test & linuxdoc has been released on PyPi ( #2456 )
129+- fix makefile target `gh-pages` : flatten history of branch gh.pages ( #2514 )
130+- optimize creation of the virtualenv & pyenvinstall targets ( #2421 )
131+- update pyenv pyenvinstall Make targets ( #2517 )
132+- makefile.python: remove duplicate pyenv-(un)install targets ( #2418 )
133+- [fix] make targets engines.languages and useragents.update ( #2643 )
134+- [fix] utils/serax.sh create_pyenv() - drop duplicate 'pip install .' ( #2621 )
139+- drop Ubuntu 16.04 (Xenial Xerus) support ( #2619 )
140+- replace ubu1910 image by ubu2010 image ( #2435 )
141+- LXC switch to Fedora 33 / Fedora 31 reached its EOL #2634 ( #2634 )
142+- add package which to CentOS-7 boilerplate ( #2623 )
143+- use SEARX_SETTINGS_TEMPLATE from .config environment ( #2417 )
144+- determine path to makefile.lxc in a LXC ( #2399 )
145+- remove unused code ( #2401 #2497 )
146+- support git versions <v2.22 ( #2620 )
151+We, the searx maintainer team, would like to say a huge thank you for everybody who had been involved in the development of searx or supported us in the past 7 years - making our first stable release available. Special thanks to [NLNet](https://nlnet.nl) for sponsoring multiple features of this release.
160+- drop Python 2 support ( #2137 #2244 )
161+- separate index and search routes ( #1681 ). ⚠️ add & remove your searx instance(s) from your browser.
162+- add external_bang ( #2027 #2043 #2059 )
163+- add external plugins supports ( #2074 )
164+- add plugin converting strings into hash digests ( #1246 )
165+- new category: Onions ( #565 )
166+- allow searx query parts anywhere in the query ( commit aa3c18dda9329fff875328f6ba97483c417b149a 2aef38c3b9d1fe93e9d665a49b10151d63d92392 )
167+- preferences: use base_url for prefix of sharing 'currenly saved preferences' (#1249 )
168+- upgrade to request 2.24.0, pyopenssl is optional ( #2199 )
169+- force admins to set secret_key if debug mode is disabled ( #2256 )
170+- standalone searx update ( #1591 )
171+- architecture clean up ( #2140 #2185 #2195 #2196 #2198 #2189 #2208 #2239 #2241 #2246 #2248 )
172+- record detail about engine error ( #2332 #2375 #2350 ). Add a new API endpoint: ``/stats/errors``.
173+- display if an engine does not support HTTPS requests ( #2373 )
178+- ``use_default_settings``: user settings can relied on the default settings ( #2291 #2362 #2349 )
179+- ``ui.results_on_new_tab: False`` - for opening result links in a new tab ( #2167 )
180+- ``ui.advanced_search`` - add preference for displaying advanced settings ( #2327 )
181+- ``server.method: "POST"`` - Make default query submission method configurable ( #2130 )
182+- ``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
184+- ``enabled_plugins`` - Enabled plugins ( a05c660e3036ad8d02072fc6731af54c2ed6151c )
185+- ``preferences.lock`` - Let admins lock user preferences ( #2270 )
190+- update infobox ( #2131 )
192+ - Make infoboxes shorter by default.
193+ - 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.
196+- query suggestion does not keep the language tag of the original query ( #1314 )
197+- fix the clear button ( #2306 )
202+- Fix autocomplete ( #2205 )
207+- ahmia, not_evil ( #565 )
209+- command line engines: git grep, find, etc. ( #2128 #2250 )
210+- elasticsearch ( #2292 )
213+- opensemanticsearch ( #2271 )
216+- sepiasearch ( #2227 )
223+- duckduckgo_definitions ( #2224 #2356 )
225+- invidious ( #2116 )
228+- soundclound ( #2365 )
229+- wikipedia ( #2178 #2363 #2354 )
230+- wikidata ( #2151 #2224 #2353 ) - faster response time
231+- yaCy ( #2255 ) - support HTTP digest authentication.
232+- youtube_noapi ( #2364 )
238+- answer 'random sha256' ( #2121 )
239+- bing image ( #1496 )
240+- duckduckgo ( #2254 )
243+- google image ( #2115 )
244+- lobste.rs ( #2253 )
245+- piratebay ( #2133 )
246+- startpage ( #2385 )
253+- searchcode_doc ( #2372 )
256+- yggtorrent ( #2099 #2375 )
258+Install scripts & documentation
259+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
261+- install script & documentation ( #2384 #2380 #2362 #2287 #2283 #2277 #2223 #2211 #2118 #2117 #2063 )
266+- use Alpine 3.12 ( #1983 )
267+- uwsgi serves the static files directly. ( #1865 )
268+- fix k8s support ( #2099 )
269+- make docker produces clean tag version ( #2182 )
274+- searx.utils.HTMLTextExtractor: invalid HTML don't raise an Exception ( #2190 )
275+- Fix static URL ( commit da8b227044f45127f705f6ea94a72d368eea73bb )
276+- Fix autocomplete ( #2127 )
277+- Fix opensearch.xml ( #2132 #2247 )
278+- Fix documentation build ( #2237 )
279+- Some fixes in the fetch languages script ( #2212 )
281+Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features of this release.
298+ - Engine fixes (google, google images, startpage, gigablast, yacy)
299+ - Private engines introduced - more details: https://searx.github.io/searx/blog/private-engines.html
300+ - Greatly improved documentation - check it at https://searx.github.io/searx
301+ - Added autofocus to all search inputs
302+ - CSP friendly oscar theme
303+ - Added option to hide engine errors with `display_error_messages` engine option (true/false values, default is true)
304+ - Tons of accessibility fixes - see https://github.com/searx/searx/issues/350 for details
305+ - More flexible branding options: configurable vcs/issue tracker links
306+ - Added "disable all" & "allow all" options to preferences engine select
307+ - Autocomplete keyboard navigation fixes
308+ - Configurable category order
309+ - Wrap long lines in infoboxes
310+ - Added RSS subscribtion link
311+ - Added routing directions to OSM results
312+ - Added author and length attributes to youtube videos
313+ - Fixed image stretch with mobile viewport in oscar theme
314+ - Added translatable JS strings
315+ - Better HTML annotations - engine names and endpoints are available as classes
316+ - RTL text fixes in oscar theme
317+ - Handle weights in accept-language HTTP headers
318+ - Added answerer results to rss/csv output
319+ - Added new autocomplete backends to settings.yml
320+ - Updated opensearch.xml
321+ - Fixed custom locale setting from settings.yml
322+ - Translation updates
323+ - Removed engines: faroo
325+Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features of this release.
326+Special thanks to https://www.accessibility.nl/english for making accessibilty audit.
331+- @HLFH joined the maintainer team
332+- Dropped Python2 support
10.16.0 2020.01.30
3340.16.0 2020.01.30
2=================
335=================
@@ -92,8 +425,8 @@ News
93- Bug fixes
426- Bug fixes
95− - https://github.com/asciimoo/searx/issues/1088
428+ - https://github.com/searx/searx/issues/1088
96− - https://github.com/asciimoo/searx/issues/1089
429+ - https://github.com/searx/searx/issues/1089
98- Dependency updates
431- Dependency updates
@@ -262,7 +595,7 @@ News
265−New documentation page is available: https://asciimoo.github.io/searx
598+New documentation page is available: https://searx.github.io/searx
2680.8.0 2015.09.08
6010.8.0 2015.09.08
CONTRIBUTING.mdnew file+49
@@ -0,0 +1,49 @@
3+## Resources in the documentation
5+* [Development quickstart](https://searx.github.io/searx/dev/contribution_guide.html)
6+* [Contribution guide](https://searx.github.io/searx/dev/contribution_guide.html)
10+Please follow the provided PR template when writing a description for your changes.
12+Do not take criticism personally. When you get feedback, it is about your work,
13+not your character, personality, etc. Keep in mind we all want to make the project better.
15+When something is not clear, please ask questions to clear things up.
17+If you would like to introduce a big architectural changes or do a refactoring
18+either in the codebase or the development tools, please open an issue with a proposal
19+first. This way we can think together about the problem and probably come up
20+with a better solution.
22+## Coding conventions and guidelines
26+* Always write descriptive commit messages ("fix bug" is not acceptable).
27+* Use the present tense ("Add feature" not "Added feature").
28+* Use the imperative mood ("Move cursor to..." not "Moves cursor to...").
29+* Limit the first line to 72 characters or less.
30+* Include the number of the issue you are fixing.
34+As a Python project, we must follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) and [PEP 20](https://www.python.org/dev/peps/pep-0020/) guidelines.
36+Furthermore, follow the Clean code conventions. The most important
37+in this project are the following rules:
39+* Simpler is better. [KISS principle](https://en.wikipedia.org/wiki/KISS_principle)
41+* Every function must do one thing.
42+* Use descriptive names for functions and variables.
43+* Always look for the root cause.
44+* Keep configurable data high level.
45+* Avoid negative conditionals.
46+* Prefer fewer arguments.
47+* Do not add obvious comment to code.
48+* Do not comment out code, just delete lines.
@@ -1,29 +1,22 @@
1−FROM alpine:3.10
1+FROM alpine:3.15
2ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
2ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
4VOLUME /etc/searx
4VOLUME /etc/searx
5VOLUME /var/log/uwsgi
5VOLUME /var/log/uwsgi
8−ARG VERSION_GITCOMMIT=unknown
9−ARG SEARX_GIT_VERSION=unknown
11ARG SEARX_GID=977
7ARG SEARX_GID=977
12ARG SEARX_UID=977
8ARG SEARX_UID=977
14RUN addgroup -g ${SEARX_GID} searx && \
10RUN addgroup -g ${SEARX_GID} searx && \
15 adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
11 adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
17−ARG TIMESTAMP_SETTINGS=0
22ENV INSTANCE_NAME=searx \
13ENV INSTANCE_NAME=searx \
23 AUTOCOMPLETE= \
14 AUTOCOMPLETE= \
24 BASE_URL= \
15 BASE_URL= \
25 MORTY_KEY= \
16 MORTY_KEY= \
26− MORTY_URL=
17+ MORTY_URL= \
18+ SEARX_SETTINGS_PATH=/etc/searx/settings.yml \
19+ UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
28WORKDIR /usr/local/searx
21WORKDIR /usr/local/searx
@@ -45,29 +38,42 @@ RUN apk upgrade --no-cache \
45 ca-certificates \
38 ca-certificates \
53 uwsgi-python3 \
47 uwsgi-python3 \
54− && pip3 install --upgrade pip \
49+ && pip3 install --upgrade pip wheel setuptools \
55 && pip3 install --no-cache -r requirements.txt \
50 && pip3 install --no-cache -r requirements.txt \
56 && apk del build-dependencies \
51 && apk del build-dependencies \
57 && rm -rf /root/.cache
52 && rm -rf /root/.cache
59−COPY --chown=searx:searx . .
54+COPY searx ./searx
55+COPY dockerfiles ./dockerfiles
57+ARG TIMESTAMP_SETTINGS=0
59+ARG VERSION_GITCOMMIT=unknown
61−RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \
61+RUN /usr/bin/python3 -m compileall -q searx; \
62 touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
62 touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
63 touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
63 touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
64 if [ ! -z $VERSION_GITCOMMIT ]; then\
64 if [ ! -z $VERSION_GITCOMMIT ]; then\
65 echo "VERSION_STRING = VERSION_STRING + \"-$VERSION_GITCOMMIT\"" >> /usr/local/searx/searx/version.py; \
65 echo "VERSION_STRING = VERSION_STRING + \"-$VERSION_GITCOMMIT\"" >> /usr/local/searx/searx/version.py; \
67−
67+ find /usr/local/searx/searx/static -a \( -name '*.html' -o -name '*.css' -o -name '*.js' \
68+ -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
69+ -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
69−# Keep this argument at the end since it change each time
71+# Keep these arguments at the end to prevent redundant layer rebuilds
70ARG LABEL_DATE=
72ARG LABEL_DATE=
74+ARG SEARX_GIT_VERSION=unknown
71LABEL maintainer="searx <${GIT_URL}>" \
77LABEL maintainer="searx <${GIT_URL}>" \
72 description="A privacy-respecting, hackable metasearch engine." \
78 description="A privacy-respecting, hackable metasearch engine." \
73 version="${SEARX_GIT_VERSION}" \
79 version="${SEARX_GIT_VERSION}" \
@@ -1,275 +1,107 @@
1# -*- coding: utf-8; mode: makefile-gmake -*-
1# -*- coding: utf-8; mode: makefile-gmake -*-
2−.DEFAULT_GOAL=help
2+# SPDX-License-Identifier: AGPL-3.0-or-later
4−# START Makefile setup
4+.DEFAULT_GOAL=help
5−export GIT_URL=https://github.com/asciimoo/searx
5+export MTOOLS=./manage
6−export GIT_BRANCH=master
7−export SEARX_URL=https://searx.me
8−export DOCS_URL=https://asciimoo.github.io/searx
11include utils/makefile.include
7include utils/makefile.include
15−PY_SETUP_EXTRAS ?= \[test\]
17−include utils/makefile.python
18−include utils/makefile.sphinx
20all: clean install
9all: clean install
22−PHONY += help-min help-all help
11+PHONY += help
26− @echo 'to get more help: make help-all'
29− @echo ' test - run developer tests'
30− @echo ' docs - build documentation'
31− @echo ' docs-live - autobuild HTML documentation while editing'
32− @echo ' run - run developer instance'
33− @echo ' install - developer install (./local)'
34− @echo ' uninstall - uninstall (./local)'
35− @echo ' gh-pages - build docs & deploy on gh-pages branch'
36− @echo ' clean - drop builds and environments'
37− @echo ' project - re-build generic files of the searx project'
38− @echo ' buildenv - re-build environment files (aka brand)'
39− @echo ' themes - re-build build the source of the themes'
40− @echo ' docker - build Docker image'
41− @echo ' node.env - download & install npm dependencies locally'
44− @echo ' SEARX_URL = $(SEARX_URL)'
45− @echo ' GIT_URL = $(GIT_URL)'
46− @echo ' DOCS_URL = $(DOCS_URL)'
48− @$(MAKE) -e -s make-help
50−help-all: help-min
13+help:
51− @echo ''
15+ @echo '----'
52− @$(MAKE) -e -s python-help
16+ @echo 'run - run developer instance'
53− @echo ''
17+ @echo 'install - developer install of searx into virtualenv'
54− @$(MAKE) -e -s docs-help
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'
57−install: buildenv pyenvinstall
60−uninstall: pyenvuninstall
63−clean: pyclean docs-clean node.clean test.clean
64− $(call cmd,common_clean)
66PHONY += run
26PHONY += run
67−run: buildenv pyenvinstall
27+run: install
69− sed -i -e "s/debug : False/debug : True/g" ./searx/settings.yml ; \
70 sleep 2 ; \
29 sleep 2 ; \
71 xdg-open http://127.0.0.1:8888/ ; \
30 xdg-open http://127.0.0.1:8888/ ; \
73− sed -i -e "s/debug : True/debug : False/g" ./searx/settings.yml ; \
75− $(PY_ENV)/bin/python ./searx/webapp.py
32+ SEARX_DEBUG=1 ./manage pyenv.cmd python ./searx/webapp.py
80−sphinx-doc-prebuilds:: buildenv pyenvinstall prebuild-includes
83−docs: sphinx-doc-prebuilds sphinx-doc
84− $(call cmd,sphinx,html,docs,docs)
87−docs-live: sphinx-doc-prebuilds sphinx-live
88− $(call cmd,sphinx_autobuild,html,docs,docs)
90−PHONY += prebuild-includes
92− $(Q)mkdir -p $(DOCS_BUILD)/includes
93− $(Q)./utils/searx.sh doc | cat > $(DOCS_BUILD)/includes/searx.rst
94− $(Q)./utils/filtron.sh doc | cat > $(DOCS_BUILD)/includes/filtron.rst
95− $(Q)./utils/morty.sh doc | cat > $(DOCS_BUILD)/includes/morty.rst
99− @echo "doc available at --> $(DOCS_URL)"
101−# update project files
102−# --------------------
104−PHONY += project engines.languages useragents.update buildenv
106−project: buildenv useragents.update engines.languages
108−engines.languages: pyenvinstall
109− $(Q)echo "fetch languages .."
110− $(Q)$(PY_ENV_ACT); python utils/fetch_languages.py
111− $(Q)echo "update searx/data/engines_languages.json"
112− $(Q)mv engines_languages.json searx/data/engines_languages.json
113− $(Q)echo "update searx/languages.py"
114− $(Q)mv languages.py searx/languages.py
116−useragents.update: pyenvinstall
117− $(Q)echo "Update searx/data/useragents.json with the most recent versions of Firefox."
118− $(Q)$(PY_ENV_ACT); python utils/fetch_firefox_version.py
121− $(Q)echo "build searx/brand.py"
122− $(Q)echo "GIT_URL = '$(GIT_URL)'" > searx/brand.py
123− $(Q)echo "GIT_BRANCH = '$(GIT_BRANCH)'" >> searx/brand.py
124− $(Q)echo "ISSUE_URL = 'https://github.com/asciimoo/searx/issues'" >> searx/brand.py
125− $(Q)echo "SEARX_URL = '$(SEARX_URL)'" >> searx/brand.py
126− $(Q)echo "DOCS_URL = '$(DOCS_URL)'" >> searx/brand.py
127− $(Q)echo "PUBLIC_INSTANCES = 'https://searx.space'" >> searx/brand.py
128− $(Q)echo "build utils/brand.env"
129− $(Q)echo "export GIT_URL='$(GIT_URL)'" > utils/brand.env
130− $(Q)echo "export GIT_BRANCH='$(GIT_BRANCH)'" >> utils/brand.env
131− $(Q)echo "export ISSUE_URL='https://github.com/asciimoo/searx/issues'" >> utils/brand.env
132− $(Q)echo "export SEARX_URL='$(SEARX_URL)'" >> utils/brand.env
133− $(Q)echo "export DOCS_URL='$(DOCS_URL)'" >> utils/brand.env
134− $(Q)echo "export PUBLIC_INSTANCES='https://searx.space'" >> utils/brand.env
137−# node / npm
34+PHONY += install uninstall
138−# ----------
35+install uninstall:
36+ $(Q)./manage pyenv.$@
140−node.env: buildenv
38+PHONY += clean
141− $(Q)./manage.sh npm_packages
39+clean: py.clean docs.clean node.clean test.clean
142−
40+ $(Q)./manage build_msg CLEAN "common files"
143−node.clean:
41+ $(Q)find . -name '*.orig' -exec rm -f {} +
144− $(Q)echo "CLEAN locally installed npm dependencies"
42+ $(Q)find . -name '*.rej' -exec rm -f {} +
145− $(Q)rm -rf \
43+ $(Q)find . -name '*~' -exec rm -f {} +
146− ./node_modules \
44+ $(Q)find . -name '*.bak' -exec rm -f {} +
147− ./package-lock.json \
45+
148− ./searx/static/themes/oscar/package-lock.json \
46+PHONY += search.checker search.checker.%
149− ./searx/static/themes/oscar/node_modules \
47+search.checker: install
150− ./searx/static/themes/simple/package-lock.json \
48+ $(Q)./manage pyenv.cmd searx-checker -v
151− ./searx/static/themes/simple/node_modules
49+
152−
50+search.checker.%: install
153−# build themes
51+ $(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
155−
53+PHONY += ci.test test test.sh
156−PHONY += themes.bootstrap themes themes.oscar themes.simple themes.legacy themes.courgette themes.pixart
157−themes: buildenv themes.bootstrap themes.oscar themes.simple themes.legacy themes.courgette themes.pixart
159−quiet_cmd_lessc = LESSC $3
160− cmd_lessc = PATH="$$(npm bin):$$PATH" \
161− lessc --clean-css="--s1 --advanced --compatibility=ie9" "searx/static/$2" "searx/static/$3"
163−quiet_cmd_grunt = GRUNT $2
164− cmd_grunt = PATH="$$(npm bin):$$PATH" \
165− grunt --gruntfile "$2"
168− $(Q)echo '[!] build oscar theme'
169− $(call cmd,grunt,searx/static/themes/oscar/gruntfile.js)
172− $(Q)echo '[!] build simple theme'
173− $(call cmd,grunt,searx/static/themes/simple/gruntfile.js)
176− $(Q)echo '[!] build legacy theme'
177− $(call cmd,lessc,themes/legacy/less/style-rtl.less,themes/legacy/css/style-rtl.css)
178− $(call cmd,lessc,themes/legacy/less/style.less,themes/legacy/css/style.css)
181− $(Q)echo '[!] build courgette theme'
182− $(call cmd,lessc,themes/courgette/less/style.less,themes/courgette/css/style.css)
183− $(call cmd,lessc,themes/courgette/less/style-rtl.less,themes/courgette/css/style-rtl.css)
186− $(Q)echo '[!] build pixart theme'
187− $(call cmd,lessc,themes/pix-art/less/style.less,themes/pix-art/css/style.css)
190− $(call cmd,lessc,less/bootstrap/bootstrap.less,css/bootstrap.min.css)
198− $(Q)./manage.sh docker_build
200−docker.push: buildenv
201− $(Q)./manage.sh docker_build push
206−PHONY += gecko.driver
208− $(PY_ENV_ACT); ./manage.sh install_geckodriver
213−PHONY += test test.sh test.pylint test.pep8 test.unit test.coverage test.robot
54+ci.test: test.pep8 test.pylint test.unit test.robot
214−test: buildenv test.pylint test.pep8 test.unit gecko.driver test.robot
55+test: ci.test
216−ifeq ($(PY),2)
57+ $(Q)shellcheck -x -s bash \
217−test.pylint:
58+ utils/brand.env \
218− @echo "LINT skip liniting py2"
59+ ./manage \
219−else
60+ utils/lib.sh \
220−# TODO: balance linting with pylint
61+ utils/filtron.sh \
65+ utils/lxc-searx.env \
67+ $(Q)./manage build_msg TEST "$@ OK"
222−test.pylint: pyenvinstall
224− searx/preferences.py \
226− searx/engines/gigablast.py \
230−# ignored rules:
70+# wrap ./manage script
231−# E402 module level import not at top of file
232−# W503 line break before binary operator
234−# ubu1604: uses shellcheck v0.3.7 (from 04/2015), no longer supported!
72+MANAGE += buildenv
235−test.sh:
73+MANAGE += babel.compile
236− shellcheck -x -s bash utils/brand.env
74+MANAGE += data.all data.languages data.useragents
237− shellcheck -x utils/lib.sh
75+MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
238− shellcheck -x utils/filtron.sh
76+MANAGE += docker.build docker.push
239− shellcheck -x utils/searx.sh
77+MANAGE += gecko.driver
240− shellcheck -x utils/morty.sh
78+MANAGE += node.env node.clean
241− shellcheck -x utils/lxc.sh
79+MANAGE += py.build py.clean
242− shellcheck -x utils/lxc-searx.env
80+MANAGE += pyenv pyenv.install pyenv.uninstall
243− shellcheck -x .config.sh
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
245−test.pep8: pyenvinstall
85+PHONY += $(MANAGE)
247− $(Q)$(PY_ENV_ACT); pep8 --exclude='searx/static, searx/engines/gigablast.py' --max-line-length=120 --ignore "E402,W503" searx tests
249−test.unit: pyenvinstall
87+$(MANAGE):
250− @echo "TEST tests/unit"
88+ $(Q)$(MTOOLS) $@
251− $(Q)$(PY_ENV_ACT); python -m nose2 -s tests/unit
253−test.coverage: pyenvinstall
90+# deprecated
254− @echo "TEST unit test coverage"
255− $(Q)$(PY_ENV_ACT); \
256− python -m nose2 -C --log-capture --with-coverage --coverage searx -s tests/unit \
257− && coverage report \
260−test.robot: pyenvinstall gecko.driver
92+PHONY += docs docs-clean docs-live docker themes
262− $(Q)$(PY_ENV_ACT); PYTHONPATH=. python searx/testing.py robot
264−test.clean:
94+docs: docs.html
265− @echo "CLEAN intermediate test stuff"
95+ $(Q)./manage build_msg WARN $@ is deprecated use docs.html
266− $(Q)rm -rf geckodriver.log .coverage coverage/
97+docs-clean: docs.clean
98+ $(Q)./manage build_msg WARN $@ is deprecated use docs.clean
269−# travis
100+docs-live: docs.live
270−# ------
101+ $(Q)./manage build_msg WARN $@ is deprecated use docs.live
272−travis.codecov:
103+docker: docker.build
273− $(Q)$(PY_ENV_BIN)/python -m pip install codecov
104+ $(Q)./manage build_msg WARN $@ is deprecated use docker.build
275−.PHONY: $(PHONY)
106+themes: themes.all
107+ $(Q)./manage build_msg WARN $@ is deprecated use themes.all
PULL_REQUEST_TEMPLATE.mdnew file+25
@@ -0,0 +1,25 @@
1+## What does this PR do?
5+<!-- explain the changes in your PR, algorithms, design, architecture -->
7+## Why is this change important?
11+<!-- explain the motivation behind your PR -->
13+## How to test this PR locally?
15+<!-- commands to run the tests or instructions to test the changes-->
19+<!-- additional notes for reviewiers -->
@@ -1,7 +1,7 @@
1.. SPDX-License-Identifier: AGPL-3.0-or-later
1.. SPDX-License-Identifier: AGPL-3.0-or-later
3−.. figure:: https://raw.githubusercontent.com/asciimoo/searx/master/searx/static/themes/oscar/img/logo_searx_a.png
3+.. figure:: https://raw.githubusercontent.com/searx/searx/master/searx/static/themes/oscar/img/logo_searx_a.png
4− :target: https://asciimoo.github.io/searx/
4+ :target: https://searx.github.io/searx/
5 :alt: searX
5 :alt: searX
6 :width: 100%
6 :width: 100%
7 :align: center
7 :align: center
@@ -17,30 +17,30 @@
17|OpenCollective searx backers|
17|OpenCollective searx backers|
18|OpenCollective searx sponsors|
18|OpenCollective searx sponsors|
20−Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **səːks**.
20+Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **sɜːks**.
22.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
22.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
24.. |searx install| image:: https://img.shields.io/badge/-install-blue
24.. |searx install| image:: https://img.shields.io/badge/-install-blue
25− :target: https://asciimoo.github.io/searx/admin/installation.html
25+ :target: https://searx.github.io/searx/admin/installation.html
27.. |searx homepage| image:: https://img.shields.io/badge/-homepage-blue
27.. |searx homepage| image:: https://img.shields.io/badge/-homepage-blue
28− :target: https://asciimoo.github.io/searx
28+ :target: https://searx.github.io/searx
30.. |searx wiki| image:: https://img.shields.io/badge/-wiki-blue
30.. |searx wiki| image:: https://img.shields.io/badge/-wiki-blue
31− :target: https://github.com/asciimoo/searx/wiki
31+ :target: https://github.com/searx/searx/wiki
33.. |AGPL License| image:: https://img.shields.io/badge/license-AGPL-blue.svg
33.. |AGPL License| image:: https://img.shields.io/badge/license-AGPL-blue.svg
34− :target: https://github.com/asciimoo/searx/blob/master/LICENSE
34+ :target: https://github.com/searx/searx/blob/master/LICENSE
36−.. |Issues| image:: https://img.shields.io/github/issues/asciimoo/searx?color=yellow&label=issues
36+.. |Issues| image:: https://img.shields.io/github/issues/searx/searx?color=yellow&label=issues
37− :target: https://github.com/asciimoo/searx/issues
37+ :target: https://github.com/searx/searx/issues
39−.. |PR| image:: https://img.shields.io/github/issues-pr-raw/asciimoo/searx?color=yellow&label=PR
39+.. |PR| image:: https://img.shields.io/github/issues-pr-raw/searx/searx?color=yellow&label=PR
40− :target: https://github.com/asciimoo/searx/pulls
40+ :target: https://github.com/searx/searx/pulls
42−.. |commits| image:: https://img.shields.io/github/commit-activity/y/asciimoo/searx?color=yellow&label=commits
42+.. |commits| image:: https://img.shields.io/github/commit-activity/y/searx/searx?color=yellow&label=commits
43− :target: https://github.com/asciimoo/searx/commits/master
43+ :target: https://github.com/searx/searx/commits/master
45.. |OpenCollective searx backers| image:: https://opencollective.com/searx/backers/badge.svg
45.. |OpenCollective searx backers| image:: https://opencollective.com/searx/backers/badge.svg
46 :target: https://opencollective.com/searx#backer
46 :target: https://opencollective.com/searx#backer
@@ -55,13 +55,13 @@ Otherwise jump to the user_, admin_ and developer_ handbooks you will find on
55our homepage_.
55our homepage_.
57.. _searx.space: https://searx.space
57.. _searx.space: https://searx.space
58−.. _user: https://asciimoo.github.io/searx/user
58+.. _user: https://searx.github.io/searx/user
59−.. _admin: https://asciimoo.github.io/searx/admin
59+.. _admin: https://searx.github.io/searx/admin
60−.. _developer: https://asciimoo.github.io/searx/dev
60+.. _developer: https://searx.github.io/searx/dev
61−.. _homepage: https://asciimoo.github.io/searx
61+.. _homepage: https://searx.github.io/searx
64− openhub_ // twitter_ // IRC: #searx @ freenode
64+ openhub_ // twitter_ // IRC: #searx @ Libera (irc.libera.chat)
66.. _openhub: https://www.openhub.net/p/searx
66.. _openhub: https://www.openhub.net/p/searx
67.. _twitter: https://twitter.com/Searx_engine
67.. _twitter: https://twitter.com/Searx_engine
dockerfiles/docker-entrypoint.sh+33−20
@@ -1,15 +1,40 @@
3−export SEARX_VERSION=$(su searx -c 'python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)"')
3+help() {
4−printf 'searx version %s\n\n' "${SEARX_VERSION}"
4+ printf "Command line:\n\n"
5−
5+ printf " -h Display this help\n"
6−export UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
6+ printf " -d Dry run to update the configuration files.\n"
7−export SEARX_SETTINGS_PATH=/etc/searx/settings.yml
7+ printf " -f Always update on the configuration files (existing files are renamed with the .old suffix)\n"
8+ printf " Without this option, the new configuration files are copied with the .new suffix\n"
9+ printf "\nEnvironment variables:\n\n"
10+ printf " INSTANCE_NAME settings.yml : general.instance_name\n"
11+ printf " AUTOCOMPLETE settings.yml : search.autocomplete\n"
12+ printf " BASE_URL settings.yml : server.base_url\n"
13+ printf " MORTY_URL settings.yml : result_proxy.url\n"
14+ printf " MORTY_KEY settings.yml : result_proxy.key\n"
15+ printf " BIND_ADDRESS uwsgi bind to the specified TCP socket using HTTP protocol. Default value: \"${DEFAULT_BIND_ADDRESS}\"\n"
16+ printf "\nVolume:\n\n"
17+ printf " /etc/searx the docker entry point copies settings.yml and uwsgi.ini in this directory (see the -f command line option)\n"
22+export DEFAULT_BIND_ADDRESS="0.0.0.0:8080"
9if [ -z "${BIND_ADDRESS}" ]; then
23if [ -z "${BIND_ADDRESS}" ]; then
10− export BIND_ADDRESS=":8080"
24+ export BIND_ADDRESS="${DEFAULT_BIND_ADDRESS}"
27+# Parse special command line
28+# see docs/admin/installation-docker.rst
29+# display the help message without the version
30+if [ "$1" = "help" ]; then
35+export SEARX_VERSION=$(su searx -c 'python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)"' 2>/dev/null)
36+printf 'searx version %s\n\n' "${SEARX_VERSION}"
13# Parse command line
38# Parse command line
14FORCE_CONF_UPDATE=0
39FORCE_CONF_UPDATE=0
@@ -23,19 +48,7 @@ do
26− printf "Command line:\n\n"
51+ help
27− printf " -h Display this help\n"
28− printf " -d Dry run to update the configuration files.\n"
29− printf " -f Always update on the configuration files (existing files are renamed with the .old suffix)\n"
30− printf " Without this option, new configuration files are copied with the .new suffix\n"
31− printf "\nEnvironment variables:\n\n"
32− printf " INSTANCE_NAME settings.yml : general.instance_name\n"
33− printf " AUTOCOMPLETE settings.yml : search.autocomplete\n"
34− printf " BASE_URL settings.yml : server.base_url\n"
35− printf " MORTY_URL settings.yml : result_proxy.url\n"
36− printf " MORTY_KEY settings.yml : result_proxy.key\n"
37− printf " BIND_ADDRESS where uwsgi will accept HTTP request (format : host:port)\n"
@@ -50,7 +63,7 @@ patch_searx_settings() {
52 # Make sure that there is trailing slash at the end of BASE_URL
65 # Make sure that there is trailing slash at the end of BASE_URL
53− # see http://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
66+ # see https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
54 export BASE_URL="${BASE_URL%/}/"
67 export BASE_URL="${BASE_URL%/}/"
56 # update settings.yml
69 # update settings.yml
@@ -35,3 +35,13 @@ logto = /var/log/uwsgi/uwsgi.log
35# No keep alive
35# No keep alive
36# See https://github.com/searx/searx-docker/issues/24
36# See https://github.com/searx/searx-docker/issues/24
37add-header = Connection: close
37add-header = Connection: close
39+# uwsgi serves the static files
40+# expires set to one day as Flask does
41+static-map = /static=/usr/local/searx/searx/static
42+static-expires = /* 864000
43+static-gzip-all = True
47+cache2 = name=searxcache,items=2000,blocks=2000,blocksize=4096,bitmap=1
docs/_themes/searx/static/searx.css−29
@@ -138,32 +138,3 @@ caption {
138 caption-side: top;
138 caption-side: top;
139 text-align: left;
139 text-align: left;
142−/* bugs since sphinx 3.1
144−See sphinx-doc project, PR 7838 & 7484 with elementary patch to the basic CSS:
146−- https://github.com/sphinx-doc/sphinx/issues/7838#issuecomment-646009605
147−- https://github.com/sphinx-doc/sphinx/pull/7484#issuecomment-646058972
167−div.admonition, div.topic, pre {
docs/admin/arch_public.dot+4−4
@@ -4,11 +4,11 @@ digraph G {
4 edge [fontname="Sans"];
4 edge [fontname="Sans"];
6 browser [label="Browser", shape=Mdiamond];
6 browser [label="Browser", shape=Mdiamond];
7− rp [label="Reverse Proxy", href="https://asciimoo.github.io/searx/utils/filtron.sh.html#public-reverse-proxy"];
7+ rp [label="Reverse Proxy", href="https://searx.github.io/searx/utils/filtron.sh.html#public-reverse-proxy"];
8− filtron [label="Filtron", href="https://asciimoo.github.io/searx/utils/filtron.sh.html"];
8+ filtron [label="Filtron", href="https://searx.github.io/searx/utils/filtron.sh.html"];
9− morty [label="Morty", href="https://asciimoo.github.io/searx/utils/morty.sh.html"];
9+ morty [label="Morty", href="https://searx.github.io/searx/utils/morty.sh.html"];
10 static [label="Static files", href="url to configure static files"];
10 static [label="Static files", href="url to configure static files"];
11− uwsgi [label="uwsgi", href="https://asciimoo.github.io/searx/utils/searx.sh.html"]
11+ uwsgi [label="uwsgi", href="https://searx.github.io/searx/utils/searx.sh.html"]
12 searx1 [label="Searx #1"];
12 searx1 [label="Searx #1"];
13 searx2 [label="Searx #2"];
13 searx2 [label="Searx #2"];
14 searx3 [label="Searx #3"];
14 searx3 [label="Searx #3"];
docs/admin/buildhosts.rst+5−5
@@ -49,9 +49,9 @@ Build docs
49 - dvisvgm_
49 - dvisvgm_
51Most of the sphinx requirements are installed from :origin:`setup.py` and the
51Most of the sphinx requirements are installed from :origin:`setup.py` and the
52−docs can be build from scratch with ``make docs``. For better math and image
52+docs can be build from scratch with ``make docs.html``. For better math and
53−processing additional packages are needed. The XeTeX_ needed not only for PDF
53+image processing additional packages are needed. The XeTeX_ needed not only for
54−creation, its also needed for :ref:`math` when HTML output is build.
54+PDF creation, its also needed for :ref:`math` when HTML output is build.
56To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
56To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
57as images (``sphinx.ext.imgmath`` extension).
57as images (``sphinx.ext.imgmath`` extension).
@@ -64,10 +64,10 @@ to ``imgmath``:
64 :start-after: # sphinx.ext.imgmath setup
64 :start-after: # sphinx.ext.imgmath setup
65 :end-before: # sphinx.ext.imgmath setup END
65 :end-before: # sphinx.ext.imgmath setup END
67−If your docs build (``make docs``) shows warnings like this::
67+If your docs build (``make docs.html``) shows warnings like this::
69 WARNING: dot(1) not found, for better output quality install \
69 WARNING: dot(1) not found, for better output quality install \
70− graphviz from http://www.graphviz.org
70+ graphviz from https://www.graphviz.org
72 WARNING: LaTeX command 'latex' cannot be run (needed for math \
72 WARNING: LaTeX command 'latex' cannot be run (needed for math \
73 display), check the imgmath_latex setting
73 display), check the imgmath_latex setting
docs/admin/engines.rst+26−13
@@ -1,14 +1,28 @@
5+Special Engine Settings
6+=======================
7.. sidebar:: Further reading ..
8.. sidebar:: Further reading ..
9 - :ref:`settings engine`
10 - :ref:`settings engine`
10− - :ref:`engine settings`
11+ - :ref:`engine settings` & :ref:`engine file`
11− - :ref:`engine file`
12+
21+General Engine Settings
22+=======================
24+Explanation of the :ref:`general engine configuration` shown in the table
25+:ref:`configured engines`.
13============= =========== ==================== ============
27============= =========== ==================== ============
14:ref:`engine settings` :ref:`engine file`
28:ref:`engine settings` :ref:`engine file`
@@ -19,7 +33,7 @@ Engine .. Paging support **P**
19------------------------- -------------------- ------------
33------------------------- -------------------- ------------
20Shortcut **S** Language support **L**
34Shortcut **S** Language support **L**
21Timeout **TO** Time range support **TR**
35Timeout **TO** Time range support **TR**
22−Disabled **D** Offline **O**
36+Disabled **D** Engine type **ET**
23------------- ----------- -------------------- ------------
37------------- ----------- -------------------- ------------
24Safe search **SS**
38Safe search **SS**
25------------- ----------- ---------------------------------
39------------- ----------- ---------------------------------
@@ -30,11 +44,9 @@ Disabled **D**
30Show errors **DE**
44Show errors **DE**
31============= =========== =================================
45============= =========== =================================
33−Configuration defaults (at built time):
35.. _configured engines:
47.. _configured engines:
37−.. jinja:: webapp
49+.. jinja:: searx
39 .. flat-table:: Engines configured at built time (defaults)
51 .. flat-table:: Engines configured at built time (defaults)
40 :header-rows: 1
52 :header-rows: 1
@@ -50,10 +62,10 @@ Configuration defaults (at built time):
58 {% for name, mod in engines.items() %}
70 {% for name, mod in engines.items() %}
@@ -67,9 +79,10 @@ Configuration defaults (at built time):
67 - {{(mod.safesearch and "y") or ""}}
79 - {{(mod.safesearch and "y") or ""}}
68 - {{(mod.disabled and "y") or ""}}
80 - {{(mod.disabled and "y") or ""}}
69 - {{(mod.time_range_support and "y") or ""}}
81 - {{(mod.time_range_support and "y") or ""}}
70− - {{(mod.offline and "y") or ""}}
82+ - {{mod.engine_type or ""}}
71 - {{mod.weight or 1 }}
83 - {{mod.weight or 1 }}
72 - {{(mod.disabled and "y") or ""}}
84 - {{(mod.disabled and "y") or ""}}
73 - {{(mod.display_error_messages and "y") or ""}}
85 - {{(mod.display_error_messages and "y") or ""}}
75 {% endfor %}
87 {% endfor %}
docs/admin/engines/recoll.rstnew file+50
@@ -0,0 +1,50 @@
9+ - `Recoll <https://www.lesbonscomptes.com/recoll/>`_
10+ - `recoll-webui <https://framagit.org/medoc92/recollwebui.git>`_
12+Recoll_ is a desktop full-text search tool based on Xapian. By itself Recoll_
13+does not offer web or API access, this can be achieved using recoll-webui_
20+You must configure the following settings:
23+ Location where recoll-webui can be reached.
26+ Location where the file hierarchy is mounted on your *local* filesystem.
29+ Location where the file hierarchy as indexed by recoll can be reached.
32+ Part of the indexed file hierarchy to be search, if empty the full domain is
41+#. Recoll indexes a local filesystem mounted in ``/export/documents/reference``,
42+#. the Recoll search inteface can be reached at https://recoll.example.org/ and
43+#. the contents of this filesystem can be reached though https://download.example.org/reference
47+ base_url: https://recoll.example.org/
48+ mount_prefix: /export/documents
49+ dl_prefix: https://download.example.org
docs/admin/filtron.rst+5−5
@@ -64,7 +64,7 @@ of:
64 "Param:q",
64 "Param:q",
65 "Path=^(/|/search)$"
65 "Path=^(/|/search)$"
67− "interval": "<time-interval-in-sec (int)>"
67+ "interval": "<time-interval-in-sec (int)>",
68 "limit": "<max-request-number-in-interval (int)>",
68 "limit": "<max-request-number-in-interval (int)>",
69 "subrules": [
69 "subrules": [
@@ -91,7 +91,7 @@ of:
93 "name": "IP limit",
93 "name": "IP limit",
94− "interval": "<time-interval-in-sec (int)>"
94+ "interval": "<time-interval-in-sec (int)>",
95 "limit": "<max-request-number-in-interval (int)>",
95 "limit": "<max-request-number-in-interval (int)>",
96 "stop": true,
96 "stop": true,
97 "aggregations": [
97 "aggregations": [
@@ -111,7 +111,7 @@ of:
111 "filters": [
111 "filters": [
112 "Param:format=(csv|json|rss)"
112 "Param:format=(csv|json|rss)"
114− "interval": "<time-interval-in-sec (int)>"
114+ "interval": "<time-interval-in-sec (int)>",
115 "limit": "<max-request-number-in-interval (int)>",
115 "limit": "<max-request-number-in-interval (int)>",
116 "stop": true,
116 "stop": true,
117 "actions": [
117 "actions": [
@@ -125,7 +125,7 @@ of:
127 "name": "useragent limit",
127 "name": "useragent limit",
128− "interval": "<time-interval-in-sec (int)>"
128+ "interval": "<time-interval-in-sec (int)>",
129 "limit": "<max-request-number-in-interval (int)>",
129 "limit": "<max-request-number-in-interval (int)>",
130 "aggregations": [
130 "aggregations": [
131 "Header:User-Agent"
131 "Header:User-Agent"
@@ -173,7 +173,7 @@ Use it along with ``nginx`` with the following example configuration.
173 location /searx {
173 location /searx {
174 proxy_pass http://127.0.0.1:4004/;
174 proxy_pass http://127.0.0.1:4004/;
176− proxy_set_header Host $http_host;
176+ proxy_set_header Host $host;
177 proxy_set_header Connection $http_connection;
177 proxy_set_header Connection $http_connection;
178 proxy_set_header X-Real-IP $remote_addr;
178 proxy_set_header X-Real-IP $remote_addr;
179 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
179 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
docs/admin/installation-apache.rst+8−7
@@ -180,10 +180,6 @@ modules and create a `Location`_ configuration for the searx site. In most
180distributions you have to un-comment the lines in the main configuration file,
180distributions you have to un-comment the lines in the main configuration file,
181except in :ref:`The Debian Layout`.
181except in :ref:`The Debian Layout`.
183−To pass the HTTP HOST header
184−With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
189 .. group-tab:: Ubuntu / debian
185 .. group-tab:: Ubuntu / debian
@@ -231,6 +227,11 @@ proxied host.
231 LoadModule proxy_module modules/mod_proxy.so
227 LoadModule proxy_module modules/mod_proxy.so
232 LoadModule proxy_http_module modules/mod_proxy_http.so
228 LoadModule proxy_http_module modules/mod_proxy_http.so
230+With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
233+.. _apache searx via filtron plus morty:
236 .. group-tab:: searx via filtron plus morty
237 .. group-tab:: searx via filtron plus morty
@@ -285,15 +286,15 @@ proxied host.
286 </Location>
287 </Location>
288− Note that reverse proxy advised to be used in case of single-user or
289− low-traffic instances. For a fully result proxification add :ref:`morty's
289+ For a fully result proxification add :ref:`morty's <searx morty>` **public
290− <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
290+ URL** to your :origin:`searx/settings.yml`:
292 .. code:: yaml
292 .. code:: yaml
294 result_proxy:
294 result_proxy:
295 # replace example.org with your server's public name
295 # replace example.org with your server's public name
296 url : https://example.org/morty
296 url : https://example.org/morty
297+ key : !!binary "insert_your_morty_proxy_key_here"
299 image_proxy : True
300 image_proxy : True
docs/admin/installation-docker.rst+39−7
@@ -9,20 +9,52 @@ Docker installation
10 :backlinks: entry
10 :backlinks: entry
14+Docker image searx/searx
15+========================
18+The docker image is `searx/searx <https://hub.docker.com/r/searx/searx>`_ (based on `github.com/searx/searx <https://github.com/searx/searx>`_).
12−Make sure you have installed Docker. For instance, you can deploy searx like this:
20+Make sure you have `installed Docker <https://docs.docker.com/get-docker/>`_. For instance, you can deploy a local instance:
14.. code:: sh
22.. code:: sh
16− docker pull wonderfall/searx
25+ docker pull searx/searx
17− docker run -d --name searx -p $PORT:8888 wonderfall/searx
26+ docker run --rm -d -v ${PWD}/searx:/etc/searx -p $PORT:8080 -e BASE_URL=http://localhost:$PORT/ searx/searx
19Go to ``http://localhost:$PORT``.
28Go to ``http://localhost:$PORT``.
21−See https://hub.docker.com/r/wonderfall/searx/ for more informations. It's also
30+Inside ``${PWD}/searx``, you will find ``settings.yml`` and ``uwsgi.ini``.
22−possible to build searx from the embedded Dockerfile.
31+You can modify these files according to your needs and restart the Docker image.
24.. code:: sh
38.. code:: sh
40+ docker run --rm -it searx/searx -h
42+.. program-output:: ../dockerfiles/docker-entrypoint.sh help
48+It's also possible to build searx from the embedded Dockerfile.
26− git clone https://github.com/asciimoo/searx.git
52+ git clone https://github.com/searx/searx.git
28− docker build -t whatever/searx .
54+ make docker.build
60+If you intend to create a public instance using Docker, see https://github.com/searx/searx-docker
docs/admin/installation-nginx.rst+15−13
@@ -9,7 +9,7 @@ Install with nginx
9.. _nginx server configuration:
9.. _nginx server configuration:
10 https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers
10 https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers
11.. _nginx beginners guide:
11.. _nginx beginners guide:
12− http://nginx.org/en/docs/beginners_guide.html
12+ https://nginx.org/en/docs/beginners_guide.html
13.. _Getting Started wiki:
13.. _Getting Started wiki:
14 https://www.nginx.com/resources/wiki/start/
14 https://www.nginx.com/resources/wiki/start/
15.. _uWSGI support from nginx:
15.. _uWSGI support from nginx:
@@ -163,6 +163,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
163 Create configuration at ``/etc/nginx/conf.d/searx`` and place a
163 Create configuration at ``/etc/nginx/conf.d/searx`` and place a
164 symlink to sites-enabled:
164 symlink to sites-enabled:
166+.. _nginx searx via filtron plus morty:
168 .. group-tab:: searx via filtron plus morty
170 .. group-tab:: searx via filtron plus morty
@@ -180,7 +182,7 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
180 location /searx {
182 location /searx {
181 proxy_pass http://127.0.0.1:4004/;
183 proxy_pass http://127.0.0.1:4004/;
183− proxy_set_header Host $http_host;
185+ proxy_set_header Host $host;
184 proxy_set_header Connection $http_connection;
186 proxy_set_header Connection $http_connection;
185 proxy_set_header X-Real-IP $remote_addr;
187 proxy_set_header X-Real-IP $remote_addr;
186 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
188 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -188,8 +190,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
188 proxy_set_header X-Script-Name /searx;
190 proxy_set_header X-Script-Name /searx;
191− location /searx/static {
193+ location /searx/static/ {
192− /usr/local/searx/searx-src/searx/static;
194+ alias /usr/local/searx/searx-src/searx/static/;
@@ -203,28 +205,28 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
203 location /morty {
205 location /morty {
204 proxy_pass http://127.0.0.1:3000/;
206 proxy_pass http://127.0.0.1:3000/;
206− proxy_set_header Host $http_host;
208+ proxy_set_header Host $host;
207 proxy_set_header Connection $http_connection;
209 proxy_set_header Connection $http_connection;
208 proxy_set_header X-Real-IP $remote_addr;
210 proxy_set_header X-Real-IP $remote_addr;
209 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
211 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
210 proxy_set_header X-Scheme $scheme;
212 proxy_set_header X-Scheme $scheme;
213− Note that reverse proxy advised to be used in case of single-user or
214− low-traffic instances. For a fully result proxification add :ref:`morty's
215+ For a fully result proxification add :ref:`morty's <searx morty>` **public
215− <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
216+ URL** to your :origin:`searx/settings.yml`:
217 .. code:: yaml
218 .. code:: yaml
219 result_proxy:
220 result_proxy:
220 # replace example.org with your server's public name
221 # replace example.org with your server's public name
221 url : https://example.org/morty
222 url : https://example.org/morty
223+ key : !!binary "insert_your_morty_proxy_key_here"
224 image_proxy : True
226 image_proxy : True
227− .. group-tab:: proxy or uWSGI
229+ .. group-tab:: proxy or uWSGI
229 Be warned, with this setup, your instance isn't :ref:`protected <searx
231 Be warned, with this setup, your instance isn't :ref:`protected <searx
230 filtron>`. Nevertheless it is good enough for intranet usage and it is a
232 filtron>`. Nevertheless it is good enough for intranet usage and it is a
@@ -307,8 +309,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
307 proxy_buffering off;
309 proxy_buffering off;
310− location /searx/static {
312+ location /searx/static/ {
311− alias /usr/local/searx/searx-src/searx/static;
313+ alias /usr/local/searx/searx-src/searx/static/;
314 The ``X-Script-Name /searx`` is needed by the searx implementation to
316 The ``X-Script-Name /searx`` is needed by the searx implementation to
@@ -326,8 +328,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
326 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
328 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
329− location /searx/static {
331+ location /searx/static/ {
330− alias /usr/local/searx/searx-src/searx;
332+ alias /usr/local/searx/searx-src/searx/;
333 For searx to work correctly the ``base_url`` must be set in the
335 For searx to work correctly the ``base_url`` must be set in the
docs/admin/installation-searx.rst+34−6
@@ -52,7 +52,7 @@ In the same shell create *virtualenv*:
52 :end-before: END create virtualenv
52 :end-before: END create virtualenv
54To install searx's dependencies, exit the searx *bash* session you opened above
54To install searx's dependencies, exit the searx *bash* session you opened above
55−and restart a new. Before install, first check if your *virualenv* was sourced
55+and restart a new. Before install, first check if your *virtualenv* was sourced
56from the login (*~/.profile*):
56from the login (*~/.profile*):
58.. kernel-include:: $DOCS_BUILD/includes/searx.rst
58.. kernel-include:: $DOCS_BUILD/includes/searx.rst
@@ -61,20 +61,48 @@ from the login (*~/.profile*):
64− Open a second terminal for the configuration tasks and left the ``(searx)$``
64+ Open a second terminal for the configuration tasks and leave the ``(searx)$``
65 terminal open for the tasks below.
65 terminal open for the tasks below.
68+.. _use_default_settings.yml:
67Configuration
70Configuration
68−==============
71+=============
73+.. sidebar:: ``use_default_settings: True``
70−Create a copy of the :origin:`searx/settings.yml` configuration file in system's
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>`
80+To create a initial ``/etc/searx/settings.yml`` you can start with a copy of the
81+file :origin:`utils/templates/etc/searx/use_default_settings.yml`. This setup
82+:ref:`use default settings <settings use_default_settings>` from
83+:origin:`searx/settings.yml` and is recommended since :pull:`2291` is merged.
71−*/etc* folder. Configure like shown below -- replace ``searx@\$(uname -n)`` with
85+For a *minimal setup*, configure like shown below – replace ``searx@$(uname
72−a name of your choice -- *and/or* edit ``/etc/searx/settings.yml`` if necessary.
86+-n)`` with a name of your choice, set ``ultrasecretkey`` -- *and/or* edit
87+``/etc/searx/settings.yml`` to your needs.
74.. kernel-include:: $DOCS_BUILD/includes/searx.rst
89.. kernel-include:: $DOCS_BUILD/includes/searx.rst
75 :start-after: START searx config
90 :start-after: START searx config
76 :end-before: END searx config
91 :end-before: END searx config
95+ .. group-tab:: Use default settings
97+ .. literalinclude:: ../../utils/templates/etc/searx/use_default_settings.yml
100+ .. group-tab:: searx/settings.yml
102+ .. literalinclude:: ../../searx/settings.yml
docs/admin/installation.rst+21−1
@@ -33,12 +33,24 @@ The following will install a setup as shown in :ref:`architecture`. First you
33need to get a clone. The clone is only needed for the installation procedure
33need to get a clone. The clone is only needed for the installation procedure
34and some maintenance tasks (alternatively you can create your own fork).
34and some maintenance tasks (alternatively you can create your own fork).
36+For the installation procedure, use a *sudoer* login to run the scripts. If you
37+install from ``root``, take into account that the scripts are creating a
38+``searx``, a ``filtron`` and a ``morty`` user. In the installation procedure
39+these new created users do need read access to the clone of searx, which is not
40+the case if you clone into a folder below ``/root``.
36.. code:: bash
42.. code:: bash
38 $ cd ~/Downloads
44 $ cd ~/Downloads
39− $ git clone https://github.com/asciimoo/searx searx
45+ $ git clone https://github.com/searx/searx searx
40 $ cd searx
46 $ cd searx
48+.. sidebar:: further read
51+ - :ref:`update searx`
52+ - :ref:`inspect searx`
42**Install** :ref:`searx service <searx.sh>`
54**Install** :ref:`searx service <searx.sh>`
44This installs searx as described in :ref:`installation basic`.
56This installs searx as described in :ref:`installation basic`.
@@ -64,3 +76,11 @@ If all services are running fine, you can add it to your HTTP server:
64- :ref:`installation apache`
76- :ref:`installation apache`
65- :ref:`installation nginx`
77- :ref:`installation nginx`
79+.. _git stash: https://git-scm.com/docs/git-stash
83+ About script's installation options have a look at chapter :ref:`toolboxing
84+ setup`. How to brand your instance see chapter :ref:`settings global`. To
85+ *stash* your instance's setup, `git stash`_ your clone's :origin:`Makefile`
86+ and :origin:`.config.sh` file .
docs/admin/morty.rst+11−4
@@ -16,15 +16,22 @@ By default searx can only act as an image proxy for result images, but it is
16possible to proxify all the result URLs with an external service, morty_.
16possible to proxify all the result URLs with an external service, morty_.
18To use this feature, morty has to be installed and activated in searx's
18To use this feature, morty has to be installed and activated in searx's
21−Add the following snippet to your ``settings.yml`` and restart searx:
19+``settings.yml``. Add the following snippet to your ``settings.yml`` and
23.. code:: yaml
22.. code:: yaml
25 result_proxy:
24 result_proxy:
26 url : http://127.0.0.1:3000/
25 url : http://127.0.0.1:3000/
27− key : your_morty_proxy_key
26+ key : !!binary "insert_your_morty_proxy_key_here"
28+Note that the example above (``http://127.0.0.1:3000``) is only for single-user
29+instances without a HTTP proxy. If your morty service is public, the url is the
30+address of the reverse proxy (e.g ``https://example.org/morty``).
32+For more information about *result proxy* have a look at *"searx via filtron
33+plus morty"* in the :ref:`nginx <nginx searx via filtron plus morty>` and
34+:ref:`apache <apache searx via filtron plus morty>` sections.
30 Is the address of the running morty service.
37 Is the address of the running morty service.
docs/admin/plugins.rst+1−1
@@ -14,7 +14,7 @@ Configuration defaults (at built time):
15.. _configured plugins:
15.. _configured plugins:
17−.. jinja:: webapp
17+.. jinja:: searx
19 .. flat-table:: Plugins configured at built time (defaults)
19 .. flat-table:: Plugins configured at built time (defaults)
20 :header-rows: 1
20 :header-rows: 1
docs/admin/settings.rst+273−69
@@ -9,6 +9,7 @@ file.
10.. sidebar:: Further reading ..
10.. sidebar:: Further reading ..
12+ - :ref:`use_default_settings.yml`
12 - :ref:`search API`
13 - :ref:`search API`
14.. contents:: Contents
15.. contents:: Contents
@@ -16,104 +17,205 @@ file.
17 :backlinks: entry
18 :backlinks: entry
20+.. _settings location:
25+First, searx will try to load settings.yml from these locations:
27+1. the full path specified in the ``SEARX_SETTINGS_PATH`` environment variable.
28+2. ``/etc/searx/settings.yml``
30+If these files don't exist (or are empty or can't be read), searx uses the
31+:origin:`searx/settings.yml` file.
19.. _settings global:
34.. _settings global:
21Global Settings
36Global Settings
22===============
37===============
24.. code:: yaml
42.. code:: yaml
28− secret_key : "ultrasecretkey" # change this!
29− debug : False # debug mode, only for development
45+ debug : False # Debug mode, only for development
30− request_timeout : 2.0 # seconds
46+ instance_name : "searx" # displayed name
31− base_url : False # set custom base_url (or False)
47+ git_url: https://github.com/searx/searx
32− themes_path : "" # custom ui themes path
48+ git_branch: master
33− default_theme : oscar # ui theme
49+ issue_url: https://github.com/searx/searx/issues
34− useragent_suffix : "" # suffix of searx_useragent, could contain
50+ docs_url: https://searx.github.io/searx
35− # informations like admins email address
51+ public_instances: https://searx.space
36− image_proxy : False # proxying image results through searx
52+ contact_url: False # mailto:contact@example.com
37− default_locale : "" # default interface locale
53+ wiki_url: https://github.com/searx/searx/wiki
54+ twitter_url: https://twitter.com/Searx_engine
39− # uncomment below section if you want to use a proxy
56+``debug`` :
57+ Allow a more detailed log if you run searx directly. Display *detailed* error
58+ messages in the browser too, so this must be deactivated in production.
41− #outgoing_proxies :
60+``contact_url``:
42− # http : http://127.0.0.1:8080
61+ Contact ``mailto:`` address or WEB form.
43− # https: http://127.0.0.1:8080
45− # uncomment below section only if you have more than one network interface
63+``git_url`` and ``git_branch``:
46− # which can be the source of outgoing search requests
64+ Changes this, to point to your searx fork (branch).
48− #source_ips:
66+``docs_url``
49− # - 1.1.1.1
67+ If you host your own documentation, change this URL.
52− locales:
69+``wiki_url``:
53− en : English
70+ Link to your wiki (or ``False``)
73+ Link to your tweets (or ``False``)
68− Port number of the searx web application if you run it directly using ``python
69− searx/webapp.py``. Doesn't apply to searx running on Apache or Nginx.
71−``secret_key`` :
76+``server:``
72− Used for cryptography purpose.
77+-----------
74−``debug`` :
79+.. code:: yaml
75− Allow a more detailed log if you run searx directly. Display *detailed* error
76− messages in the browser too, so this must be deactivated in production.
78−``request_timeout`` :
81+ server:
79− Global timeout of the requests made to others engines in seconds. A bigger
82+ port : 8888
80− timeout will allow to wait for answers from slow engines, but in consequence
83+ bind_address : "127.0.0.1" # address to listen on
81− will slow searx reactivity (the result page may take the time specified in the
84+ secret_key : "ultrasecretkey" # change this!
82− timeout to load)
85+ base_url : False # set custom base_url (or False)
86+ image_proxy : False # proxying image results through searx
87+ default_locale : "" # default interface locale
88+ default_theme : oscar # ui theme
89+ default_http_headers:
90+ X-Content-Type-Options : nosniff
91+ X-XSS-Protection : 1; mode=block
92+ X-Download-Options : noopen
93+ X-Robots-Tag : noindex, nofollow
94+ Referrer-Policy : no-referrer
96+``port`` & ``bind_address``:
97+ Port number and *bind address* of the searx web application if you run it
98+ directly using ``python searx/webapp.py``. Doesn't apply to searx running on
102+ Used for cryptography purpose.
84``base_url`` :
104``base_url`` :
85 The base URL where searx is deployed. Used to create correct inbound links.
105 The base URL where searx is deployed. Used to create correct inbound links.
88− Path to where the themes are located. If you didn't develop anything, leave it
92− Name of the theme you want to use by default on you searx instance.
94−``useragent_suffix`` :
95− Suffix to the user-agent searx uses to send requests to others engines. If an
96− engine wish to block you, a contact info here may be useful to avoid that.
98``image_proxy`` :
107``image_proxy`` :
99 Allow your instance of searx of being able to proxy images. Uses memory space.
108 Allow your instance of searx of being able to proxy images. Uses memory space.
101``default_locale`` :
110``default_locale`` :
102− Aearx interface language. If blank, the locale is detected by using the
111+ Searx interface language. If blank, the locale is detected by using the
103 browser language. If it doesn't work, or you are deploying a language
112 browser language. If it doesn't work, or you are deploying a language
104 specific instance of searx, a locale can be defined using an ISO language
113 specific instance of searx, a locale can be defined using an ISO language
105 code, like ``fr``, ``en``, ``de``.
114 code, like ``fr``, ``en``, ``de``.
107−.. _requests proxies: http://requests.readthedocs.io/en/latest/user/advanced/#proxies
116+``default_theme`` :
108−.. _PR SOCKS support: https://github.com/kennethreitz/requests/pull/478
117+ Name of the theme you want to use by default on your searx instance.
119+.. _HTTP headers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
110−``outgoing_proxies`` :
121+``default_http_headers``:
122+ Set additional HTTP headers, see `#755 <https://github.com/searx/searx/issues/715>`__
129+ outgoing: # communication with search engines
130+ request_timeout : 2.0 # default timeout in seconds, can be override by engine
131+ # max_request_timeout: 10.0 # the maximum timeout in seconds
132+ 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.
134+ pool_maxsize : 10 # Number of allowable keep-alive connections, or None to always allow. The default is 10.
135+ enable_http2: True # See https://www.python-httpx.org/http2/
136+ # uncomment below section if you want to use a proxy
139+ # - http://proxy1:8080
140+ # - http://proxy2:8080
141+ # uncomment below section only if you have more than one network interface
142+ # which can be the source of outgoing search requests
149+``request_timeout`` :
150+ Global timeout of the requests made to others engines in seconds. A bigger
151+ timeout will allow to wait for answers from slow engines, but in consequence
152+ will slow searx reactivity (the result page may take the time specified in the
153+ timeout to load). Can be override by :ref:`settings engine`
155+``useragent_suffix`` :
156+ 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.
159+``keepalive_expiry``:
160+ Number of seconds to keep a connection in the pool. By default 5.0 seconds.
162+.. _httpx proxies: https://www.python-httpx.org/advanced/#http-proxying
111− Define a proxy you wish to use, see `requests proxies`_. SOCKS proxies are
165+ Define one or more proxies you wish to use, see `httpx proxies`_.
112− not supported / see `PR SOCKS support`.
166+ If there are more than one proxy for one protocol (http, https),
167+ requests to the engines are distributed in a round-robin fashion.
114``source_ips`` :
169``source_ips`` :
115− If you use multiple nework interfaces, define from which IP the requests must
170+ If you use multiple network interfaces, define from which IP the requests must
116− be made.
171+ be made. Example:
173+ * ``0.0.0.0`` any local IPv4 address.
174+ * ``::`` any local IPv6 address.
176+ * ``[ 192.168.0.1, 192.168.0.2 ]`` these two specific IP addresses
177+ * ``fe80::60a2:1691:e5a2:ee1f``
178+ * ``fe80::60a2:1691:e5a2:ee1f/126`` all IP addresses in this network.
179+ * ``[ 192.168.0.1, fe80::/126 ]``
182+ Number of retry in case of an HTTP error.
183+ On each retry, searx uses an different proxy and source ip.
185+``retry_on_http_error`` :
186+ Retry request on some HTTP status code.
190+ * ``true`` : on HTTP status code between 400 and 599.
191+ * ``403`` : on HTTP status code 403.
192+ * ``[403, 429]``: on HTTP status code 403 and 429.
195+ Enable by default. Set to ``False`` to disable HTTP/2.
198+ 30 by default. Maximum redirect before it is an error.
118``locales`` :
220``locales`` :
119 Locales codes and their names. Available translations of searx interface.
221 Locales codes and their names. Available translations of searx interface.
@@ -139,9 +241,25 @@ Engine settings
139 api_key : 'apikey'
241 api_key : 'apikey'
140 disabled : True
242 disabled : True
141 language : en_US
243 language : en_US
245+ #enable_http2: False
247+ #retry_on_http_error: True # or 403 or [404, 429]
248+ #max_connections: 100
249+ #max_keepalive_connections: 10
250+ #keepalive_expiry: 5.0
253+ # - http://proxy1:8080
254+ # - http://proxy2:8080
256+ # - http://proxy1:8080
257+ # - http://proxy2:8080
258+ # - socks5://user:password@proxy3:1080
259+ # - socks5h://user:password@proxy4:1080
143``name`` :
261``name`` :
144− Name that will be used accross searx to define this engine. In settings, on
262+ Name that will be used across searx to define this engine. In settings, on
145 the result page...
263 the result page...
147``engine`` :
265``engine`` :
@@ -152,7 +270,7 @@ Engine settings
152 Code used to execute bang requests (in this case using ``!bi`` or ``?bi``)
270 Code used to execute bang requests (in this case using ``!bi`` or ``?bi``)
154``base_url`` : optional
272``base_url`` : optional
155− Part of the URL that should be stable accross every request. Can be useful to
273+ Part of the URL that should be stable across every request. Can be useful to
156 use multiple sites using only one engine, or updating the site URL without
274 use multiple sites using only one engine, or updating the site URL without
157 touching at the code.
275 touching at the code.
@@ -170,7 +288,7 @@ Engine settings
170 is described in the file.
288 is described in the file.
172``disabled`` : optional
290``disabled`` : optional
173− To disable by default the engine, but not deleting it. It will allow the user
291+ To disable by default the engine, but not deleting it. It will allow the user
174 to manually activate it in the settings.
292 to manually activate it in the settings.
176``language`` : optional
294``language`` : optional
@@ -184,7 +302,93 @@ Engine settings
184``display_error_messages`` : default ``True``
302``display_error_messages`` : default ``True``
185 When an engine returns an error, the message is displayed on the user interface.
303 When an engine returns an error, the message is displayed on the user interface.
305+``network``: optional
306+ Use the network configuration from another engine.
307+ In addition, there are two default networks:
308+ * ``ipv4`` set ``local_addresses`` to ``0.0.0.0`` (use only IPv4 local addresses)
309+ * ``ipv6`` set ``local_addresses`` to ``::`` (use only IPv6 local addresses)
189 A few more options are possible, but they are pretty specific to some
313 A few more options are possible, but they are pretty specific to some
190 engines, and so won't be described here.
314 engines, and so won't be described here.
317+.. _settings use_default_settings:
322+.. sidebar:: ``use_default_settings: True``
324+ - :ref:`settings location`
325+ - :ref:`use_default_settings.yml`
326+ - :origin:`/etc/searx/settings.yml <utils/templates/etc/searx/use_default_settings.yml>`
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:
331+ ``use_default_settings: True``
334+ In the following example, the actual settings are the default settings defined
335+ in :origin:`searx/settings.yml` with the exception of the ``secret_key`` and
336+ the ``bind_address``:
338+ .. code-block:: yaml
340+ use_default_settings: True
342+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
343+ bind_address: "0.0.0.0"
346+ With ``use_default_settings: True``, each settings can be override in a
347+ similar way, the ``engines`` section is merged according to the engine
348+ ``name``. In this example, searx will load all the engine and the arch linux
349+ wiki engine has a :ref:`token<private engines>`:
351+ .. code-block:: yaml
353+ use_default_settings: True
355+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
357+ - name: arch linux wiki
358+ tokens: ['$ecretValue']
360+``engines:`` / ``remove:``
361+ It is possible to remove some engines from the default settings. The following
362+ example is similar to the above one, but searx doesn't load the the google
365+ .. code-block:: yaml
367+ use_default_settings:
372+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
374+ - name: arch linux wiki
375+ tokens: ['$ecretValue']
377+``engines:`` / ``keep_only:``
378+ As an alternative, it is possible to specify the engines to keep. In the
379+ following example, searx has only two engines:
381+ .. code-block:: yaml
383+ use_default_settings:
389+ secret_key: "uvys6bRhKHUdFF5CqbJonSDSRN8H0sCBziNSrDGNVdpz7IeZhveVart3yvghoKHA"
392+ tokens: ['$ecretValue']
394+ tokens: ['$ecretValue']
docs/admin/update-searx.rst+46−10
@@ -4,20 +4,56 @@
4How to update
4How to update
5=============
5=============
7+How to update depends on the :ref:`installation` method. If you have used the
8+:ref:`installation scripts`, use ``update`` command from the scripts.
10+**Update** :ref:`searx service <searx.sh>`
14+ sudo -H ./utils/searx.sh update searx
16+**Update** :ref:`filtron reverse proxy <filtron.sh>`
7.. code:: sh
18.. code:: sh
20+ sudo -H ./utils/filtron.sh update filtron
22+**Update** :ref:`result proxy <morty.sh>`
26+ sudo -H ./utils/morty.sh update morty
9− sudo -H -u searx -i
28+.. _inspect searx:
10− (searx)$ git stash
29+
11− (searx)$ git pull origin master
30+======================
12− (searx)$ git stash apply
31+How to inspect & debug
13− (searx)$ ./manage.sh update_packages
32+======================
34+.. sidebar:: further read
39+How to debug depends on the :ref:`installation` method. If you have used the
40+:ref:`installation scripts`, use ``inspect`` command from the scripts.
42+**Inspect** :ref:`searx service <searx.sh>`
46+ sudo -H ./utils/searx.sh inspect service
48+**Inspect** :ref:`filtron reverse proxy <filtron.sh>`
15−Restart uwsgi:
52+ sudo -H ./utils/filtron.sh inspect service
17−.. tabs::
54+**Inspect** :ref:`result proxy <morty.sh>`
19− .. group-tab:: Ubuntu / debian
56+.. code:: bash
21− .. code:: sh
58+ sudo -H ./utils/morty.sh inspect service
23− sudo -H systemctl restart uwsgi
docs/blog/command-line-engines.rstnew file+65
@@ -0,0 +1,65 @@
1+========================================
2+Running shell commands to fetch results
3+========================================
5+Previously, with searx you could search over the Internet on other people's
6+computers. Now it is possible to fetch results from your local machine without
7+connecting to any networks from the same graphical user interface.
13+In :pull:`2128` a new type of engine has been introduced called ``command``.
14+This engine lets administrators add engines which run arbitrary shell commands
15+and show its output on the web UI of searx.
17+When creating and enabling a ``command`` engine on a public searx instance,
18+you must be careful to avoid leaking private data. The easiest solution
19+is to add tokens to the engine. Thus, only those who have the appropriate token
20+can retrieve results from the it.
22+The engine base is flexible. Only your imagination can limit the power of this engine. (And
23+maybe security concerns.) The following options are available:
25+* ``command``: A comma separated list of the elements of the command. A special token {{QUERY}} tells searx where to put the search terms of the user. Example: ``['ls', '-l', '-h', '{{QUERY}}']``
26+* ``delimiter``: A dict containing a delimiter char and the "titles" of each element in keys.
27+* ``parse_regex``: A dict containing the regular expressions for each result key.
28+* ``query_type``: The expected type of user search terms. Possible values: ``path`` and ``enum``. ``path`` checks if the uesr provided path is inside the working directory. If not the query is not executed. ``enum`` is a list of allowed search terms. If the user submits something which is not included in the list, the query returns an error.
29+* ``query_enum``: A list containing allowed search terms if ``query_type`` is set to ``enum``.
30+* ``working_dir``: The directory where the command has to be executed. Default: ``.``
31+* ``result_separator``: The character that separates results. Default: ``\n``
34+The example engine below can be used to find files with a specific name in the configured
41+ command: ['find', '.', '-name', '{{QUERY}}']
52+In the next milestone, support for local search engines and indexers (e.g. Elasticsearch)
53+are going to be added. This way, you will be able to query your own databases/indexers.
58+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
60+.. _Search and Discovery Fund: https://nlnet.nl/discovery
61+.. _NLnet Foundation: https://nlnet.nl/
65+| kvch // 2020.09.28 21:26
@@ -3,11 +3,15 @@ Blog
5.. toctree::
5.. toctree::
6− :maxdepth: 2
6+ :titlesonly:
7− :caption: Contents
7+ :reversed:
12 intro-offline
11 intro-offline
13 private-engines
12 private-engines
15+ search-indexer-engines
17+ search-database-engines
docs/blog/lxcdev-202006.rst+6−6
@@ -31,7 +31,7 @@ might fail in some aspects we should not overlook.
32 The environment in which we run all our development processes matters!
32 The environment in which we run all our development processes matters!
34−The :ref:`makefile` and the :ref:`make pyenv` encapsulate a lot for us, but they
34+The :ref:`makefile` and the :ref:`make install` encapsulate a lot for us, but they
35do not have access to all prerequisites. For example, there may have
35do not have access to all prerequisites. For example, there may have
36dependencies on packages that are installed on the developer's desktop, but
36dependencies on packages that are installed on the developer's desktop, but
37usually are not preinstalled on a server or client system. Another examples
37usually are not preinstalled on a server or client system. Another examples
@@ -81,7 +81,7 @@ fork:
81 .. code:: sh
81 .. code:: sh
83 $ cd ~/Downloads
83 $ cd ~/Downloads
84− $ git clone https://github.com/asciimoo/searx.git
84+ $ git clone https://github.com/searx/searx.git
85 $ cd searx
85 $ cd searx
87The :ref:`lxc-searx.env` consists of several images, see ``export
87The :ref:`lxc-searx.env` consists of several images, see ``export
@@ -259,8 +259,8 @@ suite. For this, we have to keep an eye on the :ref:`installation basic`:
259- virtualenv in: ``/usr/local/searx/searx-pyenv``
259- virtualenv in: ``/usr/local/searx/searx-pyenv``
260- searx software in: ``/usr/local/searx/searx-src``
260- searx software in: ``/usr/local/searx/searx-src``
262−The searx software is a clone of the ``GIT_URL`` (see :ref:`makefile setup`) and
262+The searx software is a clone of the ``git_url`` (see :ref:`settings global`) and
263−the working tree is checked out from the ``GIT_BRANCH``. With the use of the
263+the working tree is checked out from the ``git_branch``. With the use of the
264:ref:`searx.sh` the searx service was installed as :ref:`uWSGI application
264:ref:`searx.sh` the searx service was installed as :ref:`uWSGI application
265<searx uwsgi>`. To maintain this service, we can use ``systemctl`` (compare
265<searx uwsgi>`. To maintain this service, we can use ``systemctl`` (compare
266:ref:`service architectures on distributions <uwsgi configuration>`).
266:ref:`service architectures on distributions <uwsgi configuration>`).
@@ -356,7 +356,7 @@ daily usage:
356 .. code:: sh
356 .. code:: sh
358 $ sudo -H ./utils/lxc.sh cmd searx-archlinux \
358 $ sudo -H ./utils/lxc.sh cmd searx-archlinux \
359− make docs
359+ make docs.html
361.. _blog-lxcdev-202006 abstract:
361.. _blog-lxcdev-202006 abstract:
@@ -407,7 +407,7 @@ To get remarks from the suite of the archlinux container we can use:
408 [searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
408 [searx-archlinux] INFO: (eth0) filtron: http://10.174.184.156:4004/ http://10.174.184.156/searx
409 [searx-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/
409 [searx-archlinux] INFO: (eth0) morty: http://10.174.184.156:3000/
410− [searx-archlinux] INFO: (eth0) docs-live: http://10.174.184.156:8080/
410+ [searx-archlinux] INFO: (eth0) docs.live: http://10.174.184.156:8080/
411 [searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
411 [searx-archlinux] INFO: (eth0) IPv6: http://[fd42:573b:e0b3:e97e:216:3eff:fea5:9b65]
docs/blog/private-engines.rst+2
@@ -7,6 +7,8 @@ enabled engines on their instances. It might be because they do not want to
7expose some private information through an offline engine. Or they
7expose some private information through an offline engine. Or they
8would rather share engines only with their trusted friends or colleagues.
8would rather share engines only with their trusted friends or colleagues.
10Private engines
12Private engines
11===============
13===============
docs/blog/python3.rst+1−1
@@ -54,7 +54,7 @@ If you found bugs
54Please open an issue on `GitHub`_. Make sure that you mention your Python
54Please open an issue on `GitHub`_. Make sure that you mention your Python
55version in your issue, so we can investigate it properly.
55version in your issue, so we can investigate it properly.
57−.. _GitHub: https://github.com/asciimoo/searx/issues
57+.. _GitHub: https://github.com/searx/searx/issues
59Acknowledgment
59Acknowledgment
60==============
60==============
docs/blog/search-database-engines.rstnew file+95
@@ -0,0 +1,95 @@
1+===============================
2+Query more of your NoSQL stores
3+===============================
5+From now on, searx lets you to query your NoSQL data stores:
10+The reference configuration of the engines are included ``settings.yml`` just commented out,
11+as you have to set various options and install dependencies before using them.
13+By default, the engines use ``key-value`` template for displaying results.
14+If you are not satisfied with the original result layout,
15+you can use your owm template by placing the template under
16+``searx/templates/{theme_name}/result_templates/{template_name}`` and setting
17+``result_template`` attribute to ``{template_name}``.
19+Futhermore, if you do not want to expose these engines on a public instance, you can
20+still add them and limit the access by setting ``tokens`` as described in the `blog post about
23+Configuring searx to use the stores
24+===================================
26+NoSQL data stores are used for storing arbitrary data without first defining their
32+Reqired package: ``redis``
34+Redis is a key value based data store usually stored in memory.
36+Select a database to search in and set its index in the option ``db``. You can
37+either look for exact matches or use partial keywords to find what you are looking for
38+by configuring ``exact_match_only``.
40+In this example you can search for exact matches in your first database:
45+ engine : redis_server
46+ exact_match_only : True
49+ password : secret-password
58+Required package: ``pymongo``
60+MongoDB is a document based database program that handles JSON like data.
62+In order to query MongoDB, you have to select a ``database`` and a ``collection``. Furthermore,
63+you have to select a ``key`` that is going to be searched. MongoDB also supports the option ``exact_match_only``, so configure it
66+Above is an example configuration for using a MongoDB collection:
84+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
86+.. _Redis: https://redis.io/
87+.. _MongoDB: https://mongodb.com/
88+.. _blog post about private engines: private-engines.html#private-engines
89+.. _Search and Discovery Fund: https://nlnet.nl/discovery
90+.. _NLnet Foundation: https://nlnet.nl/
94+| kvch // 2021.07.13 23:16
docs/blog/search-indexer-engines.rstnew file+114
@@ -0,0 +1,114 @@
1+===============================
2+Query your local search engines
3+===============================
5+From now on, searx lets you to query your locally running search engines. The following
6+ones are supported now:
12+All of the engines above are added to ``settings.yml`` just commented out, as you have to
13+``base_url`` for all them.
15+Please note that if you are not using HTTPS to access these engines, you have to enable
16+HTTP requests by setting ``enable_http`` to ``True``.
18+Futhermore, if you do not want to expose these engines on a public instance, you can
19+still add them and limit the access by setting ``tokens`` as described in the `blog post about
22+Configuring searx for search engines
23+====================================
25+Each search engine is powerful, capable of full-text search.
30+Elasticsearch supports numerous ways to query the data it is storing. At the moment
31+the engine supports the most popular search methods: ``match``, ``simple_query_string``, ``term`` and ``terms``.
33+If none of the methods fit your use case, you can select ``custom`` query type and provide the JSON payload
34+searx has to submit to Elasticsearch in ``custom_query_json``.
36+The following is an example configuration for an Elasticsearch instance with authentication
37+configured to read from ``my-index`` index.
41+ - name : elasticsearch
43+ engine : elasticsearch
44+ base_url : http://localhost:9200
55+This search engine is aimed at individuals and small companies. It is designed for
56+small-scale (less than 10 million documents) data collections. E.g. it is great for storing
57+web pages you have visited and searching in the contents later.
59+The engine supports faceted search, so you can search in a subset of documents of the collection.
60+Futhermore, you can search in Meilisearch instances that require authentication by setting ``auth_token``.
62+Here is a simple example to query a Meilisearch instance:
69+ base_url : http://localhost:7700
77+Solr is a popular search engine based on Lucene, just like Elasticsearch.
78+But instead of searching in indices, you can search in collections.
80+This is an example configuration for searching in the collection ``my-collection`` and get
81+the results in ascending order.
88+ base_url : http://localhost:8983
89+ collection : my-collection
97+The next step is to add support for various SQL databases.
102+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
104+.. _blog post about private engines: private-engines.html#private-engines
105+.. _Elasticsearch: https://www.elastic.co/elasticsearch/
106+.. _Meilisearch: https://www.meilisearch.com/
107+.. _Solr: https://solr.apache.org/
108+.. _Search and Discovery Fund: https://nlnet.nl/discovery
109+.. _NLnet Foundation: https://nlnet.nl/
113+| kvch // 2021.04.07 23:16
docs/blog/sql-engines.rstnew file+117
@@ -0,0 +1,117 @@
5+Now you can query SQL servers using searx. The following ones are supported:
11+All of the engines above are added to ``settings.yml`` just commented out, as you have to
12+set the required attributes for the engines, e.g. ``database``. By default, the engines use
13+``key-value`` template for displaying results. If you are not satisfied with the original result layout,
14+you can use your owm template by placing the template under
15+``searx/templates/{theme_name}/result_templates/{template_name}`` and setting
16+``result_template`` attribute to ``{template_name}``.
18+As mentioned in previous blog posts, if you do not wish to expose these engines on a
19+public instance, you can still add them and limit the access by setting ``tokens``
20+as described in the `blog post about private engines`_.
25+The configuration of the new database engines are similar. You must put a valid
26+SELECT SQL query in ``query_str``. At the moment you can only bind at most
27+one parameter in your query. By setting the attribute ``limit`` you can
28+define how many results you want from the SQL server. Basically, it
29+is the same as the LIMIT keyword in SQL.
31+Please, do not include LIMIT or OFFSET in your SQL query as the engines
32+rely on these keywords during paging. If you want to configure the number of returned results
33+use the option ``limit``.
38+PostgreSQL is a powerful and robust open source database.
40+Before configuring the PostgreSQL engine, you must install the dependency ``psychopg2``.
42+You can find an example configuration below:
48+ database : my_database
51+ query_str : 'SELECT * from my_table WHERE my_column = %(query)s'
58+MySQL is said to be the most popular open source database.
60+Before enabling MySQL engine, you must install the package ``mysql-connector-python``.
62+The authentication plugin is configurable by setting ``auth_plugin`` in the attributes.
63+By default it is set to ``caching_sha2_password``.
65+This is an example configuration for quering a MySQL server:
70+ engine : mysql_server
71+ database : my_database
75+ query_str : 'SELECT * from my_table WHERE my_column=%(query)s'
82+SQLite is a small, fast and reliable SQL database engine. It does not require
85+You can read from your database ``my_database`` using this example configuration:
92+ database : my_database
93+ query_str : 'SELECT * FROM my_table WHERE my_column=:query'
99+The next step is to add support for more data stores, e.g. Redis and MongoDB.
104+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
106+.. _PostgreSQL: https://www.postgresql.org/
107+.. _MySQL: https://www.mysql.com/
108+.. _SQLite: https://www.sqlite.org/index.html
109+.. _blog post about private engines: private-engines.html#private-engines
110+.. _Search and Discovery Fund: https://nlnet.nl/discovery
111+.. _NLnet Foundation: https://nlnet.nl/
115+| kvch // 2021.05.23 23:16
docs/build-templates/filtron.rst+10−10
@@ -7,11 +7,11 @@
7 .. code-block:: sh
7 .. code-block:: sh
9 $ sudo -H useradd --shell /bin/bash --system \\
9 $ sudo -H useradd --shell /bin/bash --system \\
10− --home-dir "$SERVICE_HOME" \\
10+ --home-dir \"$SERVICE_HOME\" \\
11− --comment "Privacy-respecting metasearch engine" $SERVICE_USER
11+ --comment \"Privacy-respecting metasearch engine\" $SERVICE_USER
13− $ sudo -H mkdir "$SERVICE_HOME"
13+ $ sudo -H mkdir \"$SERVICE_HOME\"
14− $ sudo -H chown -R "$SERVICE_GROUP:$SERVICE_GROUP" "$SERVICE_HOME"
14+ $ sudo -H chown -R \"$SERVICE_GROUP:$SERVICE_GROUP\" \"$SERVICE_HOME\"
16.. END create user
16.. END create user
@@ -23,16 +23,16 @@
24 .. code-block:: bash
24 .. code-block:: bash
26− $ cat > "$GO_ENV" <<EOF
26+ $ cat > \"$GO_ENV\" <<EOF
27 export GOPATH=${SERVICE_HOME}/go-apps
27 export GOPATH=${SERVICE_HOME}/go-apps
28 export PATH=\$PATH:${SERVICE_HOME}/local/go/bin:\$GOPATH/bin
28 export PATH=\$PATH:${SERVICE_HOME}/local/go/bin:\$GOPATH/bin
30− $ sudo -i -u "${SERVICE_USER}"
30+ $ sudo -i -u \"${SERVICE_USER}\"
31 (${SERVICE_USER}) $ echo 'source $GO_ENV' >> ~/.profile
31 (${SERVICE_USER}) $ echo 'source $GO_ENV' >> ~/.profile
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
33− (${SERVICE_USER}) $ wget --progress=bar -O "${GO_TAR}" \\
33+ (${SERVICE_USER}) $ wget --progress=bar -O \"${GO_TAR}\" \\
34− "${GO_PKG_URL}"
34+ \"${GO_PKG_URL}\"
35− (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local/go -xzf "${GO_TAR}"
35+ (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local -xzf \"${GO_TAR}\"
36 (${SERVICE_USER}) $ which go
36 (${SERVICE_USER}) $ which go
37 ${SERVICE_HOME}/local/go/bin/go
37 ${SERVICE_HOME}/local/go/bin/go
@@ -46,7 +46,7 @@
47 .. code-block:: bash
47 .. code-block:: bash
49− $ sudo -i -u "${SERVICE_USER}"
49+ $ sudo -i -u \"${SERVICE_USER}\"
50 (${SERVICE_USER}) $ go get -v -u github.com/asciimoo/filtron
50 (${SERVICE_USER}) $ go get -v -u github.com/asciimoo/filtron
52.. END install filtron
52.. END install filtron
docs/build-templates/morty.rst+10−10
@@ -7,11 +7,11 @@
7 .. code-block:: sh
7 .. code-block:: sh
9 $ sudo -H useradd --shell /bin/bash --system \\
9 $ sudo -H useradd --shell /bin/bash --system \\
10− --home-dir "$SERVICE_HOME" \\
10+ --home-dir \"$SERVICE_HOME\" \\
11− --comment "Privacy-respecting metasearch engine" $SERVICE_USER
11+ --comment \"Privacy-respecting metasearch engine\" $SERVICE_USER
13− $ sudo -H mkdir "$SERVICE_HOME"
13+ $ sudo -H mkdir \"$SERVICE_HOME\"
14− $ sudo -H chown -R "$SERVICE_GROUP:$SERVICE_GROUP" "$SERVICE_HOME"
14+ $ sudo -H chown -R \"$SERVICE_GROUP:$SERVICE_GROUP\" \"$SERVICE_HOME\"
16.. END create user
16.. END create user
@@ -23,16 +23,16 @@
24 .. code-block:: bash
24 .. code-block:: bash
26− $ cat > "$GO_ENV" <<EOF
26+ $ cat > \"$GO_ENV\" <<EOF
27 export GOPATH=${SERVICE_HOME}/go-apps
27 export GOPATH=${SERVICE_HOME}/go-apps
28 export PATH=\$PATH:${SERVICE_HOME}/local/go/bin:\$GOPATH/bin
28 export PATH=\$PATH:${SERVICE_HOME}/local/go/bin:\$GOPATH/bin
30− $ sudo -i -u "${SERVICE_USER}"
30+ $ sudo -i -u \"${SERVICE_USER}\"
31 (${SERVICE_USER}) $ echo 'source $GO_ENV' >> ~/.profile
31 (${SERVICE_USER}) $ echo 'source $GO_ENV' >> ~/.profile
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
32 (${SERVICE_USER}) $ mkdir ${SERVICE_HOME}/local
33− (${SERVICE_USER}) $ wget --progress=bar -O "${GO_TAR}" \\
33+ (${SERVICE_USER}) $ wget --progress=bar -O \"${GO_TAR}\" \\
34− "${GO_PKG_URL}"
34+ \"${GO_PKG_URL}\"
35− (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local/go -xzf "${GO_TAR}"
35+ (${SERVICE_USER}) $ tar -C ${SERVICE_HOME}/local -xzf \"${GO_TAR}\"
36 (${SERVICE_USER}) $ which go
36 (${SERVICE_USER}) $ which go
37 ${SERVICE_HOME}/local/go/bin/go
37 ${SERVICE_HOME}/local/go/bin/go
@@ -46,7 +46,7 @@
47 .. code-block:: bash
47 .. code-block:: bash
49− $ sudo -i -u "${SERVICE_USER}"
49+ $ sudo -i -u \"${SERVICE_USER}\"
50 (${SERVICE_USER}) $ go get -v -u github.com/asciimoo/morty
50 (${SERVICE_USER}) $ go get -v -u github.com/asciimoo/morty
52.. END install morty
52.. END install morty
docs/build-templates/searx.rst+34−16
@@ -64,11 +64,11 @@ ${fedora_build}
64 .. code-block:: sh
64 .. code-block:: sh
66 $ sudo -H useradd --shell /bin/bash --system \\
66 $ sudo -H useradd --shell /bin/bash --system \\
67− --home-dir "$SERVICE_HOME" \\
67+ --home-dir \"$SERVICE_HOME\" \\
68− --comment "Privacy-respecting metasearch engine" $SERVICE_USER
68+ --comment 'Privacy-respecting metasearch engine' $SERVICE_USER
70− $ sudo -H mkdir "$SERVICE_HOME"
70+ $ sudo -H mkdir \"$SERVICE_HOME\"
71− $ sudo -H chown -R "$SERVICE_GROUP:$SERVICE_GROUP" "$SERVICE_HOME"
71+ $ sudo -H chown -R \"$SERVICE_GROUP:$SERVICE_GROUP\" \"$SERVICE_HOME\"
73.. END create user
73.. END create user
@@ -81,7 +81,7 @@ ${fedora_build}
81 .. code-block:: sh
81 .. code-block:: sh
83 $ sudo -H -u ${SERVICE_USER} -i
83 $ sudo -H -u ${SERVICE_USER} -i
84− (${SERVICE_USER})$ git clone "https://github.com/asciimoo/searx.git" "$SEARX_SRC"
84+ (${SERVICE_USER})$ git clone \"https://github.com/searx/searx.git\" \"$SEARX_SRC\"
86.. END clone searx
86.. END clone searx
@@ -93,8 +93,8 @@ ${fedora_build}
94 .. code-block:: sh
94 .. code-block:: sh
96− (${SERVICE_USER})$ python3 -m venv "${SEARX_PYENV}"
96+ (${SERVICE_USER})$ python3 -m venv \"${SEARX_PYENV}\"
97− (${SERVICE_USER})$ echo ". ${SEARX_PYENV}/bin/activate" >> "$SERVICE_HOME/.profile"
97+ (${SERVICE_USER})$ echo \". ${SEARX_PYENV}/bin/activate\" >> \"$SERVICE_HOME/.profile\"
99.. END create virtualenv
99.. END create virtualenv
@@ -116,9 +116,10 @@ ${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 # jump to searx's working tree and install searx into virtualenv
121 # jump to searx's working tree and install searx into virtualenv
121− (${SERVICE_USER})$ cd "$SEARX_SRC"
122+ (${SERVICE_USER})$ cd \"$SEARX_SRC\"
122 (${SERVICE_USER})$ pip install -e .
123 (${SERVICE_USER})$ pip install -e .
@@ -128,13 +129,30 @@ ${fedora_build}
131− .. group-tab:: bash
132+ .. group-tab:: Use default settings
136+ $ sudo -H mkdir -p \"$(dirname ${SEARX_SETTINGS_PATH})\"
137+ $ sudo -H cp \"$SEARX_SRC/utils/templates/etc/searx/use_default_settings.yml\" \\
138+ \"${SEARX_SETTINGS_PATH}\"
140+ .. group-tab:: searx/settings.yml
144+ $ sudo -H mkdir -p \"$(dirname ${SEARX_SETTINGS_PATH})\"
145+ $ sudo -H cp \"$SEARX_SRC/searx/settings.yml\" \\
146+ \"${SEARX_SETTINGS_PATH}\"
150+ .. group-tab:: minimal setup
133 .. code-block:: sh
152 .. code-block:: sh
135− $ sudo -H cp "$SEARX_SRC/searx/settings.yml" "${SEARX_SETTINGS_PATH}"
136− $ sudo -H sed -i -e "s/ultrasecretkey/\\$(openssl rand -hex 16)/g" "$SEARX_SETTINGS_PATH"
154+ $ sudo -H sed -i -e \"s/ultrasecretkey/\$(openssl rand -hex 16)/g\" \"$SEARX_SETTINGS_PATH\"
137− $ sudo -H sed -i -e "s/{instance_name}/searx@\\$(uname -n)/g" "$SEARX_SETTINGS_PATH"
155+ $ sudo -H sed -i -e \"s/{instance_name}/searx@\$(uname -n)/g\" \"$SEARX_SETTINGS_PATH\"
139.. END searx config
157.. END searx config
@@ -147,16 +165,16 @@ ${fedora_build}
147 .. code-block:: sh
165 .. code-block:: sh
149 # enable debug ..
167 # enable debug ..
150− $ sudo -H sed -i -e "s/debug : False/debug : True/g" "$SEARX_SETTINGS_PATH"
168+ $ sudo -H sed -i -e \"s/debug : False/debug : True/g\" \"$SEARX_SETTINGS_PATH\"
152 # start webapp
170 # start webapp
153 $ sudo -H -u ${SERVICE_USER} -i
171 $ sudo -H -u ${SERVICE_USER} -i
154 (${SERVICE_USER})$ cd ${SEARX_SRC}
172 (${SERVICE_USER})$ cd ${SEARX_SRC}
155− (${SERVICE_USER})$ export SEARX_SETTINGS_PATH="${SEARX_SETTINGS_PATH}"
173+ (${SERVICE_USER})$ export SEARX_SETTINGS_PATH=\"${SEARX_SETTINGS_PATH}\"
156 (${SERVICE_USER})$ python searx/webapp.py
174 (${SERVICE_USER})$ python searx/webapp.py
158 # disable debug
176 # disable debug
159− $ sudo -H sed -i -e "s/debug : True/debug : False/g" "$SEARX_SETTINGS_PATH"
177+ $ sudo -H sed -i -e \"s/debug : True/debug : False/g\" \"$SEARX_SETTINGS_PATH\"
161Open WEB browser and visit http://$SEARX_INTERNAL_URL . If you are inside a
179Open WEB browser and visit http://$SEARX_INTERNAL_URL . If you are inside a
162container or in a script, test with curl:
180container or in a script, test with curl:
@@ -167,7 +185,7 @@ container or in a script, test with curl:
168 .. code-block:: sh
186 .. code-block:: sh
170− $ xgd-open http://$SEARX_INTERNAL_URL
188+ $ xdg-open http://$SEARX_INTERNAL_URL
172 .. group-tab:: curl
190 .. group-tab:: curl
@@ -1,19 +1,16 @@
1# -*- coding: utf-8 -*-
1# -*- coding: utf-8 -*-
2+# SPDX-License-Identifier: AGPL-3.0-or-later
3import sys, os
4import sys, os
4−from sphinx_build_tools import load_sphinx_config
5−from searx.version import VERSION_STRING
6from pallets_sphinx_themes import ProjectLink
5from pallets_sphinx_themes import ProjectLink
8−from searx.brand import GIT_URL
7+from searx import brand
9−GIT_BRANCH = os.environ.get("GIT_BRANCH", "master")
10−from searx.brand import SEARX_URL
11−from searx.brand import DOCS_URL
8+from searx.version import VERSION_STRING
13# Project --------------------------------------------------------------
10# Project --------------------------------------------------------------
15project = u'searx'
12project = u'searx'
16−copyright = u'2015-2020, Adam Tauber, Noémi Ványi'
13+copyright = u'2015-2021, Adam Tauber, Noémi Ványi'
17author = u'Adam Tauber'
14author = u'Adam Tauber'
18release, version = VERSION_STRING, VERSION_STRING
15release, version = VERSION_STRING, VERSION_STRING
19highlight_language = 'none'
16highlight_language = 'none'
@@ -26,33 +23,39 @@ numfig = True
27exclude_patterns = ['build-templates/*.rst']
24exclude_patterns = ['build-templates/*.rst']
29−from searx import webapp
26+import searx.search
29+searx.search.initialize()
30jinja_contexts = {
30jinja_contexts = {
31− 'webapp': dict(**webapp.__dict__)
31+ 'searx': {
32+ 'engines': searx.engines.engines,
33+ 'plugins': searx.plugins.plugins
34# usage:: lorem :patch:`f373169` ipsum
37# usage:: lorem :patch:`f373169` ipsum
35extlinks = {}
38extlinks = {}
37# upstream links
40# upstream links
38−extlinks['wiki'] = ('https://github.com/asciimoo/searx/wiki/%s', ' ')
41+extlinks['wiki'] = ('https://github.com/searx/searx/wiki/%s', ' ')
39−extlinks['pull'] = ('https://github.com/asciimoo/searx/pull/%s', 'PR ')
42+extlinks['pull'] = ('https://github.com/searx/searx/pull/%s', 'PR ')
41# links to custom brand
44# links to custom brand
42−extlinks['origin'] = (GIT_URL + '/blob/' + GIT_BRANCH + '/%s', 'git://')
45+extlinks['origin'] = (brand.GIT_URL + '/blob/' + brand.GIT_BRANCH + '/%s', 'git://')
43−extlinks['patch'] = (GIT_URL + '/commit/%s', '#')
46+extlinks['patch'] = (brand.GIT_URL + '/commit/%s', '#')
44−extlinks['search'] = (SEARX_URL + '/%s', '#')
47+extlinks['search'] = (brand.SEARX_URL + '/%s', '#')
45−extlinks['docs'] = (DOCS_URL + '/%s', 'docs: ')
48+extlinks['docs'] = (brand.DOCS_URL + '/%s', 'docs: ')
46extlinks['pypi'] = ('https://pypi.org/project/%s', 'PyPi: ')
49extlinks['pypi'] = ('https://pypi.org/project/%s', 'PyPi: ')
47extlinks['man'] = ('https://manpages.debian.org/jump?q=%s', '')
50extlinks['man'] = ('https://manpages.debian.org/jump?q=%s', '')
48#extlinks['role'] = (
51#extlinks['role'] = (
49# 'https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-%s', '')
52# 'https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-%s', '')
50extlinks['duref'] = (
53extlinks['duref'] = (
51− 'http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#%s', '')
54+ 'https://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#%s', '')
52extlinks['durole'] = (
55extlinks['durole'] = (
53− 'http://docutils.sourceforge.net/docs/ref/rst/roles.html#%s', '')
56+ 'https://docutils.sourceforge.net/docs/ref/rst/roles.html#%s', '')
54extlinks['dudir'] = (
57extlinks['dudir'] = (
55− 'http://docutils.sourceforge.net/docs/ref/rst/directives.html#%s', '')
58+ 'https://docutils.sourceforge.net/docs/ref/rst/directives.html#%s', '')
56extlinks['ctan'] = (
59extlinks['ctan'] = (
57 'https://ctan.org/pkg/%s', 'CTAN: ')
60 'https://ctan.org/pkg/%s', 'CTAN: ')
@@ -81,11 +84,12 @@ intersphinx_mapping = {
81 "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
84 "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
84−issues_github_path = "asciimoo/searx"
87+issues_github_path = "searx/searx"
86# HTML -----------------------------------------------------------------
89# HTML -----------------------------------------------------------------
88sys.path.append(os.path.abspath('_themes'))
91sys.path.append(os.path.abspath('_themes'))
92+sys.path.insert(0, os.path.abspath("../utils/"))
89html_theme_path = ['_themes']
93html_theme_path = ['_themes']
90html_theme = "searx"
94html_theme = "searx"
@@ -96,14 +100,21 @@ imgmath_font_size = 14
96# sphinx.ext.imgmath setup END
100# sphinx.ext.imgmath setup END
98html_theme_options = {"index_sidebar_logo": True}
102html_theme_options = {"index_sidebar_logo": True}
100− "project_links": [
103+html_context = {"project_links": [] }
104+html_context["project_links"].append(ProjectLink("Blog", "blog/index.html"))
101− ProjectLink("Source", GIT_URL),
106+ html_context["project_links"].append(ProjectLink("Source", brand.GIT_URL))
102− ProjectLink("Wiki", "https://github.com/asciimoo/searx/wiki"),
107+if brand.WIKI_URL:
108+ html_context["project_links"].append(ProjectLink("Wiki", brand.WIKI_URL))
109+if brand.PUBLIC_INSTANCES:
103− ProjectLink("Public instances", "https://searx.space/"),
110+ html_context["project_links"].append(ProjectLink("Public instances", brand.PUBLIC_INSTANCES))
104− ProjectLink("Twitter", "https://twitter.com/Searx_engine"),
111+if brand.TWITTER_URL:
105− ]
112+ html_context["project_links"].append(ProjectLink("Twitter", brand.TWITTER_URL))
106−}
113+if brand.ISSUE_URL:
114+ html_context["project_links"].append(ProjectLink("Issue Tracker", brand.ISSUE_URL))
115+if brand.CONTACT_URL:
116+ html_context["project_links"].append(ProjectLink("Contact", brand.CONTACT_URL))
107html_sidebars = {
118html_sidebars = {
108 "**": ["project.html", "relations.html", "searchbox.html"],
119 "**": ["project.html", "relations.html", "searchbox.html"],
@@ -118,9 +129,3 @@ html_show_sourcelink = False
118latex_documents = [
129latex_documents = [
119 (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
130 (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
122−# ------------------------------------------------------------------------------
123−# Since loadConfig overwrites settings from the global namespace, it has to be
124−# the last statement in the conf.py file
125−# ------------------------------------------------------------------------------
126−load_sphinx_config(globals())
docs/dev/contribution_guide.rst+29−25
@@ -87,7 +87,7 @@ In order to submit a patch, please follow the steps below:
88- Add yourself to the :origin:`AUTHORS.rst` file.
88- Add yourself to the :origin:`AUTHORS.rst` file.
90−- Choose meaning full commit messages, read `Conventional Commits`_
90+- Choose meaningful commit messages, read `Conventional Commits`_
@@ -117,8 +117,8 @@ Translation currently takes place on :ref:`transifex <translation>`.
117Documentation
117Documentation
118=============
118=============
120−.. _Sphinx: http://www.sphinx-doc.org
120+.. _Sphinx: https://www.sphinx-doc.org
121−.. _reST: http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
121+.. _reST: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
123.. sidebar:: The reST sources
123.. sidebar:: The reST sources
@@ -132,54 +132,58 @@ Here is an example which makes a complete rebuild:
133.. code:: sh
133.. code:: sh
135− $ make docs-clean docs
135+ $ make docs.clean docs.html
137 The HTML pages are in dist/docs.
137 The HTML pages are in dist/docs.
139−.. _make docs-live:
139+.. _make docs.live:
141live build
141live build
142----------
142----------
144+.. _sphinx-autobuild:
145+ https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
144−.. sidebar:: docs-clean
147+.. sidebar:: docs.clean
146 It is recommended to assert a complete rebuild before deploying (use
149 It is recommended to assert a complete rebuild before deploying (use
147− ``docs-clean``).
150+ ``docs.clean``).
149Live 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
150−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
151URL 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
154.. code:: sh
157.. code:: sh
156− $ make docs-live
159+ $ make docs.live
158 The HTML pages are in dist/docs.
161 The HTML pages are in dist/docs.
159− ... Serving on http://0.0.0.0:8080
162+ ... Serving on http://0.0.0.0:8000
160 ... Start watching changes
163 ... Start watching changes
165+Live builds are implemented by sphinx-autobuild_. Use environment
166+``$(SPHINXOPTS)`` to pass arguments to the sphinx-autobuild_ command. Except
167+option ``--host`` (which is always set to ``0.0.0.0``) you can pass any
168+argument. E.g to find and use a free port, use:
172+ $ SPHINXOPTS="--port 0" make docs.live
174+ ... Serving on http://0.0.0.0:50593
163.. _deploy on github.io:
178.. _deploy on github.io:
165deploy on github.io
180deploy on github.io
166-------------------
181-------------------
168−To deploy documentation at :docs:`github.io <.>` use Makefile target
183+To deploy documentation at :docs:`github.io <.>` use Makefile target :ref:`make
169−:ref:`make gh-pages`, which will builds the documentation, clones searx into a sub
184+docs.gh-pages`, which builds the documentation and runs all the needed git add,
170−folder ``gh-pages``, cleans it, copies the doc build into and runs all the
171−needed git add, commit and push:
185+commit and push:
173.. code:: sh
187.. code:: sh
175− $ make docs-clean gh-pages
189+ $ make docs.clean docs.gh-pages
177− SPHINX docs --> file://<...>/dist/docs
178− The HTML pages are in dist/docs.
180− Cloning into 'gh-pages' ...
182− cd gh-pages; git checkout gh-pages >/dev/null
183− Switched to a new branch 'gh-pages'
185− doc available at --> https://asciimoo.github.io/searx
docs/dev/engine_overview.rst+69−31
@@ -18,6 +18,9 @@ engines. Adapters are stored under the folder :origin:`searx/engines`.
19 :backlinks: entry
19 :backlinks: entry
22+.. _general engine configuration:
21general engine configuration
24general engine configuration
22============================
25============================
@@ -34,31 +37,36 @@ settings. However, the standard way is the following:
34engine file
37engine file
35-----------
38-----------
37−======================= =========== ===========================================
40+======================= =========== ========================================================
38argument type information
41argument type information
39−======================= =========== ===========================================
42+======================= =========== ========================================================
40categories list pages, in which the engine is working
43categories list pages, in which the engine is working
41paging boolean support multible pages
44paging boolean support multible pages
42−language_support boolean support language choosing
43time_range_support boolean support search time range
45time_range_support boolean support search time range
44−offline boolean engine runs offline
46+engine_type str ``online`` by default, other possibles values are
47+ ``offline``, ``online_dictionnary``, ``online_currency``
45−======================= =========== ===========================================
48+======================= =========== ========================================================
47.. _engine settings:
50.. _engine settings:
49settings.yml
52settings.yml
50------------
53------------
52−======================= =========== ===========================================
55+======================= =========== =============================================
53argument type information
56argument type information
54−======================= =========== ===========================================
57+======================= =========== =============================================
55name string name of search-engine
58name string name of search-engine
56engine string name of searx-engine
59engine string name of searx-engine
57 (filename without ``.py``)
60 (filename without ``.py``)
61+enable_http bool enable HTTP
62+ (by default only HTTPS is enabled).
58shortcut string shortcut of search-engine
63shortcut string shortcut of search-engine
59timeout string specific timeout for search-engine
64timeout string specific timeout for search-engine
60display_error_messages boolean display error messages on the web UI
65display_error_messages boolean display error messages on the web UI
66+proxies dict set proxies for a specific engine
67+ (e.g. ``proxies : {http: socks5://proxy:port,
68+ https: socks5://proxy:port}``)
61−======================= =========== ===========================================
69+======================= =========== =============================================
@@ -90,7 +98,6 @@ example code
90 # engine dependent config
98 # engine dependent config
91 categories = ['general']
99 categories = ['general']
92 paging = True
100 paging = True
93− language_support = True
96making a request
103making a request
@@ -105,21 +112,48 @@ passed arguments
105These arguments can be used to construct the search query. Furthermore,
112These arguments can be used to construct the search query. Furthermore,
106parameters with default value can be redefined for special purposes.
113parameters with default value can be redefined for special purposes.
115+If the ``engine_type`` is ``online```:
117+====================== ============== ========================================================================
118+argument type default-value, information
119+====================== ============== ========================================================================
126+headers.User-Agent str a random User-Agent
127+category str current category, like ``'general'``
128+safesearch int ``0``, between ``0`` and ``2`` (normal, moderate, strict)
129+time_range Optional[str] ``None``, can be ``day``, ``week``, ``month``, ``year``
130+pageno int current pagenumber
131+language str specific language code like ``'en_US'``, or ``'all'`` if unspecified
132+====================== ============== ========================================================================
135+If the ``engine_type`` is ``online_dictionnary```, in addition to the ``online`` arguments:
108====================== ============ ========================================================================
137====================== ============ ========================================================================
109argument type default-value, information
138argument type default-value, information
110====================== ============ ========================================================================
139====================== ============ ========================================================================
111−url string ``''``
140+from_lang str specific language code like ``'en_US'``
112−method string ``'GET'``
141+to_lang str specific language code like ``'en_US'``
113−headers set ``{}``
142+query str the text query without the languages
114−data set ``{}``
143+====================== ============ ========================================================================
115−cookies set ``{}``
144+
116−verify boolean ``True``
145+If the ``engine_type`` is ``online_currency```, in addition to the ``online`` arguments:
117−headers.User-Agent string a random User-Agent
146+
118−category string current category, like ``'general'``
119−started datetime current date-time
120−pageno int current pagenumber
121−language string specific language code like ``'en_US'``, or ``'all'`` if unspecified
122====================== ============ ========================================================================
147====================== ============ ========================================================================
148+argument type default-value, information
149+====================== ============ ========================================================================
150+amount float the amount to convert
151+from str ISO 4217 code
153+from_name str currency name
154+to_name str currency name
155+====================== ============ ========================================================================
124parsed arguments
158parsed arguments
125----------------
159----------------
@@ -128,16 +162,20 @@ The function ``def request(query, params):`` always returns the ``params``
128variable. Inside searx, the following paramters can be used to specify a search
162variable. Inside searx, the following paramters can be used to specify a search
131−============ =========== =========================================================
165+=================== =========== ==========================================================================
132−argument type information
166+argument type information
133−============ =========== =========================================================
167+=================== =========== ==========================================================================
134−url string requested url
168+url str requested url
135−method string HTTP request method
169+method str HTTP request method
136−headers set HTTP header information
170+headers set HTTP header information
137−data set HTTP data information (parsed if ``method != 'GET'``)
171+data set HTTP data information
138−cookies set HTTP cookies
172+cookies set HTTP cookies
139−verify boolean Performing SSL-Validity check
173+verify bool Performing SSL-Validity check
140−============ =========== =========================================================
174+follow_redirects bool Follow redirects
175+max_redirects int maximum redirects, hard limit
176+soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
177+raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
178+=================== =========== ==========================================================================
143example code
181example code
@@ -256,7 +294,7 @@ latitude latitude of result (in decimal format)
256longitude longitude of result (in decimal format)
294longitude longitude of result (in decimal format)
257boundingbox boundingbox of result (array of 4. values
295boundingbox boundingbox of result (array of 4. values
258 ``[lat-min, lat-max, lon-min, lon-max]``)
296 ``[lat-min, lat-max, lon-min, lon-max]``)
259−geojson geojson of result (http://geojson.org)
297+geojson geojson of result (https://geojson.org/)
260osm.type type of osm-object (if OSM-Result)
298osm.type type of osm-object (if OSM-Result)
261osm.id id of osm-object (if OSM-Result)
299osm.id id of osm-object (if OSM-Result)
262address.name name of object
300address.name name of object
docs/dev/makefile.rst+124−123
@@ -1,65 +1,33 @@
1.. _makefile:
1.. _makefile:
3−================
3+========
4−Makefile Targets
4+Makefile
5−================
5+========
7.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
7.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
9.. sidebar:: build environment
9.. sidebar:: build environment
11− Before looking deeper at the targets, first read about :ref:`makefile setup`
11+ Before looking deeper at the targets, first read about :ref:`make
12− and :ref:`make pyenv`.
12+ install`.
14 To install system requirements follow :ref:`buildhosts`.
14 To install system requirements follow :ref:`buildhosts`.
16−With the aim to simplify development cycles, started with :pull:`1756` a
16+All relevant build tasks are implemented in :origin:`manage.sh` and for CI or
17−``Makefile`` based boilerplate was added. If you are not familiar with
17+IDE integration a small ``Makefile`` wrapper is available. If you are not
18−Makefiles, we recommend to read gnu-make_ introduction.
18+familiar with Makefiles, we recommend to read gnu-make_ introduction.
20The usage is simple, just type ``make {target-name}`` to *build* a target.
20The usage is simple, just type ``make {target-name}`` to *build* a target.
21Calling the ``help`` target gives a first overview (``make help``):
21Calling the ``help`` target gives a first overview (``make help``):
23.. program-output:: bash -c "cd ..; make --no-print-directory help"
23.. program-output:: bash -c "cd ..; make --no-print-directory help"
26.. contents:: Contents
25.. contents:: Contents
29 :backlinks: entry
28 :backlinks: entry
37−.. _git stash: https://git-scm.com/docs/git-stash
39−.. sidebar:: fork & upstream
41− Commit changes in your (local) branch, fork or whatever, but do not push them
42− upstream / `git stash`_ is your friend.
44−The main setup is done in the :origin:`Makefile`.
46−.. literalinclude:: ../../Makefile
47− :start-after: START Makefile setup
48− :end-before: END Makefile setup
50−:GIT_URL: Changes this, to point to your searx fork.
51−:GIT_BRANCH: Changes this, to point to your searx branch.
52−:SEARX_URL: Changes this, to point to your searx instance.
53−:DOCS_URL: If you host your own (*brand*) documentation, change this URL.
55−If you change any of this build environment variables, you have to run ``make
60− build utils/brand.env
62−.. _make pyenv:
30+.. _make install:
64Python environment
32Python environment
65==================
33==================
@@ -68,31 +36,42 @@ Python environment
69 ``source ./local/py3/bin/activate``
37 ``source ./local/py3/bin/activate``
71−With Makefile we do no longer need to build up the virualenv manually (as
39+We do no longer need to build up the virtualenv manually. Jump into your git
72−described in the :ref:`devquickstart` guide). Jump into your git working tree
73−and release a ``make pyenv``:
40+working tree and release a ``make install`` to get a virtualenv with a
74−
41+*developer install* of searx (:origin:`setup.py`). ::
77 $ cd ~/searx-clone
43 $ cd ~/searx-clone
78− $ make pyenv
44+ $ make install
79− PYENV usage: source ./local/py3/bin/activate
45+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
48+ PYENV [install] pip install -e 'searx[test]'
50+ Successfully installed argparse-1.4.0 searx
51+ BUILDENV INFO:searx:load the default settings from ./searx/settings.yml
52+ BUILDENV INFO:searx:Initialisation done
53+ BUILDENV build utils/brand.env
82−With target ``pyenv`` a development environment (aka virtualenv) was build up in
55+If you release ``make install`` multiple times the installation will only
83−``./local/py3/``. To make a *developer install* of searx (:origin:`setup.py`)
56+rebuild if the sha256 sum of the *requirement files* fails. With other words:
84−into this environment, use make target ``install``:
57+the check fails if you edit the requirements listed in
85−
58+:origin:`requirements-dev.txt` and :origin:`requirements.txt`). ::
88 $ make install
60 $ make install
89− PYENV usage: source ./local/py3/bin/activate
61+ PYENV OK
90− PYENV using virtualenv from ./local/py3
62+ PYENV [virtualenv] requirements.sha256 failed
91− PYENV install .
63+ [virtualenv] - 6cea6eb6def9e14a18bf32f8a3e... ./requirements-dev.txt
92−
64+ [virtualenv] - 471efef6c73558e391c3adb35f4... ./requirements.txt
93−You have never to think about intermediate targets like ``pyenv`` or
65+ ...
94−``install``, the ``Makefile`` chains them as requisites. Just run your main
66+ PYENV [virtualenv] installing ./requirements*.txt into local/py3
69+ PYENV [install] pip install -e 'searx[test]'
71+ Successfully installed argparse-1.4.0 searx
72+ BUILDENV INFO:searx:load the default settings from ./searx/settings.yml
73+ BUILDENV INFO:searx:Initialisation done
74+ BUILDENV build utils/brand.env
97.. sidebar:: drop environment
76.. sidebar:: drop environment
@@ -100,10 +79,7 @@ target.
100 <make clean>` first.
79 <make clean>` first.
102If you think, something goes wrong with your ./local environment or you change
81If you think, something goes wrong with your ./local environment or you change
103−the :origin:`setup.py` file (or the requirements listed in
82+the :origin:`setup.py` file, you have to call :ref:`make clean`.
104−:origin:`requirements-dev.txt` and :origin:`requirements.txt`), you have to call
108.. _make run:
84.. _make run:
@@ -113,88 +89,113 @@ the :origin:`setup.py` file (or the requirements listed in
113To get up a running a developer instance simply call ``make run``. This enables
89To get up a running a developer instance simply call ``make run``. This enables
114*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
90*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
115instance, disables *debug* option again and opens the URL in your favorite WEB
91instance, disables *debug* option again and opens the URL in your favorite WEB
116−browser (:man:`xdg-open`):
92+browser (:man:`xdg-open`)::
120− $ make run
94+ $ make run
121− PYENV usage: source ./local/py3/bin/activate
95+ PYENV OK
123− ./local/py3/bin/python ./searx/webapp.py
96+ SEARX_DEBUG=1 ./manage.sh pyenv.cmd python ./searx/webapp.py
125− INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
98+ INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
128.. _make clean:
100.. _make clean:
130``make clean``
102``make clean``
131==============
103==============
133−Drop all intermediate files, all builds, but keep sources untouched. Includes
105+Drop all intermediate files, all builds, but keep sources untouched. Before
134−target ``pyclean`` which drops ./local environment. Before calling ``make
135−clean`` stop all processes using :ref:`make pyenv`.
106+calling ``make clean`` stop all processes using :ref:`make install`. ::
139 $ make clean
108 $ make clean
140− CLEAN pyclean
109+ CLEAN pyenv
141− CLEAN clean
110+ PYENV [virtualenv] drop ./local/py3
111+ CLEAN docs -- ./build/docs ./dist/docs
112+ CLEAN locally installed npm dependencies
143.. _make docs:
116.. _make docs:
145−``make docs docs-live docs-clean``
118+``make docs docs.autobuild docs.clean``
146−==================================
119+=======================================
148−We describe the usage of the ``doc*`` targets in the :ref:`How to contribute /
121+We describe the usage of the ``doc.*`` targets in the :ref:`How to contribute /
149Documentation <contrib docs>` section. If you want to edit the documentation
122Documentation <contrib docs>` section. If you want to edit the documentation
150−read our :ref:`make docs-live` section. If you are working in your own brand,
123+read our :ref:`make docs.live` section. If you are working in your own brand,
151−adjust your :ref:`Makefile setup <makefile setup>`.
124+adjust your :ref:`settings global`.
154−.. _make gh-pages:
126+.. _make docs.gh-pages:
156−``make gh-pages``
128+``make docs.gh-pages``
157−=================
129+======================
159−To deploy on github.io first adjust your :ref:`Makefile setup <makefile
131+To deploy on github.io first adjust your :ref:`settings global`. For any
160−setup>`. For any further read :ref:`deploy on github.io`.
132+further read :ref:`deploy on github.io`.
162.. _make test:
134.. _make test:
164``make test``
136``make test``
165=============
137=============
167−Runs a series of tests: ``test.pep8``, ``test.unit``, ``test.robot`` and does
139+Runs a series of tests: :ref:`make test.pylint`, ``test.pep8``, ``test.unit``
168−additional :ref:`pylint checks <make pylint>`. You can run tests selective,
140+and ``test.robot``. You can run tests selective, e.g.::
173 $ make test.pep8 test.unit test.sh
142 $ make test.pep8 test.unit test.sh
174− . ./local/py3/bin/activate; ./manage.sh pep8_check
143+ TEST test.pep8 OK
175− [!] Running pep8 check
144+ ...
176− . ./local/py3/bin/activate; ./manage.sh unit_tests
145+ TEST test.unit OK
177− [!] Running unit tests
146+ ...
154+:ref:`sh lint` / if you have changed some bash scripting run this test before
179−.. _make pylint:
157+.. _make test.pylint:
181−``make pylint``
159+``make test.pylint``
182−===============
160+====================
184.. _Pylint: https://www.pylint.org/
162.. _Pylint: https://www.pylint.org/
186−Before commiting its recommend to do some (more) linting. Pylint_ is known as
187−one of the best source-code, bug and quality checker for the Python programming
164+Pylint_ is known as one of the best source-code, bug and quality checker for the
188−language. Pylint_ is not yet a quality gate within our searx project (like
189−:ref:`test.pep8 <make test>` it is), but Pylint_ can help to improve code
190−quality anyway. The pylint profile we use at searx project is found in
165+Python programming language. The pylint profile we use at searx project is
191−project's root folder :origin:`.pylintrc`.
166+found in project's root folder :origin:`.pylintrc`.
193−Code quality is a ongoing process. Don't try to fix all messages from Pylint,
168+.. _make search.checker:
194−run Pylint and check if your changed lines are bringing up new messages. If so,
169+
195−fix it. By this, code quality gets incremental better and if there comes the
170+``search.checker.{engine name}``
196−day, the linting is balanced out, we might decide to add Pylint as a quality
171+================================
173+To check all engines::
177+To check a engine with whitespace in the name like *google news* replace space
180+ make search.checker.google_news
182+To see HTTP requests and more use SEARX_DEBUG::
184+ make SEARX_DEBUG=1 search.checker.google_news
186+.. _3xx: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection
188+To filter out HTTP redirects (3xx_)::
190+ make SEARX_DEBUG=1 search.checker.google_news | grep -A1 "HTTP/1.1\" 3[0-9][0-9]"
192+ Engine google news Checking
193+ https://news.google.com:443 "GET /search?q=life&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0
194+ https://news.google.com:443 "GET /search?q=life&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None
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
200``make pybuild``
201``make pybuild``
@@ -203,9 +204,7 @@ gate.
203.. _PyPi: https://pypi.org/
204.. _PyPi: https://pypi.org/
204.. _twine: https://twine.readthedocs.io/en/latest/
205.. _twine: https://twine.readthedocs.io/en/latest/
206−Build Python packages in ``./dist/py``.
207+Build Python packages in ``./dist/py``::
210 $ make pybuild
209 $ make pybuild
@@ -213,9 +212,11 @@ Build Python packages in ``./dist/py``.
213 running sdist
212 running sdist
214 running egg_info
213 running egg_info
216− $ ls ./dist/py/
217+ $ ls ./dist
217− searx-0.15.0-py3-none-any.whl searx-0.15.0.tar.gz
218+ searx-0.18.0-py3-none-any.whl searx-0.18.0.tar.gz
219−To upload packages to PyPi_, there is also a ``upload-pypi`` target. It needs
220+To upload packages to PyPi_, there is also a ``pypi.upload`` target (to test use
220−twine_ to be installed. Since you are not the owner of :pypi:`searx` you will
221+``pypi.upload.test``). Since you are not the owner of :pypi:`searx` you will
221−never need the latter.
222+never need to upload.
@@ -30,6 +30,21 @@ Example plugin
30 ctx['search'].suggestions.add('example')
30 ctx['search'].suggestions.add('example')
31 return True
31 return True
36+External plugins are standard python modules implementing all the requirements of the standard plugins.
37+Plugins can be enabled by adding them to :ref:`settings.yml`'s ``plugins`` section.
38+Example external plugin can be found `here <https://github.com/asciimoo/searx_external_plugin_example>`_.
43+To enable your plugin register your plugin in
44+searx > plugin > __init__.py.
45+And at the bottom of the file add your plugin like.
46+``plugins.register(name_of_python_file)``
33Plugin entry points
48Plugin entry points
34===================
49===================
docs/dev/quickstart.rst+26−103
@@ -4,129 +4,52 @@
4Development Quickstart
4Development Quickstart
5======================
5======================
7−.. sidebar:: :ref:`makefile`
7+.. _npm: https://www.npmjs.com/
9− For additional developer purpose there are :ref:`makefile`.
9+Searx loves developers, just clone and start hacking. All the rest is done for
10−
10+you simply by using :ref:`make <makefile>`.
11−This quickstart guide gets your environment set up with searx. Furthermore, it
12−gives a short introduction to the ``manage.sh`` script.
14−How to setup your development environment
15−=========================================
17−.. sidebar:: :ref:`make pyenv <make pyenv>`
19− Alternatively use the :ref:`make pyenv`.
21−First, clone the source code of searx to the desired folder. In this case the
22−source is cloned to ``~/myprojects/searx``. Then create and activate the
23−searx-ve virtualenv and install the required packages using ``manage.sh``.
28− git clone https://github.com/asciimoo/searx.git
30− python3 -m venv searx-ve
31− . ./searx-ve/bin/activate
32− ./manage.sh update_dev_packages
38−.. sidebar:: :ref:`make test.unit <make test>`
40− Alternatively use the ``test.pep8``, ``test.unit``, ``test.robot`` targets.
42−Tests can be run using the ``manage.sh`` script. Following tests and checks are
48−- Unit test coverage check
50−For example unit tests are run with the command below:
54− ./manage.sh unit_tests
56−For further test options, please consult the help of the ``manage.sh`` script or
57−read :ref:`make test`.
60−How to compile styles and javascript
61−====================================
63−.. _less: http://lesscss.org/
64−.. _NodeJS: https://nodejs.org
69−Less_ is required to build the styles of searx. Less_ can be installed using
70−either NodeJS_ or Apt.
72.. code:: sh
12.. code:: sh
74− sudo -H apt-get install nodejs
14+ git clone https://github.com/searx/searx.git
75− sudo -H npm install -g less
77−OR
16+Here is how a minimal workflow looks like:
79−.. code:: sh
18+1. *start* hacking
19+2. *run* your code: :ref:`make run`
20+3. *test* your code: :ref:`make test`
81− sudo -H apt-get install node-less
22+If you think at some point something fails, go back to *start*. Otherwise,
23+choose a meaningful commit message and we are happy to receive your pull
24+request. To not end in *wild west* we have some directives, please pay attention
25+to our ":ref:`how to contribute`" guideline.
83−After satisfying the requirements styles can be build using ``manage.sh``
27+If you implement themes, you will need to compile styles and JavaScript before
85.. code:: sh
30.. code:: sh
87− ./manage.sh styles
32+ make themes
90−How to build the source of the themes
91−=====================================
93−.. _grunt: https://gruntjs.com/
95−Grunt_ must be installed in order to build the javascript sources. It depends on
96−NodeJS, so first Node has to be installed.
100− sudo -H apt-get install nodejs
34+Don't forget to install npm_ first.
103−After installing grunt, the files can be built using the following command:
36+.. tabs::
105−.. code:: sh
38+ .. group-tab:: Ubuntu / debian
107− make themes
40+ .. code:: sh
42+ sudo -H apt-get install npm
110−Tips for debugging/development
44+ .. group-tab:: Arch Linux
111−==============================
113−.. sidebar:: :ref:`make run`
46+ .. code-block:: sh
115− Makefile target ``run`` already enables debug option for your developer
48+ sudo -H pacman -S npm
116− session / see :ref:`make run`.
118−Turn on debug logging
50+ .. group-tab:: Fedora / RHEL
119− Whether you are working on a new engine or trying to eliminate a bug, it is
120− always a good idea to turn on debug logging. When debug logging is enabled a
121− stack trace appears, instead of the cryptic ``Internal Server Error``
122− message. It can be turned on by setting ``debug: False`` to ``debug: True`` in
123− :origin:`settings.yml <searx/settings.yml>`.
125−.. sidebar:: :ref:`make test`
52+ .. code-block:: sh
127− Alternatively use the :ref:`make test` targets.
54+ sudo -H dnf install npm
129−Run ``./manage.sh tests`` before creating a PR.
130− Failing build on Travis is common because of PEP8 checks. So a new commit
131− must be created containing these format fixes. This phase can be skipped if
132− ``./manage.sh tests`` is run locally before creating a PR.
@@ -15,8 +15,8 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read
15:ref:`docs build`.
15:ref:`docs build`.
17The source files of Searx's documentation are located at :origin:`docs`. Sphinx
17The source files of Searx's documentation are located at :origin:`docs`. Sphinx
18−assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs-live
18+assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs.live
19−<make docs-live>` to build HTML while editing.
19+<make docs.live>` to build HTML while editing.
21.. sidebar:: Further reading
21.. sidebar:: Further reading
@@ -319,6 +319,9 @@ To list all anchors of the inventory (e.g. ``python``) use:
319.. code:: sh
319.. code:: sh
321 $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
321 $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
323+ $ python -m sphinx.ext.intersphinx https://searx.github.io/searx/objects.inv
323Literal blocks
326Literal blocks
324==============
327==============
@@ -1273,28 +1276,33 @@ Templating
1274.. sidebar:: Build environment
1277.. sidebar:: Build environment
1276− All *generic-doc* tasks are running in the :ref:`build environment <make
1279+ All *generic-doc* tasks are running in the :ref:`make install`.
1279Templating is suitable for documentation which is created generic at the build
1281Templating is suitable for documentation which is created generic at the build
1280−time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
1282+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
1281−environment <make pyenv>` (with searx modules installed). We use this e.g. to
1283+install` (with searx modules installed). We use this e.g. to build chapter:
1282−build chapter: :ref:`engines generic`. Below the jinja directive from the
1284+:ref:`engines generic`. Below the jinja directive from the
1283:origin:`docs/admin/engines.rst` is shown:
1285:origin:`docs/admin/engines.rst` is shown:
1285.. literalinclude:: ../admin/engines.rst
1287.. literalinclude:: ../admin/engines.rst
1286 :language: reST
1288 :language: reST
1287 :start-after: .. _configured engines:
1289 :start-after: .. _configured engines:
1289−The context for the template is selected in the line ``.. jinja:: webapp``. In
1291+The context for the template is selected in the line ``.. jinja:: searx``. In
1290−sphinx's build configuration (:origin:`docs/conf.py`) the ``webapp`` context
1292+sphinx's build configuration (:origin:`docs/conf.py`) the ``searx`` context
1291−points to the name space of the python module: ``webapp``.
1293+contains the ``engines`` and ``plugins``.
1293.. code:: py
1295.. code:: py
1295− from searx import webapp
1297+ import searx.search
1298+ import searx.engines
1299+ import searx.plugins
1300+ searx.search.initialize()
1296 jinja_contexts = {
1301 jinja_contexts = {
1297− 'webapp': dict(**webapp.__dict__)
1302+ 'searx': {
1303+ 'engines': searx.engines.engines,
1304+ 'plugins': searx.plugins.plugins
@@ -1391,27 +1399,27 @@ The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
1392.. _readability: https://docs.python-guide.org/writing/style/
1400.. _readability: https://docs.python-guide.org/writing/style/
1393.. _Sphinx-Primer:
1401.. _Sphinx-Primer:
1394− http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
1402+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
1395.. _reST: https://docutils.sourceforge.io/rst.html
1403.. _reST: https://docutils.sourceforge.io/rst.html
1396.. _Sphinx Roles:
1404.. _Sphinx Roles:
1397 https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
1405 https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
1398−.. _Sphinx: http://www.sphinx-doc.org
1406+.. _Sphinx: https://www.sphinx-doc.org
1399−.. _`sphinx-doc FAQ`: http://www.sphinx-doc.org/en/stable/faq.html
1407+.. _`sphinx-doc FAQ`: https://www.sphinx-doc.org/en/stable/faq.html
1400.. _Sphinx markup constructs:
1408.. _Sphinx markup constructs:
1401− http://www.sphinx-doc.org/en/stable/markup/index.html
1409+ https://www.sphinx-doc.org/en/stable/markup/index.html
1402.. _`sphinx cross references`:
1410.. _`sphinx cross references`:
1403− http://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
1411+ https://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
1404.. _sphinx.ext.extlinks:
1412.. _sphinx.ext.extlinks:
1405 https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
1413 https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
1406−.. _intersphinx: http://www.sphinx-doc.org/en/stable/ext/intersphinx.html
1414+.. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
1407−.. _sphinx config: http://www.sphinx-doc.org/en/stable/config.html
1415+.. _sphinx config: https://www.sphinx-doc.org/en/stable/config.html
1408−.. _Sphinx's autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
1416+.. _Sphinx's autodoc: https://www.sphinx-doc.org/en/stable/ext/autodoc.html
1409.. _Sphinx's Python domain:
1417.. _Sphinx's Python domain:
1410− http://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
1418+ https://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
1411.. _Sphinx's C domain:
1419.. _Sphinx's C domain:
1412− http://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
1420+ https://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
1413.. _doctree:
1421.. _doctree:
1414− http://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
1422+ https://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
1415.. _docutils: http://docutils.sourceforge.net/docs/index.html
1423.. _docutils: http://docutils.sourceforge.net/docs/index.html
1416.. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
1424.. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
1417.. _linuxdoc: https://return42.github.io/linuxdoc
1425.. _linuxdoc: https://return42.github.io/linuxdoc
@@ -1424,5 +1432,5 @@ The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
1424.. _ImageMagick: https://www.imagemagick.org
1432.. _ImageMagick: https://www.imagemagick.org
1426.. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
1434.. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
1427−.. _`Online Tables Generator`: http://www.tablesgenerator.com/text_tables
1435+.. _`Online Tables Generator`: https://www.tablesgenerator.com/text_tables
1428.. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
1436.. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
docs/dev/search_api.rst+2−2
@@ -6,7 +6,7 @@ Search API
7The search supports both ``GET`` and ``POST``.
7The search supports both ``GET`` and ``POST``.
9−Furthermore, two enpoints ``/`` and ``/search`` are available for querying.
9+Furthermore, two endpoints ``/`` and ``/search`` are available for querying.
@@ -76,7 +76,7 @@ Parameters
76 supports safe search in the preferences page of an instance.
76 supports safe search in the preferences page of an instance.
78``theme`` : default ``oscar``
78``theme`` : default ``oscar``
79− [ ``oscar``, ``simple``, ``legacy``, ``pix-art``, ``courgette`` ]
79+ [ ``oscar``, ``simple`` ]
81 Theme of instance.
81 Theme of instance.
@@ -30,6 +30,7 @@ anyone, you can set up your own, see :ref:`installation`.
30 user/index
30 user/index
31 admin/index
31 admin/index
33 utils/index
34 utils/index
34 blog/index
35 blog/index
docs/searx_extra/index.rstnew file+14
@@ -0,0 +1,14 @@
3+======================================================
4+Tooling box ``searx_extra`` for developers and users
5+======================================================
7+In the folder :origin:`searx_extra/` we maintain some tools useful for
docs/searx_extra/standalone_searx.py.rstnew file+9
@@ -0,0 +1,9 @@
2+.. _standalone_searx.py:
4+===================================
5+``searx_extra/standalone_searx.py``
6+===================================
8+.. automodule:: searx_extra.standalone_searx
docs/user/conf.pydeleted−19
@@ -1,19 +0,0 @@
1−# -*- coding: utf-8; mode: python -*-
2−"""Configuration for the Searx user handbook
4−project = 'Searx User-HB'
5−version = release = VERSION_STRING
7−# Grouping the document tree into LaTeX files. List of tuples
8−# (source start file, target name, title,
9−# author, documentclass [howto, manual, or own class]).
11− ('index' # startdocname
12− , 'searx-user-hb.tex' # targetname
13− , '' # take title from .rst
15− , 'howto' # documentclass
16− , False # toctree_only
docs/user/own-instance.rst+3−3
@@ -56,9 +56,9 @@ results.
56I see. What about private instances?
56I see. What about private instances?
57------------------------------------
57------------------------------------
59−If users run their own instances, everything is in their control: the source
59+If users run their :ref:`own instances <installation>`, everything is in their
60−code, logging settings and private data. Unknown instance administrators do not
60+control: the source code, logging settings and private data. Unknown instance
61−have to be trusted.
61+administrators do not have to be trusted.
63Furthermore, as the default settings of their instance is editable, there is no
63Furthermore, as the default settings of their instance is editable, there is no
64need to use cookies to tailor searx to their needs. So preferences will not be
64need to use cookies to tailor searx to their needs. So preferences will not be
docs/user/search_syntax.rst+24
@@ -40,3 +40,27 @@ Image search:
40Custom language in wikipedia:
40Custom language in wikipedia:
42- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
42- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
47+Searx does not support true multilingual search.
48+You have to use the language prefix in your search query when searching in a different language.
50+But there is a workaround:
51+By adding a new search engine with a different language, Searx will search in your default and other language.
53+Example configuration in settings.yml for a German and English speaker:
61+ - name : google english
66+When searching, the default google engine will return German results and "google english" will return English results.
@@ -1,12 +1,11 @@
1.. _searx_utils:
1.. _searx_utils:
2.. _toolboxing:
2.. _toolboxing:
4−=======================
4+===================
5−Tooling box ``utils/*``
5+Admin's tooling box
6−=======================
6+===================
8−In the folder :origin:`utils/` we maintain some tools useful for admins and
8+In the folder :origin:`utils/` we maintain some tools useful for administrators.
11.. toctree::
10.. toctree::
12 :maxdepth: 2
11 :maxdepth: 2
@@ -40,14 +39,14 @@ Scripts to maintain services often dispose of common commands and environments.
40 <lxc-searx.env>` use ::
39 <lxc-searx.env>` use ::
42 sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh apache install
41 sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh apache install
44.. _toolboxing setup:
43.. _toolboxing setup:
46Tooling box setup
45Tooling box setup
47=================
46=================
49−The main setup is done in the :origin:`.config.sh` (read also :ref:`makefile
48+The main setup is done in the :origin:`.config.sh` (read also :ref:`settings
52.. literalinclude:: ../../.config.sh
51.. literalinclude:: ../../.config.sh
53 :language: bash
52 :language: bash
docs/utils/lxc.sh.rst+3−3
@@ -119,15 +119,15 @@ of coffee).::
120To build (live) documentation inside a archlinux_ container::
120To build (live) documentation inside a archlinux_ container::
122− sudo -H ./utils/lxc.sh cmd searx-archlinux make docs-clean docs-live
122+ sudo -H ./utils/lxc.sh cmd searx-archlinux make docs.clean docs.live
124 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
124 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
126To get IP of the container and the port number *live docs* is listening::
126To get IP of the container and the port number *live docs* is listening::
128− $ sudo ./utils/lxc.sh show suite | grep docs-live
128+ $ sudo ./utils/lxc.sh show suite | grep docs.live
130− [searx-archlinux] INFO: (eth0) docs-live: http://n.n.n.12:8080/
130+ [searx-archlinux] INFO: (eth0) docs.live: http://n.n.n.12:8080/
133.. _lxc.sh help:
133.. _lxc.sh help:
@@ -0,0 +1,504 @@
2+# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
3+# SPDX-License-Identifier: AGPL-3.0-or-later
4+# shellcheck disable=SC2031
6+# shellcheck source=utils/lib.sh
7+source "$(dirname "${BASH_SOURCE[0]}")/utils/lib.sh"
8+# shellcheck source=utils/brand.env
9+source "${REPO_ROOT}/utils/brand.env"
14+PY_SETUP_EXTRAS='[test]'
15+NPM_PACKAGES="less@2.7 less-plugin-clean-css grunt-cli"
16+GECKODRIVER_VERSION="v0.30.0"
19+# These py files are linted by test.pylint(), all other files are linted by
24+ searx/engines/gigablast.py
25+ searx/engines/deviantart.py
26+ searx/engines/digg.py
27+ searx/engines/google.py
28+ searx/engines/google_news.py
29+ searx/engines/google_videos.py
30+ searx/engines/google_images.py
31+ searx/engines/mediathekviewweb.py
32+ searx/engines/meilisearch.py
33+ searx/engines/solidtorrents.py
34+ searx/engines/solr.py
35+ searx/engines/sqlite.py
36+ searx/engines/springer.py
37+ searx/engines/google_scholar.py
38+ searx/engines/yahoo_news.py
39+ searx/engines/apkmirror.py
40+ searx/engines/core.py
41+ searx_extra/update/update_external_bangs.py
44+PYLINT_SEARX_DISABLE_OPTION="\
46+W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,\
48+PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES="supported_languages,language_aliases"
49+PYLINT_OPTIONS="-m pylint -j 0 --rcfile .pylintrc"
54+ rebuild ./utils/brand.env
56+ pybabel compile ./searx/translations
58+ all : update searx/languages.py and ./data/*
59+ languages : update searx/data/engines_languages.json & searx/languages.py
60+ useragents: update searx/data/useragents.json with the most recent versions of Firefox.
62+ html : build HTML documentation
63+ live : autobuild HTML documentation while editing
64+ gh-pages : deploy on gh-pages branch
65+ prebuild : build reST include files (./${DOCS_BUILD}/includes)
66+ clean : clean documentation build
68+ build : build docker image
69+ push : build and push docker image
71+ download & install geckodriver if not already installed (required for
74+ env : download & install npm dependencies locally
75+ clean : drop npm installations
77+ build : Build python packages at ./${PYDIST}
78+ clean : delete virtualenv and intermediate py files
80+ install : developer install of searx into virtualenv
81+ uninstall : uninstall developer installation
82+ cmd ... : run command ... in virtualenv
83+ OK : test if virtualenv is OK
85+ Upload python packages to PyPi (to test use pypi.upload.test)
87+ pylint : lint PYLINT_FILES, searx/engines, searx & tests
88+ pep8 : pycodestyle (pep8) for all files except PYLINT_FILES
89+ unit : run unit tests
90+ coverage : run unit tests with coverage
91+ robot : run robot test
92+ clean : clean intermediate test stuff
94+ all : build all themes
95+ oscar : build oscar theme
96+ simple : build simple theme
101+if [ "$VERBOSE" = "1" ]; then
106+# needed by sphinx-docs
110+ SEARX_DEBUG=1 pyenv.cmd python utils/build_env.py 2>&1 \
111+ | prefix_stdout "${_Blue}BUILDENV${_creset} "
112+ return "${PIPESTATUS[0]}"
116+ build_msg BABEL compile
117+ pyenv.cmd pybabel compile -d "${REPO_ROOT}/searx/translations"
125+ build_msg DATA "update searx/data/ahmia_blacklist.txt"
126+ pyenv.cmd python searx_extra/update/update_ahmia_blacklist.py
127+ build_msg DATA "update searx/data/wikidata_units.json"
128+ pyenv.cmd python searx_extra/update/update_wikidata_units.py
129+ build_msg DATA "update searx/data/currencies.json"
130+ pyenv.cmd python searx_extra/update/update_currencies.py
136+ build_msg ENGINES "fetch languages .."
137+ pyenv.cmd python searx_extra/update/update_languages.py
138+ build_msg ENGINES "update update searx/languages.py"
139+ build_msg DATA "update searx/data/engines_languages.json"
145+ build_msg DATA "update searx/data/useragents.json"
146+ pyenv.cmd python searx_extra/update/update_firefox_version.py
151+ build_msg DOCS "build ${DOCS_BUILD}/includes"
154+ [ "$VERBOSE" = "1" ] && set -x
155+ mkdir -p "${DOCS_BUILD}/includes"
156+ ./utils/searx.sh doc | cat > "${DOCS_BUILD}/includes/searx.rst"
157+ ./utils/filtron.sh doc | cat > "${DOCS_BUILD}/includes/filtron.rst"
158+ ./utils/morty.sh doc | cat > "${DOCS_BUILD}/includes/morty.rst"
167+# shellcheck disable=SC2119
171+ build_msg DOCKER build
172+ # run installation in a subprocess and activate pyenv
174+ # See https://www.shellcheck.net/wiki/SC1001 and others ..
175+ # shellcheck disable=SC2031,SC2230,SC2002,SC2236,SC2143,SC1001
177+ # shellcheck source=/dev/null
178+ source "${PY_ENV_BIN}/activate"
180+ # Check if it is a git repository
181+ if [ ! -d .git ]; then
182+ die 1 "This is not Git repository"
184+ if [ ! -x "$(which git)" ]; then
185+ die 1 "git is not installed"
188+ if ! git remote get-url origin 2> /dev/null; then
189+ die 1 "there is no remote origin"
192+ # This is a git repository
194+ # "git describe" to get the Docker version (for example : v0.15.0-89-g0585788e)
195+ # awk to remove the "v" and the "g"
196+ SEARX_GIT_VERSION=$(git describe --match "v[0-9]*\.[0-9]*\.[0-9]*" HEAD 2>/dev/null | awk -F'-' '{OFS="-"; $1=substr($1, 2); if ($3) { $3=substr($3, 2); } print}')
198+ # add the suffix "-dirty" if the repository has uncommited change
199+ # /!\ HACK for searx/searx: ignore utils/brand.env
200+ git update-index -q --refresh
201+ if [ ! -z "$(git diff-index --name-only HEAD -- | grep -v 'utils/brand.env')" ]; then
202+ SEARX_GIT_VERSION="${SEARX_GIT_VERSION}-dirty"
205+ # Get the last git commit id, will be added to the Searx version (see Dockerfile)
206+ VERSION_GITCOMMIT=$(echo "$SEARX_GIT_VERSION" | cut -d- -f2-4)
207+ build_msg DOCKER "Last commit : $VERSION_GITCOMMIT"
209+ # Check consistency between the git tag and the searx/version.py file
210+ # /! HACK : parse Python file with bash /!
211+ # otherwise it is not possible build the docker image without all Python
212+ # dependencies ( version.py loads __init__.py )
213+ # SEARX_PYTHON_VERSION=$(python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)")
214+ SEARX_PYTHON_VERSION=$(cat searx/version.py | grep "\(VERSION_MAJOR\|VERSION_MINOR\|VERSION_BUILD\) =" | cut -d\= -f2 | sed -e 's/^[[:space:]]*//' | paste -sd "." -)
215+ if [ "$(echo "$SEARX_GIT_VERSION" | cut -d- -f1)" != "$SEARX_PYTHON_VERSION" ]; then
216+ err_msg "git tag: $SEARX_GIT_VERSION"
217+ err_msg "searx/version.py: $SEARX_PYTHON_VERSION"
218+ die 1 "Inconsistency between the last git tag and the searx/version.py file"
221+ # define the docker image name
222+ GITHUB_USER=$(echo "${GIT_URL}" | sed 's/.*github\.com\/\([^\/]*\).*/\1/')
223+ SEARX_IMAGE_NAME="${SEARX_IMAGE_NAME:-${GITHUB_USER:-searx}/searx}"
225+ # build Docker image
226+ build_msg DOCKER "Building image ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
228+ --build-arg GIT_URL="${GIT_URL}" \
229+ --build-arg SEARX_GIT_VERSION="${SEARX_GIT_VERSION}" \
230+ --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \
231+ --build-arg LABEL_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
232+ --build-arg LABEL_VCS_REF="$(git rev-parse HEAD)" \
233+ --build-arg LABEL_VCS_URL="${GIT_URL}" \
234+ --build-arg TIMESTAMP_SETTINGS="$(git log -1 --format="%cd" --date=unix -- searx/settings.yml)" \
235+ --build-arg TIMESTAMP_UWSGI="$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini)" \
236+ -t "${SEARX_IMAGE_NAME}:latest" -t "${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}" .
238+ if [ "$1" = "push" ]; then
239+ docker push "${SEARX_IMAGE_NAME}:latest"
240+ docker push "${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
246+# shellcheck disable=SC2119
250+ build_msg INSTALL "gecko.driver"
251+ # run installation in a subprocess and activate pyenv
253+ # shellcheck source=/dev/null
254+ source "${PY_ENV_BIN}/activate"
256+ # TODO : check the current geckodriver version
257+ geckodriver -V > /dev/null 2>&1 || NOTFOUND=1
259+ if [ -z "$NOTFOUND" ]; then
260+ build_msg INSTALL "geckodriver already installed"
263+ PLATFORM="$(python3 -c 'import platform; print(platform.system().lower(), platform.architecture()[0])')"
265+ "linux 32bit" | "linux2 32bit") ARCH="linux32";;
266+ "linux 64bit" | "linux2 64bit") ARCH="linux64";;
267+ "windows 32 bit") ARCH="win32";;
268+ "windows 64 bit") ARCH="win64";;
269+ "mac 64bit") ARCH="macos";;
271+ GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-$ARCH.tar.gz";
273+ build_msg GECKO "Installing ${PY_ENV_BIN}/geckodriver from $GECKODRIVER_URL"
276+ wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "${PY_ENV_BIN}" -f "$FILE" geckodriver
278+ chmod 755 -- "${PY_ENV_BIN}/geckodriver"
285+ pushd "${REPO_ROOT}" &> /dev/null
286+ # shellcheck disable=SC2230
287+ which npm &> /dev/null || die 1 'node.env - npm is not found!'
290+ # shellcheck disable=SC2030
291+ PATH="$(npm bin):$PATH"
294+ build_msg INSTALL "npm install $NPM_PACKAGES"
295+ # shellcheck disable=SC2086
296+ npm install $NPM_PACKAGES
298+ cd "${REPO_ROOT}/searx/static/themes/oscar"
299+ build_msg INSTALL "($(pwd)) npm install"
302+ build_msg INSTALL "($(pwd)) npm install"
303+ cd "${REPO_ROOT}/searx/static/themes/simple"
313+ build_msg CLEAN "locally installed npm dependencies"
316+ ./package-lock.json \
317+ ./searx/static/themes/oscar/package-lock.json \
318+ ./searx/static/themes/oscar/node_modules \
319+ ./searx/static/themes/simple/package-lock.json \
320+ ./searx/static/themes/simple/node_modules
325+ build_msg BUILD "[pylint] python package ${PYDIST}"
326+ pyenv.cmd python setup.py \
327+ sdist -d "${PYDIST}" \
328+ bdist_wheel --bdist-dir "${PYBUILD}" -d "${PYDIST}"
332+ build_msg CLEAN pyenv
335+ [ "$VERBOSE" = "1" ] && set -x
336+ rm -rf "${PYDIST}" "${PYBUILD}" "${PY_ENV}" ./.tox ./*.egg-info
337+ find . -name '*.pyc' -exec rm -f {} +
338+ find . -name '*.pyo' -exec rm -f {} +
339+ find . -name __pycache__ -exec rm -rf {} +
346+print('import yaml --> OK')
353+ py.clean > /dev/null
355+ if pyenv.install.OK > /dev/null; then
360+ build_msg PYENV "[install] pip install -e 'searx${PY_SETUP_EXTRAS}'"
361+ "${PY_ENV_BIN}/python" -m pip install -e ".${PY_SETUP_EXTRAS}"
363+ ) || die 42 "error while build & install pyenv (${PY_ENV_BIN})"
367+ build_msg PYENV "[pyenv.uninstall] uninstall packages: ${PYOBJECTS}"
368+ pyenv.cmd python setup.py develop --uninstall 2>&1 \
369+ | prefix_stdout "${_Blue}PYENV ${_creset}[pyenv.uninstall] "
376+ # https://github.com/pypa/twine
377+ pyenv.cmd twine upload "${PYDIST}"/*
383+ pyenv.cmd twine upload -r testpypi "${PYDIST}"/*
387+ # shellcheck disable=SC2086
389+ build_msg TEST "[pylint] \$PYLINT_FILES"
390+ pyenv.cmd python ${PYLINT_OPTIONS} ${PYLINT_VERBOSE} \
391+ "${PYLINT_FILES[@]}"
393+ build_msg TEST "[pylint] searx/engines"
394+ pyenv.cmd python ${PYLINT_OPTIONS} ${PYLINT_VERBOSE} \
395+ --disable="${PYLINT_SEARX_DISABLE_OPTION}" \
396+ --additional-builtins="${PYLINT_ADDITIONAL_BUILTINS_FOR_ENGINES}" \
399+ build_msg TEST "[pylint] searx tests"
400+ pyenv.cmd python ${PYLINT_OPTIONS} ${PYLINT_VERBOSE} \
401+ --disable="${PYLINT_SEARX_DISABLE_OPTION}" \
402+ --ignore=searx/engines \
409+ build_msg TEST 'pycodestyle (formerly pep8)'
411+ printf -v _exclude '%s, ' "${PYLINT_FILES[@]}"
412+ pyenv.cmd pycodestyle \
413+ --exclude="searx/static, searx/languages.py, $_exclude " \
414+ --max-line-length=120 \
415+ --ignore "E117,E252,E402,E722,E741,W503,W504,W605" \
421+ build_msg TEST 'tests/unit'
422+ pyenv.cmd python -m nose2 -s tests/unit
427+ build_msg TEST 'unit test coverage'
429+ pyenv.cmd python -m nose2 -C --log-capture --with-coverage --coverage searx -s tests/unit
430+ pyenv.cmd coverage report
431+ pyenv.cmd coverage html
437+ build_msg TEST 'robot'
439+ PYTHONPATH=. pyenv.cmd python searx/testing.py robot
444+ build_msg CLEAN "test stuff"
445+ rm -rf geckodriver.log .coverage coverage/
459+ local gruntfile=searx/static/themes/oscar/gruntfile.js
460+ build_msg GRUNT "${gruntfile}"
461+ PATH="$(npm bin):$PATH" grunt --gruntfile "${gruntfile}"
466+ local gruntfile=searx/static/themes/simple/gruntfile.js
467+ build_msg GRUNT "${gruntfile}"
468+ PATH="$(npm bin):$PATH" grunt --gruntfile "${gruntfile}"
472+# shellcheck disable=SC2119
476+ local cmd="$1"; shift
478+ if [ "$cmd" == "" ]; then
480+ err_msg "missing command"
485+ --getenv) var="$1"; echo "${!var}";;
489+ err_msg "unknown option $cmd"
493+ _type="$(type -t "$cmd")"
494+ if [ "$_type" != 'function' ]; then
495+ err_msg "unknown command $1 / use --help"
@@ -1,205 +0,0 @@
5−BASE_DIR="$(dirname -- "`readlink -f -- "$0"`")"
11−PYTHONPATH="$BASE_DIR"
12−SEARX_DIR="$BASE_DIR/searx"
15−. "${BASE_DIR}/utils/brand.env"
22− pip install --upgrade pip
23− pip install --upgrade setuptools
24− pip install -Ur "$BASE_DIR/requirements.txt"
27−update_dev_packages() {
29− pip install -Ur "$BASE_DIR/requirements-dev.txt"
32−install_geckodriver() {
33− echo '[!] Checking geckodriver'
34− # TODO : check the current geckodriver version
36− geckodriver -V > /dev/null 2>&1 || NOTFOUND=1
38− if [ -z "$NOTFOUND" ]; then
41− GECKODRIVER_VERSION="v0.24.0"
42− PLATFORM="`python -c "import six; import platform; six.print_(platform.system().lower(), platform.architecture()[0])"`"
44− "linux 32bit" | "linux2 32bit") ARCH="linux32";;
45− "linux 64bit" | "linux2 64bit") ARCH="linux64";;
46− "windows 32 bit") ARCH="win32";;
47− "windows 64 bit") ARCH="win64";;
48− "mac 64bit") ARCH="macos";;
50− GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-$ARCH.tar.gz";
53− if [ -z "$VIRTUAL_ENV" ]; then
54− printf "geckodriver can't be installed because VIRTUAL_ENV is not set, you should download it from\n %s" "$GECKODRIVER_URL"
57− GECKODRIVER_DIR="$VIRTUAL_ENV/bin"
61− mkdir -p -- "$GECKODRIVER_DIR"
64− printf "Installing %s/geckodriver from\n %s" "$GECKODRIVER_DIR" "$GECKODRIVER_URL"
67− wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "$GECKODRIVER_DIR" -f "$FILE" geckodriver
69− chmod 777 -- "$GECKODRIVER_DIR/geckodriver"
73− pybabel compile -d "$SEARX_DIR/translations"
82− which npm || (printf 'Error: npm is not found\n'; exit 1)
83− export PATH="$(npm bin)":$PATH
89− echo '[!] install NPM packages'
91− npm install less@2.7 less-plugin-clean-css grunt-cli
93− echo '[!] install NPM packages for oscar theme'
94− cd -- "$BASE_DIR/searx/static/themes/oscar"
97− echo '[!] install NPM packages for simple theme'
98− cd -- "$BASE_DIR/searx/static/themes/simple"
103− # Check if it is a git repository
104− if [ ! -d .git ]; then
105− echo "This is not Git repository"
109− if [ ! -x "$(which git)" ]; then
110− echo "git is not installed"
114− if [ ! git remote get-url origin 2> /dev/null ]; then
115− echo "there is no remote origin"
119− # This is a git repository
121− # "git describe" to get the Docker version (for example : v0.15.0-89-g0585788e)
122− # awk to remove the "v" and the "g"
123− SEARX_GIT_VERSION=$(git describe --match "v[0-9]*\.[0-9]*\.[0-9]*" HEAD 2>/dev/null | awk -F'-' '{OFS="-"; $1=substr($1, 2); $3=substr($3, 2); print}')
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"
132− # Get the last git commit id, will be added to the Searx version (see Dockerfile)
133− VERSION_GITCOMMIT=$(echo $SEARX_GIT_VERSION | cut -d- -f2-4)
134− echo "Last commit : $VERSION_GITCOMMIT"
136− # Check consistency between the git tag and the searx/version.py file
137− # /!\ HACK : parse Python file with bash /!\
138− # otherwise it is not possible build the docker image without all Python dependencies ( version.py loads __init__.py )
139− # SEARX_PYTHON_VERSION=$(python -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)")
140− SEARX_PYTHON_VERSION=$(cat searx/version.py | grep "\(VERSION_MAJOR\|VERSION_MINOR\|VERSION_BUILD\) =" | cut -d\= -f2 | sed -e 's/^[[:space:]]*//' | paste -sd "." -)
141− if [ $(echo "$SEARX_GIT_VERSION" | cut -d- -f1) != "$SEARX_PYTHON_VERSION" ]; then
142− echo "Inconsistency between the last git tag and the searx/version.py file"
143− echo "git tag: $SEARX_GIT_VERSION"
144− echo "searx/version.py: $SEARX_PYTHON_VERSION"
148− # define the docker image name
149− GITHUB_USER=$(echo "${GIT_URL}" | sed 's/.*github\.com\/\([^\/]*\).*/\1/')
150− SEARX_IMAGE_NAME="${GITHUB_USER:-searx}/searx"
152− # build Docker image
153− echo "Building image ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
155− --build-arg GIT_URL="${GIT_URL}" \
156− --build-arg SEARX_GIT_VERSION="${SEARX_GIT_VERSION}" \
157− --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \
158− --build-arg LABEL_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
159− --build-arg LABEL_VCS_REF=$(git rev-parse HEAD) \
160− --build-arg LABEL_VCS_URL="${GIT_URL}" \
161− --build-arg TIMESTAMP_SETTINGS=$(git log -1 --format="%cd" --date=unix -- searx/settings.yml) \
162− --build-arg TIMESTAMP_UWSGI=$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini) \
163− -t ${SEARX_IMAGE_NAME}:latest -t ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION} .
165− if [ "$1" = "push" ]; then
166− sudo docker push ${SEARX_IMAGE_NAME}:latest
167− sudo docker push ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}
176− [ -z "$1" ] || printf 'Error: %s\n' "$1"
177− echo "Searx manage.sh help
185− update_packages - Check & update production dependency changes
186− update_dev_packages - Check & update development and production dependency changes
187− install_geckodriver - Download & install geckodriver if not already installed (required for robot_tests)
188− npm_packages - Download & install npm dependencies
192− locales - Compile locales
196− ISSUE_URL: ${ISSUE_URL}
197− SEARX_URL: ${SEARX_URL}
198− DOCS_URL: ${DOCS_URL}
199− PUBLIC_INSTANCES: ${PUBLIC_INSTANCES}
203−[ "$(command -V "$ACTION" | grep ' function$')" = "" ] \
204− && help "action not found" \
requirements-dev.txt+19−18
@@ -1,19 +1,20 @@
4−mock==2.0.0
1+mock==4.0.3
5−nose2[coverage_plugin]
2+nose2[coverage_plugin]==0.10.0
6cov-core==1.15.0
3cov-core==1.15.0
7−pep8==1.7.0
4+pycodestyle==2.8.0
10−splinter==0.11.0
6+splinter==0.17.0
11−transifex-client==0.12.2
7+transifex-client==0.14.3; python_version < '3.10'
12−unittest2==1.1.0
8+transifex-client==0.12.1; python_version == '3.10'
13−zope.testrunner==4.5.1
14−selenium==3.141.0
9+selenium==4.1.0
15−linuxdoc @ git+http://github.com/return42/linuxdoc.git
10+twine==3.7.1
11+Pallets-Sphinx-Themes==2.0.2
16−sphinx-jinja
15+sphinx-jinja==1.4.0
17−sphinx-tabs
16+sphinx-tabs==3.2.0
18−sphinxcontrib-programoutput
17+sphinxcontrib-programoutput==0.17
19−twine
18+sphinx-autobuild==2021.3.14
@@ -1,12 +1,16 @@
1−certifi==2020.4.5.1
1+certifi==2021.10.8
2−babel==2.7.0
2+babel==2.9.1
3−flask-babel==1.0.0
3+flask-babel==2.0.0
4−flask==1.1.2
4+flask==2.0.2
6−jinja2==2.11.1
5+jinja2==3.0.3
7−lxml==4.5.0
6+lxml==4.7.1
8−pygments==2.1.3
7+pygments==2.8.0
10−python-dateutil==2.8.0
8+python-dateutil==2.8.2
11−pyyaml==5.3.1
9+pyyaml==6.0
12−requests[socks]==2.23.0
10+httpx[http2]==0.21.3
12+uvloop==0.16.0; python_version >= '3.7'
13+uvloop==0.14.0; python_version < '3.7'
14+httpx-socks[asyncio]==0.7.2
@@ -15,52 +15,25 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
15(C) 2013- by Adam Tauber, <asciimoo@gmail.com>
15(C) 2013- by Adam Tauber, <asciimoo@gmail.com>
19import logging
18import logging
19+import searx.settings_loader
20from os import environ
20from os import environ
21from os.path import realpath, dirname, join, abspath, isfile
21from os.path import realpath, dirname, join, abspath, isfile
22−from io import open
22+
23−from ssl import OPENSSL_VERSION_INFO, OPENSSL_VERSION
25− from yaml import safe_load
27− from sys import exit, stderr
28− stderr.write('[E] install pyyaml\n')
31searx_dir = abspath(dirname(__file__))
24searx_dir = abspath(dirname(__file__))
32engine_dir = dirname(realpath(__file__))
25engine_dir = dirname(realpath(__file__))
26+static_path = abspath(join(dirname(__file__), 'static'))
27+settings, settings_load_message = searx.settings_loader.load_settings()
34−
29+if settings['ui']['static_path']:
35−def check_settings_yml(file_name):
30+ static_path = settings['ui']['static_path']
36− if isfile(file_name):
42−# find location of settings.yml
43−if 'SEARX_SETTINGS_PATH' in environ:
44− # if possible set path to settings using the
45− # enviroment variable SEARX_SETTINGS_PATH
46− settings_path = check_settings_yml(environ['SEARX_SETTINGS_PATH'])
48− # if not, get it from searx code base or last solution from /etc/searx
49− settings_path = check_settings_yml(join(searx_dir, 'settings.yml')) or check_settings_yml('/etc/searx/settings.yml')
52− raise Exception('settings.yml not found')
55−with open(settings_path, 'r', encoding='utf-8') as settings_yaml:
56− settings = safe_load(settings_yaml)
59enable debug if
33enable debug if
60the environnement variable SEARX_DEBUG is 1 or true
34the environnement variable SEARX_DEBUG is 1 or true
61(whatever the value in settings.yml)
35(whatever the value in settings.yml)
62or general.debug=True in settings.yml
36or general.debug=True in settings.yml
64disable debug if
37disable debug if
65the environnement variable SEARX_DEBUG is 0 or false
38the environnement variable SEARX_DEBUG is 0 or false
66(whatever the value in settings.yml)
39(whatever the value in settings.yml)
@@ -80,17 +53,56 @@ else:
80 logging.basicConfig(level=logging.WARNING)
53 logging.basicConfig(level=logging.WARNING)
82logger = logging.getLogger('searx')
55logger = logging.getLogger('searx')
83−logger.debug('read configuration from %s', settings_path)
56+logger.info(settings_load_message)
84−# Workaround for openssl versions <1.0.2
85−# https://github.com/certifi/python-certifi/issues/26
86−if OPENSSL_VERSION_INFO[0:3] < (1, 0, 2):
87− if hasattr(certifi, 'old_where'):
88− environ['REQUESTS_CA_BUNDLE'] = certifi.old_where()
89− logger.warning('You are using an old openssl version({0}), please upgrade above 1.0.2!'.format(OPENSSL_VERSION))
91logger.info('Initialisation done')
57logger.info('Initialisation done')
93if 'SEARX_SECRET' in environ:
59if 'SEARX_SECRET' in environ:
94 settings['server']['secret_key'] = environ['SEARX_SECRET']
60 settings['server']['secret_key'] = environ['SEARX_SECRET']
95if 'SEARX_BIND_ADDRESS' in environ:
61if 'SEARX_BIND_ADDRESS' in environ:
96 settings['server']['bind_address'] = environ['SEARX_BIND_ADDRESS']
62 settings['server']['bind_address'] = environ['SEARX_BIND_ADDRESS']
65+class _brand_namespace:
68+ def get_val(cls, group, name, default=''):
69+ return settings.get(group, {}).get(name) or default
73+ return self.get_val('server', 'base_url')
76+ def CONTACT_URL(self):
77+ return self.get_val('general', 'contact_url')
81+ return self.get_val('brand', 'git_url')
84+ def GIT_BRANCH(self):
85+ return self.get_val('brand', 'git_branch')
89+ return self.get_val('brand', 'issue_url')
93+ return self.get_val('brand', 'docs_url')
96+ def PUBLIC_INSTANCES(self):
97+ return self.get_val('brand', 'public_instances')
101+ return self.get_val('brand', 'wiki_url')
104+ def TWITTER_URL(self):
105+ return self.get_val('brand', 'twitter_url')
108+brand = _brand_namespace()
searx/answerers/__init__.py+2−6
@@ -1,12 +1,8 @@
1from os import listdir
1from os import listdir
2from os.path import realpath, dirname, join, isdir
2from os.path import realpath, dirname, join, isdir
3−from sys import version_info
4from searx.utils import load_module
3from searx.utils import load_module
5from collections import defaultdict
4from collections import defaultdict
7−if version_info[0] == 3:
11answerers_dir = dirname(realpath(__file__))
7answerers_dir = dirname(realpath(__file__))
@@ -36,10 +32,10 @@ def ask(query):
36 results = []
32 results = []
37 query_parts = list(filter(None, query.query.split()))
33 query_parts = list(filter(None, query.query.split()))
39− if query_parts[0].decode('utf-8') not in answerers_by_keywords:
35+ if not query_parts or query_parts[0] not in answerers_by_keywords:
40 return results
36 return results
42− for answerer in answerers_by_keywords[query_parts[0].decode('utf-8')]:
38+ for answerer in answerers_by_keywords[query_parts[0]]:
43 result = answerer(query)
39 result = answerer(query)
44 if result:
40 if result:
45 results.append(result)
41 results.append(result)
searx/answerers/random/answerer.py+13−19
@@ -1,7 +1,6 @@
1import hashlib
1import hashlib
2import random
2import random
3import string
3import string
6from flask_babel import gettext
5from flask_babel import gettext
@@ -10,12 +9,7 @@ from flask_babel import gettext
10keywords = ('random',)
9keywords = ('random',)
12random_int_max = 2**31
11random_int_max = 2**31
14−if sys.version_info[0] == 2:
15− random_string_letters = string.lowercase + string.digits + string.uppercase
18− random_string_letters = string.ascii_lowercase + string.digits + string.ascii_uppercase
12+random_string_letters = string.ascii_lowercase + string.digits + string.ascii_uppercase
21def random_characters():
15def random_characters():
@@ -24,32 +18,32 @@ def random_characters():
26def random_string():
20def random_string():
27− return u''.join(random_characters())
21+ return ''.join(random_characters())
30def random_float():
24def random_float():
31− return unicode(random.random())
25+ return str(random.random())
34def random_int():
28def random_int():
35− return unicode(random.randint(-random_int_max, random_int_max))
29+ return str(random.randint(-random_int_max, random_int_max))
38def random_sha256():
32def random_sha256():
39 m = hashlib.sha256()
33 m = hashlib.sha256()
40− m.update(b''.join(random_characters()))
34+ m.update(''.join(random_characters()).encode())
41− return unicode(m.hexdigest())
35+ return str(m.hexdigest())
44def random_uuid():
38def random_uuid():
45− return unicode(uuid.uuid4())
39+ return str(uuid.uuid4())
48−random_types = {b'string': random_string,
42+random_types = {'string': random_string,
49− b'int': random_int,
43+ 'int': random_int,
50− b'float': random_float,
44+ 'float': random_float,
51− b'sha256': random_sha256,
45+ 'sha256': random_sha256,
52− b'uuid': random_uuid}
46+ 'uuid': random_uuid}
55# required answerer function
49# required answerer function
@@ -70,4 +64,4 @@ def answer(query):
70def self_info():
64def self_info():
71 return {'name': gettext('Random value generator'),
65 return {'name': gettext('Random value generator'),
72 'description': gettext('Generate different random values'),
66 'description': gettext('Generate different random values'),
73− 'examples': [u'random {}'.format(x.decode('utf-8')) for x in random_types]}
67+ 'examples': ['random {}'.format(x) for x in random_types]}
searx/answerers/statistics/answerer.py+6−9
@@ -1,11 +1,8 @@
1−from sys import version_info
2from functools import reduce
1from functools import reduce
3from operator import mul
2from operator import mul
5from flask_babel import gettext
4from flask_babel import gettext
7−if version_info[0] == 3:
10keywords = ('min',
7keywords = ('min',
@@ -30,21 +27,21 @@ def answer(query):
30 func = parts[0]
27 func = parts[0]
31 answer = None
28 answer = None
33− if func == b'min':
30+ if func == 'min':
34 answer = min(args)
31 answer = min(args)
35− elif func == b'max':
32+ elif func == 'max':
36 answer = max(args)
33 answer = max(args)
37− elif func == b'avg':
34+ elif func == 'avg':
38 answer = sum(args) / len(args)
35 answer = sum(args) / len(args)
39− elif func == b'sum':
36+ elif func == 'sum':
40 answer = sum(args)
37 answer = sum(args)
41− elif func == b'prod':
38+ elif func == 'prod':
42 answer = reduce(mul, args, 1)
39 answer = reduce(mul, args, 1)
44 if answer is None:
41 if answer is None:
47− return [{'answer': unicode(answer)}]
44+ return [{'answer': str(answer)}]
50# required answerer function
47# required answerer function
searx/autocomplete.py+40−92
@@ -16,107 +16,45 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
20from lxml import etree
19from lxml import etree
21from json import loads
20from json import loads
22−from searx import settings
23−from searx.languages import language_codes
24−from searx.engines import (
25− categories, engines, engine_shortcuts
27−from searx.poolrequests import get as http_get
28−from searx.url_utils import urlencode
21+from urllib.parse import urlencode
23+from httpx import HTTPError
30−if sys.version_info[0] == 3:
25+
31− unicode = str
26+from searx import settings
27+from searx.data import ENGINES_LANGUAGES
28+from searx.network import get as http_get
29+from searx.exceptions import SearxEngineResponseException
34def get(*args, **kwargs):
32def get(*args, **kwargs):
35 if 'timeout' not in kwargs:
33 if 'timeout' not in kwargs:
36 kwargs['timeout'] = settings['outgoing']['request_timeout']
34 kwargs['timeout'] = settings['outgoing']['request_timeout']
37−
35+ kwargs['raise_for_httperror'] = True
38 return http_get(*args, **kwargs)
36 return http_get(*args, **kwargs)
41−def searx_bang(full_query):
39+def brave(query, lang):
42− '''check if the searchQuery contain a bang, and create fitting autocompleter results'''
40+ # brave search autocompleter
43− # check if there is a query which can be parsed
41+ url = 'https://search.brave.com/api/suggest?{query}'
44− if len(full_query.getSearchQuery()) == 0:
42+
45− return []
43+ resp = get(url.format(query=urlencode({'q': query})))
47 results = []
45 results = []
49− # check if current query stats with !bang
47+ if resp.ok:
50− first_char = full_query.getSearchQuery()[0]
48+ data = loads(resp.text)
51− if first_char == '!' or first_char == '?':
49+ for suggestion in data[1]:
52− if len(full_query.getSearchQuery()) == 1:
50+ results.append(suggestion)
53− # show some example queries
51+
54− # TODO, check if engine is not avaliable
52+ return results
55− results.append(first_char + "images")
56− results.append(first_char + "wikipedia")
57− results.append(first_char + "osm")
59− engine_query = full_query.getSearchQuery()[1:]
61− # check if query starts with categorie name
62− for categorie in categories:
63− if categorie.startswith(engine_query):
64− results.append(first_char + '{categorie}'.format(categorie=categorie))
66− # check if query starts with engine name
67− for engine in engines:
68− if engine.startswith(engine_query.replace('_', ' ')):
69− results.append(first_char + '{engine}'.format(engine=engine.replace(' ', '_')))
71− # check if query starts with engine shortcut
72− for engine_shortcut in engine_shortcuts:
73− if engine_shortcut.startswith(engine_query):
74− results.append(first_char + '{engine_shortcut}'.format(engine_shortcut=engine_shortcut))
76− # check if current query stats with :bang
77− elif first_char == ':':
78− if len(full_query.getSearchQuery()) == 1:
79− # show some example queries
80− results.append(":en")
81− results.append(":en_us")
82− results.append(":english")
83− results.append(":united_kingdom")
85− engine_query = full_query.getSearchQuery()[1:]
87− for lc in language_codes:
88− lang_id, lang_name, country, english_name = map(unicode.lower, lc)
90− # check if query starts with language-id
91− if lang_id.startswith(engine_query):
92− if len(engine_query) <= 2:
93− results.append(u':{lang_id}'.format(lang_id=lang_id.split('-')[0]))
95− results.append(u':{lang_id}'.format(lang_id=lang_id))
97− # check if query starts with language name
98− if lang_name.startswith(engine_query) or english_name.startswith(engine_query):
99− results.append(u':{lang_name}'.format(lang_name=lang_name))
101− # check if query starts with country
102− if country.startswith(engine_query.replace('_', ' ')):
103− results.append(u':{country}'.format(country=country.replace(' ', '_')))
106− result_set = set(results)
108− # remove results which are already contained in the query
109− for query_part in full_query.query_parts:
110− if query_part in result_set:
111− result_set.remove(query_part)
113− # convert result_set back to list
114− return list(result_set)
117def dbpedia(query, lang):
55def dbpedia(query, lang):
118 # dbpedia autocompleter, no HTTPS
56 # dbpedia autocompleter, no HTTPS
119− autocomplete_url = 'http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?'
57+ autocomplete_url = 'https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?'
121 response = get(autocomplete_url + urlencode(dict(QueryString=query)))
59 response = get(autocomplete_url + urlencode(dict(QueryString=query)))
@@ -124,8 +62,7 @@ def dbpedia(query, lang):
125 if response.ok:
63 if response.ok:
126 dom = etree.fromstring(response.content)
64 dom = etree.fromstring(response.content)
127− results = dom.xpath('//a:Result/a:Label//text()',
65+ results = dom.xpath('//Result/Label//text()')
128− namespaces={'a': 'http://lookup.dbpedia.org/'})
130 return results
67 return results
@@ -157,12 +94,11 @@ def google(query, lang):
158def startpage(query, lang):
95def startpage(query, lang):
159 # startpage autocompleter
96 # startpage autocompleter
97+ lui = ENGINES_LANGUAGES['startpage'].get(lang, 'english')
160− url = 'https://startpage.com/do/suggest?{query}'
98+ url = 'https://startpage.com/suggestions?{query}'
162− resp = get(url.format(query=urlencode({'query': query}))).text.split('\n')
99+ resp = get(url.format(query=urlencode({'q': query, 'segment': 'startpage.udog', 'lui': lui})))
163− if len(resp) > 1:
100+ data = resp.json()
164− return resp
101+ return [e['text'] for e in data.get('suggestions', []) if 'text' in e]
168def swisscows(query, lang):
104def swisscows(query, lang):
@@ -200,7 +136,8 @@ def wikipedia(query, lang):
200 return []
136 return []
139+backends = {'brave': brave,
203−backends = {'dbpedia': dbpedia,
140+ 'dbpedia': dbpedia,
204 'duckduckgo': duckduckgo,
141 'duckduckgo': duckduckgo,
205 'google': google,
142 'google': google,
206 'startpage': startpage,
143 'startpage': startpage,
@@ -208,3 +145,14 @@ backends = {'dbpedia': dbpedia,
208 'qwant': qwant,
145 'qwant': qwant,
209 'wikipedia': wikipedia
146 'wikipedia': wikipedia
150+def search_autocomplete(backend_name, query, lang):
151+ backend = backends.get(backend_name)
156+ return backend(query, lang)
157+ except (HTTPError, SearxEngineResponseException):
@@ -1,6 +0,0 @@
1−GIT_URL = 'https://github.com/asciimoo/searx'
3−ISSUE_URL = 'https://github.com/asciimoo/searx/issues'
4−SEARX_URL = 'https://searx.me'
5−DOCS_URL = 'https://asciimoo.github.io/searx'
6−PUBLIC_INSTANCES = 'https://searx.space'
searx/data/__init__.pynew file+50
@@ -0,0 +1,50 @@
1+# SPDX-License-Identifier: AGPL-3.0-or-later
3+"""This module holds the *data* created by::
17+ 'ahmia_blacklist_loader',
21+from pathlib import Path
23+data_dir = Path(__file__).parent
27+ with open(data_dir / filename, encoding='utf-8') as f:
31+def ahmia_blacklist_loader():
32+ """Load data from `ahmia_blacklist.txt` and return a list of MD5 values of onion
33+ names. The MD5 values are fetched by::
35+ searx_extra/update/update_ahmia_blacklist.py
37+ This function is used by :py:mod:`searx.plugins.ahmia_filter`.
40+ with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as f:
41+ return f.read().split()
44+ENGINES_LANGUAGES = _load('engines_languages.json')
45+CURRENCIES = _load('currencies.json')
46+USER_AGENTS = _load('useragents.json')
47+EXTERNAL_URLS = _load('external_urls.json')
48+WIKIDATA_UNITS = _load('wikidata_units.json')
49+EXTERNAL_BANGS = _load('external_bangs.json')
50+OSM_KEYS_TAGS = _load('osm_keys_tags.json')
searx/data/ahmia_blacklist.txtnew file+35730
This diff is too big to show here.
searx/data/currencies.json+14643−7619
This diff is too big to show here.
searx/data/engines_languages.json+1112−858
This diff is too big to show here.
searx/data/external_bangs.jsonnew file+19068
This diff is too big to show here.
searx/data/external_urls.jsonnew file+156
This diff is too big to show here.
searx/data/osm_keys_tags.jsonnew file+15416
This diff is too big to show here.
searx/data/useragents.json+5−4
This diff is too big to show here.
searx/data/wikidata_units.jsonnew file+1223
This diff is too big to show here.
searx/engines/1337x.py+23−9
This diff is too big to show here.
searx/engines/__init__.py+57−24
This diff is too big to show here.
searx/engines/acgsou.pydeleted−75
This diff is too big to show here.
searx/engines/ahmia.pynew file+85
This diff is too big to show here.
searx/engines/apkmirror.py+33−26
This diff is too big to show here.
searx/engines/archlinux.py+17−14
This diff is too big to show here.
searx/engines/arxiv.py+23−25
This diff is too big to show here.
searx/engines/bandcamp.pynew file+73
This diff is too big to show here.
searx/engines/base.py+13−17
This diff is too big to show here.
searx/engines/bing.py+15−18
This diff is too big to show here.
searx/engines/bing_images.py+22−23
This diff is too big to show here.
searx/engines/bing_news.py+21−19
This diff is too big to show here.
searx/engines/bing_videos.py+14−11
This diff is too big to show here.
searx/engines/btdigg.py+16−12
This diff is too big to show here.
searx/engines/ccengine.pynew file+53
This diff is too big to show here.
searx/engines/command.pynew file+172
This diff is too big to show here.
searx/engines/core.pynew file+82
This diff is too big to show here.
searx/engines/currency_convert.py+18−63
This diff is too big to show here.
searx/engines/dailymotion.py+12−12
This diff is too big to show here.
searx/engines/deezer.py+13−10
This diff is too big to show here.
searx/engines/deviantart.py+50−54
This diff is too big to show here.
searx/engines/dictzone.py+21−29
This diff is too big to show here.
searx/engines/digbt.py+13−15
This diff is too big to show here.
searx/engines/digg.py+45−45
This diff is too big to show here.
searx/engines/doku.py+16−14
This diff is too big to show here.
searx/engines/duckduckgo.py+118−81
This diff is too big to show here.
searx/engines/duckduckgo_definitions.py+172−82
This diff is too big to show here.
searx/engines/duckduckgo_images.py+21−24
This diff is too big to show here.
searx/engines/duden.py+31−34
This diff is too big to show here.
searx/engines/dummy-offline.py+11−3
This diff is too big to show here.
searx/engines/dummy.py+11−3
This diff is too big to show here.
searx/engines/ebay.pynew file+73
This diff is too big to show here.
searx/engines/elasticsearch.pynew file+144
This diff is too big to show here.
searx/engines/etools.py+13−11
This diff is too big to show here.
searx/engines/fdroid.py+13−9
This diff is too big to show here.
searx/engines/filecrop.pydeleted−88
This diff is too big to show here.
searx/engines/flickr.py+12−10
This diff is too big to show here.
searx/engines/flickr_noapi.py+17−16
This diff is too big to show here.
searx/engines/framalibre.py+14−14
This diff is too big to show here.
searx/engines/freesound.pynew file+69
This diff is too big to show here.
searx/engines/frinkiac.py+16−9
This diff is too big to show here.
searx/engines/genius.py+19−18
This diff is too big to show here.
searx/engines/gentoo.py+14−13
This diff is too big to show here.
searx/engines/gigablast.py+36−24
This diff is too big to show here.
searx/engines/github.py+13−10
This diff is too big to show here.
searx/engines/google.py+280−330
This diff is too big to show here.
searx/engines/google_images.py+183−71
This diff is too big to show here.
searx/engines/google_news.py+168−58
This diff is too big to show here.
searx/engines/google_scholar.pynew file+156
This diff is too big to show here.
searx/engines/google_videos.py+174−70
This diff is too big to show here.
searx/engines/imdb.pynew file+55
This diff is too big to show here.
searx/engines/ina.py+18−23
This diff is too big to show here.
searx/engines/invidious.py+38−16
This diff is too big to show here.
searx/engines/json_engine.py+19−12
This diff is too big to show here.
searx/engines/kickass.py+13−11
This diff is too big to show here.
searx/engines/loc.pynew file+68
This diff is too big to show here.
searx/engines/mediathekviewweb.pynew file+68
This diff is too big to show here.
searx/engines/mediawiki.py+14−14
This diff is too big to show here.
searx/engines/meilisearch.pynew file+59
This diff is too big to show here.
searx/engines/microsoft_academic.py+37−41
This diff is too big to show here.
searx/engines/mixcloud.py+12−9
This diff is too big to show here.
searx/engines/mongodb.pynew file+61
This diff is too big to show here.
searx/engines/mysql_server.pynew file+62
This diff is too big to show here.
searx/engines/nyaa.py+13−10
This diff is too big to show here.
searx/engines/onesearch.pynew file+57
This diff is too big to show here.
searx/engines/opensemantic.pynew file+46
This diff is too big to show here.
searx/engines/openstreetmap.py+407−74
This diff is too big to show here.
searx/engines/pdbe.py+11−8
This diff is too big to show here.
searx/engines/peertube.pynew file+96
This diff is too big to show here.
searx/engines/photon.py+13−11
This diff is too big to show here.
searx/engines/piratebay.py+72−67
This diff is too big to show here.
searx/engines/postgresql.pynew file+69
This diff is too big to show here.
searx/engines/prowlarr.pynew file+80
This diff is too big to show here.
searx/engines/pubmed.py+17−13
This diff is too big to show here.
searx/engines/qwant.py+199−88
This diff is too big to show here.
searx/engines/recoll.pynew file+111
This diff is too big to show here.
searx/engines/reddit.py+12−9
This diff is too big to show here.
searx/engines/redis_server.pynew file+69
This diff is too big to show here.
searx/engines/rumble.pynew file+81
This diff is too big to show here.
searx/engines/scanr_structures.py+12−9
This diff is too big to show here.
searx/engines/searchcode_code.py+13−11
This diff is too big to show here.
searx/engines/searchcode_doc.pydeleted−49
This diff is too big to show here.
searx/engines/searx_engine.py+10−8
This diff is too big to show here.
searx/engines/seedpeer.pydeleted−78
This diff is too big to show here.
searx/engines/semantic_scholar.pynew file+42
This diff is too big to show here.
searx/engines/sepiasearch.pynew file+102
This diff is too big to show here.
searx/engines/seznam.pynew file+66
This diff is too big to show here.
searx/engines/sjp.pynew file+92
This diff is too big to show here.
searx/engines/solidtorrents.pynew file+53
This diff is too big to show here.
searx/engines/solr.pynew file+74
This diff is too big to show here.
searx/engines/soundcloud.py+16−18
This diff is too big to show here.
searx/engines/spotify.py+18−14
This diff is too big to show here.
searx/engines/springer.pynew file+74
This diff is too big to show here.
searx/engines/sqlite.pynew file+51
This diff is too big to show here.
searx/engines/stackexchange.pynew file+67
This diff is too big to show here.
searx/engines/stackoverflow.pydeleted−57
This diff is too big to show here.
searx/engines/startpage.py+167−32
This diff is too big to show here.
searx/engines/tineye.pynew file+86
This diff is too big to show here.
searx/engines/tokyotoshokan.py+13−11
This diff is too big to show here.
searx/engines/torrentz.py+16−15
This diff is too big to show here.
searx/engines/translated.py+18−35
This diff is too big to show here.
searx/engines/twitter.pydeleted−87
This diff is too big to show here.
searx/engines/unsplash.py+12−9
This diff is too big to show here.
searx/engines/vimeo.py+15−14
This diff is too big to show here.
searx/engines/wikidata.py+647−455
This diff is too big to show here.
searx/engines/wikipedia.py+47−74
This diff is too big to show here.
searx/engines/wolframalpha_api.py+24−19
This diff is too big to show here.
searx/engines/wolframalpha_noapi.py+17−12
This diff is too big to show here.
searx/engines/wordnik.pynew file+77
This diff is too big to show here.
searx/engines/www1x.py+21−22
This diff is too big to show here.
searx/engines/xpath.py+41−81
This diff is too big to show here.
searx/engines/xpath_flex.pynew file+121
This diff is too big to show here.
searx/engines/yacy.py+23−17
This diff is too big to show here.
searx/engines/yahoo.py+104−102
This diff is too big to show here.
searx/engines/yahoo_news.py+84−83
This diff is too big to show here.
searx/engines/yandex.pydeleted−64
This diff is too big to show here.
searx/engines/yggtorrent.pynew file+128
This diff is too big to show here.
searx/engines/youtube_api.py+19−11
This diff is too big to show here.
searx/engines/youtube_noapi.py+86−20
This diff is too big to show here.
This diff is too big to show here.
searx/external_bang.pynew file+89
This diff is too big to show here.
searx/external_urls.pynew file+89
This diff is too big to show here.
This diff is too big to show here.
searx/metrology/__init__.pynew file
No changes to the content.
searx/metrology/error_recorder.pynew file+144
This diff is too big to show here.
searx/network/__init__.pynew file+188
This diff is too big to show here.
searx/network/client.pynew file+219
This diff is too big to show here.
searx/network/network.pynew file+358
This diff is too big to show here.
searx/network/raise_for_httperror.pynew file+66
This diff is too big to show here.
searx/plugins/__init__.py+110−9
This diff is too big to show here.
searx/plugins/ahmia_filter.pynew file+33
This diff is too big to show here.
searx/plugins/hash_plugin.pynew file+54
This diff is too big to show here.
searx/plugins/hostname_replace.pynew file+28
This diff is too big to show here.
searx/plugins/https_rewrite.py+1−4
This diff is too big to show here.
searx/plugins/oa_doi_rewrite.py+3−3
This diff is too big to show here.
searx/plugins/open_results_on_new_tab.pydeleted−25
This diff is too big to show here.
searx/plugins/self_info.py+3−3
This diff is too big to show here.
searx/plugins/tracker_url_remover.py+2−1
This diff is too big to show here.
searx/poolrequests.pydeleted−159
This diff is too big to show here.
searx/preferences.py+73−29
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
searx/search.pydeleted−543
This diff is too big to show here.
searx/search/__init__.pynew file+216
This diff is too big to show here.
searx/search/checker/__init__.pynew file+4
This diff is too big to show here.
searx/search/checker/__main__.pynew file+95
This diff is too big to show here.
searx/search/checker/background.pynew file+125
This diff is too big to show here.
searx/search/checker/impl.pynew file+416
This diff is too big to show here.
searx/search/models.pynew file+71
This diff is too big to show here.
searx/search/processors/__init__.pynew file+41
This diff is too big to show here.
searx/search/processors/abstract.pynew file+52
This diff is too big to show here.
searx/search/processors/offline.pynew file+51
This diff is too big to show here.
searx/search/processors/online.pynew file+262
This diff is too big to show here.
searx/search/processors/online_currency.pynew file+69
This diff is too big to show here.
searx/search/processors/online_dictionary.pynew file+55
This diff is too big to show here.
searx/settings.yml+1022−130
This diff is too big to show here.
searx/settings_loader.pynew file+132
This diff is too big to show here.
searx/settings_robot.yml+12−3
This diff is too big to show here.
searx/shared/__init__.pynew file+31
This diff is too big to show here.
searx/shared/shared_abstract.pynew file+21
This diff is too big to show here.
searx/shared/shared_simple.pynew file+39
This diff is too big to show here.
searx/shared/shared_uwsgi.pynew file+64
This diff is too big to show here.
searx/static/css/bootstrap.min.cssdeleted−1
This diff is too big to show here.
searx/static/fonts/glyphicons-halflings-regular.eotdeleted
Binary file not shown.
searx/static/fonts/glyphicons-halflings-regular.svgdeleted−229
This diff is too big to show here.
searx/static/fonts/glyphicons-halflings-regular.ttfdeleted
Binary file not shown.
searx/static/fonts/glyphicons-halflings-regular.woffdeleted
Binary file not shown.
searx/static/js/bootstrap.min.jsdeleted−6
This diff is too big to show here.
searx/static/js/html5shiv.min.jsdeleted−4
This diff is too big to show here.
searx/static/js/jquery-1.11.1.min.jsdeleted−4
This diff is too big to show here.
searx/static/js/mootools-autocompleter-1.1.2-min.jsdeleted−2
This diff is too big to show here.
searx/static/js/mootools-core-1.4.5-min.jsdeleted−491
This diff is too big to show here.
searx/static/js/require-2.1.15.min.jsdeleted−36
This diff is too big to show here.
searx/static/js/respond.min.jsdeleted−5
This diff is too big to show here.
searx/static/js/typeahead.bundle.min.jsdeleted−7
This diff is too big to show here.
searx/static/less/bootstrap/.csscomb.jsondeleted−297
This diff is too big to show here.
searx/static/less/bootstrap/.csslintrcdeleted−19
This diff is too big to show here.
searx/static/less/bootstrap/alerts.lessdeleted−68
This diff is too big to show here.
searx/static/less/bootstrap/badges.lessdeleted−55
This diff is too big to show here.
searx/static/less/bootstrap/bootstrap.lessdeleted−53
This diff is too big to show here.
searx/static/less/bootstrap/breadcrumbs.lessdeleted−26
This diff is too big to show here.
searx/static/less/bootstrap/button-groups.lessdeleted−240
This diff is too big to show here.
searx/static/less/bootstrap/buttons.lessdeleted−157
This diff is too big to show here.
searx/static/less/bootstrap/carousel.lessdeleted−243
This diff is too big to show here.
searx/static/less/bootstrap/close.lessdeleted−33
This diff is too big to show here.
searx/static/less/bootstrap/code.lessdeleted−68
This diff is too big to show here.
searx/static/less/bootstrap/component-animations.lessdeleted−31
This diff is too big to show here.
searx/static/less/bootstrap/dropdowns.lessdeleted−215
This diff is too big to show here.
searx/static/less/bootstrap/forms.lessdeleted−540
This diff is too big to show here.
searx/static/less/bootstrap/glyphicons.lessdeleted−233
This diff is too big to show here.
searx/static/less/bootstrap/grid.lessdeleted−84
This diff is too big to show here.
searx/static/less/bootstrap/input-groups.lessdeleted−166
This diff is too big to show here.
searx/static/less/bootstrap/jumbotron.lessdeleted−48
This diff is too big to show here.
searx/static/less/bootstrap/labels.lessdeleted−64
This diff is too big to show here.
searx/static/less/bootstrap/list-group.lessdeleted−131
This diff is too big to show here.
searx/static/less/bootstrap/media.lessdeleted−56
This diff is too big to show here.
searx/static/less/bootstrap/mixins.lessdeleted−39
This diff is too big to show here.
searx/static/less/bootstrap/mixins/alerts.lessdeleted−14
This diff is too big to show here.
searx/static/less/bootstrap/mixins/background-variant.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/border-radius.lessdeleted−18
This diff is too big to show here.
searx/static/less/bootstrap/mixins/buttons.lessdeleted−50
This diff is too big to show here.
searx/static/less/bootstrap/mixins/center-block.lessdeleted−7
This diff is too big to show here.
searx/static/less/bootstrap/mixins/clearfix.lessdeleted−22
This diff is too big to show here.
searx/static/less/bootstrap/mixins/forms.lessdeleted−81
This diff is too big to show here.
searx/static/less/bootstrap/mixins/gradients.lessdeleted−59
This diff is too big to show here.
searx/static/less/bootstrap/mixins/grid-framework.lessdeleted−91
This diff is too big to show here.
searx/static/less/bootstrap/mixins/grid.lessdeleted−122
This diff is too big to show here.
searx/static/less/bootstrap/mixins/hide-text.lessdeleted−21
This diff is too big to show here.
searx/static/less/bootstrap/mixins/image.lessdeleted−34
This diff is too big to show here.
searx/static/less/bootstrap/mixins/labels.lessdeleted−12
This diff is too big to show here.
searx/static/less/bootstrap/mixins/list-group.lessdeleted−29
This diff is too big to show here.
searx/static/less/bootstrap/mixins/nav-divider.lessdeleted−10
This diff is too big to show here.
searx/static/less/bootstrap/mixins/nav-vertical-align.lessdeleted−9
This diff is too big to show here.
searx/static/less/bootstrap/mixins/opacity.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/pagination.lessdeleted−23
This diff is too big to show here.
searx/static/less/bootstrap/mixins/panels.lessdeleted−24
This diff is too big to show here.
searx/static/less/bootstrap/mixins/progress-bar.lessdeleted−10
This diff is too big to show here.
searx/static/less/bootstrap/mixins/reset-filter.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/resize.lessdeleted−6
This diff is too big to show here.
searx/static/less/bootstrap/mixins/responsive-visibility.lessdeleted−15
This diff is too big to show here.
searx/static/less/bootstrap/mixins/size.lessdeleted−10
This diff is too big to show here.
searx/static/less/bootstrap/mixins/tab-focus.lessdeleted−9
This diff is too big to show here.
searx/static/less/bootstrap/mixins/table-row.lessdeleted−28
This diff is too big to show here.
searx/static/less/bootstrap/mixins/text-emphasis.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/text-overflow.lessdeleted−8
This diff is too big to show here.
searx/static/less/bootstrap/mixins/vendor-prefixes.lessdeleted−224
This diff is too big to show here.
searx/static/less/bootstrap/modals.lessdeleted−150
This diff is too big to show here.
searx/static/less/bootstrap/navbar.lessdeleted−655
This diff is too big to show here.
searx/static/less/bootstrap/navs.lessdeleted−242
This diff is too big to show here.
searx/static/less/bootstrap/normalize.lessdeleted−425
This diff is too big to show here.
searx/static/less/bootstrap/pager.lessdeleted−55
This diff is too big to show here.
searx/static/less/bootstrap/pagination.lessdeleted−88
This diff is too big to show here.
searx/static/less/bootstrap/panels.lessdeleted−243
This diff is too big to show here.
searx/static/less/bootstrap/popovers.lessdeleted−133
This diff is too big to show here.
searx/static/less/bootstrap/print.lessdeleted−101
This diff is too big to show here.
searx/static/less/bootstrap/progress-bars.lessdeleted−105
This diff is too big to show here.
searx/static/less/bootstrap/responsive-embed.lessdeleted−34
This diff is too big to show here.
searx/static/less/bootstrap/responsive-utilities.lessdeleted−194
This diff is too big to show here.
searx/static/less/bootstrap/scaffolding.lessdeleted−150
This diff is too big to show here.
searx/static/less/bootstrap/tables.lessdeleted−233
This diff is too big to show here.
searx/static/less/bootstrap/theme.lessdeleted−258
This diff is too big to show here.
searx/static/less/bootstrap/thumbnails.lessdeleted−36
This diff is too big to show here.
searx/static/less/bootstrap/tooltip.lessdeleted−95
This diff is too big to show here.
searx/static/less/bootstrap/type.lessdeleted−313
This diff is too big to show here.
searx/static/less/bootstrap/typeahead.lessdeleted−153
This diff is too big to show here.
searx/static/less/bootstrap/utilities.lessdeleted−57
This diff is too big to show here.
searx/static/less/bootstrap/variables.lessdeleted−846
This diff is too big to show here.
searx/static/less/bootstrap/wells.lessdeleted−29
This diff is too big to show here.
searx/static/plugins/external_plugins/.gitignorenew file+3
This diff is too big to show here.
searx/static/plugins/js/infinite_scroll.js+1−1
This diff is too big to show here.
searx/static/plugins/js/open_results_on_new_tab.jsdeleted−3
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_imageresult.js → searx/static/themes/__common__/js/image_layout.jsrenamed+61−49
This diff is too big to show here.
searx/static/themes/courgette/css/style-rtl.cssdeleted−1
This diff is too big to show here.
searx/static/themes/courgette/css/style.cssdeleted−1
This diff is too big to show here.
searx/static/themes/courgette/img/bg-body-index.jpgdeleted
Binary file not shown.
searx/static/themes/courgette/img/favicon.pngdeleted
Binary file not shown.
searx/static/themes/courgette/img/github_ribbon.pngdeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_500px.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_bing.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_dailymotion.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_deezer.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_deviantart.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_digg.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_duckduckgo.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_flickr.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_github.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_google play apps.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_google play movies.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_google play music.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_google.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_kickass.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_openstreetmap.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_searchcode code.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_searchcode doc.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_searchcode.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_soundcloud.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_stackoverflow.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_startpage.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_subtitleseeker.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_twitter.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_vimeo.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_wikipedia.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_yahoo.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/icons/icon_youtube.icodeleted
Binary file not shown.
searx/static/themes/courgette/img/preference-icon.pngdeleted
Binary file not shown.
searx/static/themes/courgette/img/search-icon.pngdeleted
Binary file not shown.
searx/static/themes/courgette/img/searx-mobile.pngdeleted
Binary file not shown.
searx/static/themes/courgette/img/searx.pngdeleted
Binary file not shown.
searx/static/themes/courgette/img/searx_logo.svgdeleted−203
This diff is too big to show here.
searx/static/themes/courgette/js/searx.jsdeleted−45
This diff is too big to show here.
searx/static/themes/courgette/less/style-rtl.lessdeleted−42
This diff is too big to show here.
searx/static/themes/courgette/less/style.lessdeleted−695
This diff is too big to show here.
searx/static/themes/legacy/css/style-rtl.cssdeleted−1
This diff is too big to show here.
searx/static/themes/legacy/css/style.cssdeleted−1
This diff is too big to show here.
searx/static/themes/legacy/img/favicon.pngdeleted
Binary file not shown.
searx/static/themes/legacy/img/github_ribbon.pngdeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_500px.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_bing.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_dailymotion.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_deezer.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_deviantart.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_digg.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_duckduckgo.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_flickr.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_github.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_google play apps.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_google play movies.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_google play music.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_google.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_kickass.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_openstreetmap.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_searchcode code.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_searchcode doc.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_searchcode.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_soundcloud.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_stackoverflow.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_startpage.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_subtitleseeker.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_twitter.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_vimeo.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_wikipedia.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_yahoo.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/icons/icon_youtube.icodeleted
Binary file not shown.
searx/static/themes/legacy/img/preference-icon.pngdeleted
Binary file not shown.
searx/static/themes/legacy/img/search-icon.pngdeleted
Binary file not shown.
searx/static/themes/legacy/img/searx.pngdeleted
Binary file not shown.
searx/static/themes/legacy/img/searx_logo.svgdeleted−203
This diff is too big to show here.
searx/static/themes/legacy/js/searx.jsdeleted−49
This diff is too big to show here.
searx/static/themes/legacy/less/autocompleter.lessdeleted−61
This diff is too big to show here.
searx/static/themes/legacy/less/code.lessdeleted−83
This diff is too big to show here.
searx/static/themes/legacy/less/definitions.lessdeleted−119
This diff is too big to show here.
searx/static/themes/legacy/less/mixins.lessdeleted−27
This diff is too big to show here.
searx/static/themes/legacy/less/search.lessdeleted−68
This diff is too big to show here.
searx/static/themes/legacy/less/style-rtl.lessdeleted−11
This diff is too big to show here.
searx/static/themes/legacy/less/style.lessdeleted−747
This diff is too big to show here.
searx/static/themes/oscar/README.rst+39
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap-theme.cssnew file+587
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap-theme.min.cssnew file+6
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap-theme.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap.cssnew file+6990
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap.min.cssnew file+5
This diff is too big to show here.
searx/static/themes/oscar/css/bootstrap.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/images/layers-2x.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/layers.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/marker-icon-2x.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/marker-icon.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/images/marker-shadow.pngnew file
Binary file not shown.
searx/static/themes/oscar/css/leaflet.cssnew file+640
This diff is too big to show here.
searx/static/themes/oscar/css/leaflet.min.css+1−93
This diff is too big to show here.
searx/static/themes/oscar/css/leaflet.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev-dark.css+348−177
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev-dark.min.css+1−1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev-dark.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev.css+361−180
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev.min.css+1−1
This diff is too big to show here.
searx/static/themes/oscar/css/logicodev.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/css/pointhi.css+235−104
This diff is too big to show here.
searx/static/themes/oscar/css/pointhi.min.css+1−1
This diff is too big to show here.
searx/static/themes/oscar/css/pointhi.min.css.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.eotnew file
Binary file not shown.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.svgnew file+288
This diff is too big to show here.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.ttfnew file
Binary file not shown.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woffnew file
Binary file not shown.
searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woff2new file
Binary file not shown.
searx/static/themes/oscar/gruntfile.js+87−29
This diff is too big to show here.
searx/static/themes/oscar/img/icons/bandcamp.pngnew file
Binary file not shown.
searx/static/themes/oscar/img/map/layers-2x.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/layers.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x-green.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x-orange.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x-red.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-2x.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-green.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-orange.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon-red.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-icon.pngdeleted
Binary file not shown.
searx/static/themes/oscar/img/map/marker-shadow.pngdeleted
Binary file not shown.
searx/static/themes/oscar/js/bootstrap.bundle.min.jsnew file+7
This diff is too big to show here.
searx/static/themes/oscar/js/bootstrap.min.jsnew file+6
This diff is too big to show here.
searx/static/themes/oscar/js/jquery.min.jsnew file+2
This diff is too big to show here.
searx/static/themes/oscar/js/leaflet-0.7.3.min.jsdeleted−9
This diff is too big to show here.
searx/static/themes/oscar/js/leaflet.jsnew file+6
This diff is too big to show here.
searx/static/themes/oscar/js/searx.js+254−158
This diff is too big to show here.
searx/static/themes/oscar/js/searx.min.js+4−2
This diff is too big to show here.
searx/static/themes/oscar/js/searx.min.js.mapnew file+1
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/00_requirejs_config.jsdeleted−23
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/leaflet_map.jsdeleted−167
This diff is too big to show here.
searx/static/themes/oscar/js/typeahead.bundle.min.jsnew file+9
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/code.lessdeleted−101
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/infobox.lessdeleted−37
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/preferences.lessdeleted−3
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/code.lessdeleted−79
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/infobox.lessdeleted−11
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/preferences.lessdeleted−3
This diff is too big to show here.
searx/static/themes/oscar/package.json+12−7
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/01_init.js → searx/static/themes/oscar/src/js/01_init.jsrenamed+5−1
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/autocompleter.js → searx/static/themes/oscar/src/js/autocompleter.jsrenamed+24−13
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/element_modifiers.js → searx/static/themes/oscar/src/js/element_modifiers.jsrenamed+18
This diff is too big to show here.
searx/static/themes/oscar/src/js/infobox.jsnew file+11
This diff is too big to show here.
searx/static/themes/oscar/src/js/leaflet_map.jsnew file+79
This diff is too big to show here.
searx/static/themes/oscar/js/searx_src/toggleall.js → searx/static/themes/oscar/src/js/toggleall.jsrenamed
The content is the same.
searx/static/themes/oscar/src/less/bootstrap/bootstrap.lessnew file+3
This diff is too big to show here.
searx/static/themes/oscar/src/less/bootstrap/typeahead.lessnew file+154
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev-dark/oscar.less → searx/static/themes/oscar/src/less/logicodev-dark/oscar.lessrenamed+16−4
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/advanced.less → searx/static/themes/oscar/src/less/logicodev/advanced.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/checkbox.less → searx/static/themes/oscar/src/less/logicodev/checkbox.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/logicodev/code.lessnew file+14
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/cursor.less → searx/static/themes/oscar/src/less/logicodev/cursor.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/footer.less → searx/static/themes/oscar/src/less/logicodev/footer.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/logicodev/infobox.lessnew file+92
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/navbar.less → searx/static/themes/oscar/src/less/logicodev/navbar.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/onoff.less → searx/static/themes/oscar/src/less/logicodev/onoff.lessrenamed
The content is the same.
searx/static/themes/oscar/less/logicodev/oscar.less → searx/static/themes/oscar/src/less/logicodev/oscar.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/logicodev/preferences.lessnew file+31
This diff is too big to show here.
searx/static/themes/oscar/src/less/logicodev/pygments.lessnew file+99
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/results.less → searx/static/themes/oscar/src/less/logicodev/results.lessrenamed+82−8
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/search.less → searx/static/themes/oscar/src/less/logicodev/search.lessrenamed+23−15
This diff is too big to show here.
searx/static/themes/oscar/less/logicodev/variables.less → searx/static/themes/oscar/src/less/logicodev/variables.lessrenamed+6−3
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/advanced.less → searx/static/themes/oscar/src/less/pointhi/advanced.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/checkbox.less → searx/static/themes/oscar/src/less/pointhi/checkbox.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/pointhi/code.lessnew file+2
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/cursor.less → searx/static/themes/oscar/src/less/pointhi/cursor.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/footer.less → searx/static/themes/oscar/src/less/pointhi/footer.lessrenamed
The content is the same.
searx/static/themes/oscar/src/less/pointhi/infobox.lessnew file+62
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/navbar.less → searx/static/themes/oscar/src/less/pointhi/navbar.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/onoff.less → searx/static/themes/oscar/src/less/pointhi/onoff.lessrenamed
The content is the same.
searx/static/themes/oscar/less/pointhi/oscar.less → searx/static/themes/oscar/src/less/pointhi/oscar.lessrenamed+2
This diff is too big to show here.
searx/static/themes/oscar/src/less/pointhi/preferences.lessnew file+19
This diff is too big to show here.
searx/static/themes/oscar/src/less/pointhi/pygments.lessnew file+99
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/results.less → searx/static/themes/oscar/src/less/pointhi/results.lessrenamed+4
This diff is too big to show here.
searx/static/themes/oscar/less/pointhi/search.less → searx/static/themes/oscar/src/less/pointhi/search.lessrenamed+10
This diff is too big to show here.
searx/static/themes/pix-art/css/style.cssdeleted−1
This diff is too big to show here.
searx/static/themes/pix-art/img/favicon.pngdeleted
Binary file not shown.
searx/static/themes/pix-art/img/preference-icon-pixel.pngdeleted
Binary file not shown.
searx/static/themes/pix-art/img/search-icon-pixel.pngdeleted
Binary file not shown.
searx/static/themes/pix-art/img/searx-pixel-small.pngdeleted
Binary file not shown.
searx/static/themes/pix-art/img/searx-pixel.pngdeleted
Binary file not shown.
searx/static/themes/pix-art/js/searx.jsdeleted−141
This diff is too big to show here.
searx/static/themes/pix-art/less/definitions.lessdeleted−119
This diff is too big to show here.
searx/static/themes/pix-art/less/mixins.lessdeleted−27
This diff is too big to show here.
searx/static/themes/pix-art/less/search.lessdeleted−57
This diff is too big to show here.
searx/static/themes/pix-art/less/style.lessdeleted−451
This diff is too big to show here.
searx/static/themes/simple/css/searx-rtl.css+164−83
This diff is too big to show here.
searx/static/themes/simple/css/searx-rtl.min.css+1−1
This diff is too big to show here.
searx/static/themes/simple/css/searx.css+164−83
This diff is too big to show here.
searx/static/themes/simple/css/searx.min.css+1−1
This diff is too big to show here.
searx/static/themes/simple/gruntfile.js+2−2
This diff is too big to show here.
searx/static/themes/simple/js/searx.head.js+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx.head.min.js+2−2
This diff is too big to show here.
searx/static/themes/simple/js/searx.head.min.js.map+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx.js+169−240
This diff is too big to show here.
searx/static/themes/simple/js/searx.min.js+5−4
This diff is too big to show here.
searx/static/themes/simple/js/searx.min.js.map+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx_head/00_init.js+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_mapresult.js−87
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_results.js+1−1
This diff is too big to show here.
searx/static/themes/simple/js/searx_src/searx_search.js+5−1
This diff is too big to show here.
searx/static/themes/simple/less/code.less+5−80
This diff is too big to show here.
searx/static/themes/simple/less/preferences.less+17
This diff is too big to show here.
searx/static/themes/simple/less/pygments.lessnew file+99
This diff is too big to show here.
searx/static/themes/simple/less/style.less+32
This diff is too big to show here.
searx/templates/__common__/about.html+12−11
This diff is too big to show here.
searx/templates/__common__/opensearch.xml+8−4
This diff is too big to show here.
searx/templates/__common__/opensearch_response_rss.xml+2−2
This diff is too big to show here.
searx/templates/__common__/translations.js.tpldeleted−1
This diff is too big to show here.
searx/templates/courgette/404.htmldeleted−9
This diff is too big to show here.
searx/templates/courgette/about.htmldeleted−5
This diff is too big to show here.
searx/templates/courgette/base.htmldeleted−43
This diff is too big to show here.
searx/templates/courgette/categories.htmldeleted−9
This diff is too big to show here.
searx/templates/courgette/color.cssdeleted−34
This diff is too big to show here.
searx/templates/courgette/github_ribbon.htmldeleted−3
This diff is too big to show here.
searx/templates/courgette/index.htmldeleted−17
This diff is too big to show here.
searx/templates/courgette/preferences.htmldeleted−134
This diff is too big to show here.
searx/templates/courgette/result_templates/code.htmldeleted−11
This diff is too big to show here.
searx/templates/courgette/result_templates/default.htmldeleted−13
This diff is too big to show here.
searx/templates/courgette/result_templates/images.htmldeleted−6
This diff is too big to show here.
searx/templates/courgette/result_templates/key-value.htmldeleted−13
This diff is too big to show here.
searx/templates/courgette/result_templates/map.htmldeleted−13
This diff is too big to show here.
searx/templates/courgette/result_templates/torrent.htmldeleted−13
This diff is too big to show here.
searx/templates/courgette/result_templates/videos.htmldeleted−10
This diff is too big to show here.
searx/templates/courgette/results.htmldeleted−87
This diff is too big to show here.
searx/templates/courgette/search.htmldeleted−7
This diff is too big to show here.
searx/templates/courgette/stats.htmldeleted−22
This diff is too big to show here.
searx/templates/legacy/404.htmldeleted−9
This diff is too big to show here.
searx/templates/legacy/about.htmldeleted−5
This diff is too big to show here.
searx/templates/legacy/base.htmldeleted−38
This diff is too big to show here.
searx/templates/legacy/categories.htmldeleted−10
This diff is too big to show here.
searx/templates/legacy/github_ribbon.htmldeleted−3
This diff is too big to show here.
searx/templates/legacy/index.htmldeleted−18
This diff is too big to show here.
searx/templates/legacy/infobox.htmldeleted−51
This diff is too big to show here.
searx/templates/legacy/preferences.htmldeleted−131
This diff is too big to show here.
searx/templates/legacy/result_templates/code.htmldeleted−11
This diff is too big to show here.
searx/templates/legacy/result_templates/default.htmldeleted−6
This diff is too big to show here.
searx/templates/legacy/result_templates/images.htmldeleted−6
This diff is too big to show here.
searx/templates/legacy/result_templates/key-value.htmldeleted−13
This diff is too big to show here.
searx/templates/legacy/result_templates/map.htmldeleted−13
This diff is too big to show here.
searx/templates/legacy/result_templates/torrent.htmldeleted−13
This diff is too big to show here.
searx/templates/legacy/result_templates/videos.htmldeleted−6
This diff is too big to show here.
searx/templates/legacy/results.htmldeleted−104
This diff is too big to show here.
searx/templates/legacy/search.htmldeleted−8
This diff is too big to show here.
searx/templates/legacy/stats.htmldeleted−22
This diff is too big to show here.
searx/templates/oscar/404.html+1−1
This diff is too big to show here.
searx/templates/oscar/base.html+15−16
This diff is too big to show here.
searx/templates/oscar/index.html+7−8
This diff is too big to show here.
searx/templates/oscar/infobox.html+16−8
This diff is too big to show here.
searx/templates/oscar/languages.html+2−1
This diff is too big to show here.
searx/templates/oscar/macros.html+78−40
This diff is too big to show here.
searx/templates/oscar/messages/no_results.html+1−1
This diff is too big to show here.
searx/templates/oscar/preferences.html+92−39
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.htmlnew file+55
This diff is too big to show here.
searx/templates/oscar/result_templates/key-value.html+3−3
This diff is too big to show here.
searx/templates/oscar/result_templates/map.html+60−56
This diff is too big to show here.
searx/templates/oscar/result_templates/products.htmlnew file+23
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+40−15
This diff is too big to show here.
searx/templates/oscar/search.html+2−2
This diff is too big to show here.
searx/templates/oscar/search_full.html+1−1
This diff is too big to show here.
searx/templates/oscar/time-range.html+2−1
This diff is too big to show here.
searx/templates/pix-art/404.htmldeleted−9
This diff is too big to show here.
searx/templates/pix-art/about.htmldeleted−4
This diff is too big to show here.
searx/templates/pix-art/base.htmldeleted−35
This diff is too big to show here.
searx/templates/pix-art/index.htmldeleted−12
This diff is too big to show here.
searx/templates/pix-art/preferences.htmldeleted−82
This diff is too big to show here.
searx/templates/pix-art/result_templates/default.htmldeleted−7
This diff is too big to show here.
searx/templates/pix-art/result_templates/images.htmldeleted−6
This diff is too big to show here.
searx/templates/pix-art/results.htmldeleted−32
This diff is too big to show here.
searx/templates/pix-art/search.htmldeleted−9
This diff is too big to show here.
searx/templates/pix-art/stats.htmldeleted−22
This diff is too big to show here.
searx/templates/simple/404.html+1−1
This diff is too big to show here.
searx/templates/simple/base.html+6−6
This diff is too big to show here.
searx/templates/simple/infobox.html+1−2
This diff is too big to show here.
searx/templates/simple/macros.html+2−2
This diff is too big to show here.
searx/templates/simple/messages/no_results.html+1−1
This diff is too big to show here.
searx/templates/simple/preferences.html+34−3
This diff is too big to show here.
searx/templates/simple/result_templates/map.html+35−52
This diff is too big to show here.
searx/templates/simple/results.html+16−7
This diff is too big to show here.
searx/templates/simple/search.html+1−1
This diff is too big to show here.
This diff is too big to show here.
searx/translations/ar/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/ar/LC_MESSAGES/messages.po+308−224
This diff is too big to show here.
searx/translations/bg/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/bg/LC_MESSAGES/messages.po+306−222
This diff is too big to show here.
searx/translations/bo/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/bo/LC_MESSAGES/messages.po+325−240
This diff is too big to show here.
searx/translations/ca/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/ca/LC_MESSAGES/messages.po+308−224
This diff is too big to show here.
searx/translations/cs/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/cs/LC_MESSAGES/messages.po+383−297
This diff is too big to show here.
searx/translations/cy/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/cy/LC_MESSAGES/messages.po+306−222
This diff is too big to show here.
searx/translations/da/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/da/LC_MESSAGES/messages.po+308−224
This diff is too big to show here.
searx/translations/de/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/de/LC_MESSAGES/messages.po+310−224
This diff is too big to show here.
searx/translations/el_GR/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/el_GR/LC_MESSAGES/messages.po+306−222
This diff is too big to show here.
searx/translations/en/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/eo/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/eo/LC_MESSAGES/messages.po+310−226
This diff is too big to show here.
searx/translations/es/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/es/LC_MESSAGES/messages.po+313−228
This diff is too big to show here.
searx/translations/et/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/et/LC_MESSAGES/messages.po+322−237
This diff is too big to show here.
searx/translations/eu/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/eu/LC_MESSAGES/messages.po+310−225
This diff is too big to show here.
searx/translations/fa_IR/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fa_IR/LC_MESSAGES/messages.po+311−226
This diff is too big to show here.
searx/translations/fi/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fi/LC_MESSAGES/messages.po+307−223
This diff is too big to show here.
searx/translations/fil/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fil/LC_MESSAGES/messages.po+308−224
This diff is too big to show here.
searx/translations/fr/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/fr/LC_MESSAGES/messages.po+310−226
This diff is too big to show here.
searx/translations/gl/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/gl/LC_MESSAGES/messages.po+342−257
This diff is too big to show here.
searx/translations/he/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/he/LC_MESSAGES/messages.po+311−226
This diff is too big to show here.
searx/translations/hr/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/hr/LC_MESSAGES/messages.po+313−228
This diff is too big to show here.
searx/translations/hu/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/hu/LC_MESSAGES/messages.po+308−224
This diff is too big to show here.
searx/translations/ia/LC_MESSAGES/messages.mo
Binary file not shown.
searx/translations/ia/LC_MESSAGES/messages.po+308−224
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+311−227
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/ja/LC_MESSAGES/messages.po+308−224
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+308−224
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+309−224
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+309−224
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/oc/LC_MESSAGES/messages.po+309−225
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/LC_MESSAGES/messages.po+308−224
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+309−224
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/ro/LC_MESSAGES/messages.po+308−224
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+311−226
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/sk/LC_MESSAGES/messages.po+308−224
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/sl/LC_MESSAGES/messages.po+307−223
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+313−228
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+311−227
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/ta/LC_MESSAGES/messages.po+306−222
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/te/LC_MESSAGES/messages.po+306−222
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+416−331
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/uk/LC_MESSAGES/messages.po+308−224
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/vi/LC_MESSAGES/messages.po+308−224
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+310−225
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+309−224
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
searx_extra/google_search.py
This diff is too big to show here.
searx_extra/standalone_searx.py+217
This diff is too big to show here.
searx_extra/update/__init__.py
This diff is too big to show here.
searx_extra/update/update_ahmia_blacklist.py+30
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_firefox_version.py+2−7
This diff is too big to show here.
searx_extra/update/update_languages.py+205
This diff is too big to show here.
searx_extra/update/update_osm_keys_tags.py+209
This diff is too big to show here.
searx_extra/update/update_pygments.py+138
This diff is too big to show here.
searx_extra/update/update_translations.sh
This diff is too big to show here.
searx_extra/update/update_wikidata_units.py+54
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
tests/unit/engines/test_command.py+240
This diff is too big to show here.
tests/unit/engines/test_xpath.py+121
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/settings/empty_settings.yml
This diff is too big to show here.
tests/unit/settings/syntaxerror_settings.yml+2
This diff is too big to show here.
tests/unit/settings/user_settings.yml+111
This diff is too big to show here.
tests/unit/settings/user_settings_keep_only.yml+14
This diff is too big to show here.
tests/unit/settings/user_settings_remove.yml+10
This diff is too big to show here.
tests/unit/settings/user_settings_remove2.yml+15
This diff is too big to show here.
tests/unit/settings/user_settings_simple.yml+9
This diff is too big to show here.
tests/unit/test_answerers.py+2−2
This diff is too big to show here.
tests/unit/test_engines_init.py+44
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_plugins.py+64−10
This diff is too big to show here.
tests/unit/test_preferences.py+25−29
This diff is too big to show here.
tests/unit/test_query.py+219−35
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_search.py+45−57
This diff is too big to show here.
tests/unit/test_settings_loader.py+122
This diff is too big to show here.
tests/unit/test_standalone_searx.py+111
This diff is too big to show here.
tests/unit/test_utils.py+145−68
This diff is too big to show here.
tests/unit/test_webadapter.py+54
This diff is too big to show here.
tests/unit/test_webapp.py+81−13
This diff is too big to show here.
tests/unit/test_webutils.py+87
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
utils/fetch_currencies.py−163
This diff is too big to show here.
utils/fetch_languages.py−194
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
utils/makefile.include+12−51
This diff is too big to show here.
This diff is too big to show here.
utils/makefile.python−263
This diff is too big to show here.
utils/makefile.sphinx−220
This diff is too big to show here.
This diff is too big to show here.
This diff is too big to show here.
utils/site-python/sphinx_build_tools.py−48
This diff is too big to show here.
utils/standalone_searx.py−104
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/searx/use_default_settings.yml+22
This diff is too big to show here.
utils/templates/etc/uwsgi/apps-archlinux/searx.ini+9−1
This diff is too big to show here.
utils/templates/etc/uwsgi/apps-archlinux/searx.ini:socket+5
This diff is too big to show here.
utils/templates/etc/uwsgi/apps-available/searx.ini+10−2
This diff is too big to show here.
utils/templates/etc/uwsgi/apps-available/searx.ini:socket+5
This diff is too big to show here.