summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml5
-rw-r--r--AUTHORS.rst14
-rw-r--r--CHANGELOG.rst36
-rwxr-xr-xmanage.sh4
-rw-r--r--requirements-dev.txt6
-rw-r--r--requirements.txt4
-rw-r--r--searx/__init__.py21
-rw-r--r--searx/answerers/__init__.py46
-rw-r--r--searx/answerers/random/answerer.py50
-rw-r--r--searx/answerers/statistics/answerer.py51
-rw-r--r--searx/engines/__init__.py98
-rw-r--r--searx/engines/archlinux.py3
-rwxr-xr-xsearx/engines/base.py3
-rw-r--r--searx/engines/bing.py17
-rw-r--r--searx/engines/bing_images.py8
-rw-r--r--searx/engines/bing_news.py27
-rw-r--r--searx/engines/btdigg.py21
-rw-r--r--searx/engines/dailymotion.py3
-rw-r--r--searx/engines/deezer.py9
-rw-r--r--searx/engines/deviantart.py3
-rw-r--r--searx/engines/dictzone.py68
-rw-r--r--searx/engines/digbt.py58
-rw-r--r--searx/engines/digg.py3
-rw-r--r--searx/engines/duckduckgo.py3
-rw-r--r--searx/engines/fdroid.py3
-rw-r--r--searx/engines/flickr.py14
-rw-r--r--searx/engines/flickr_noapi.py25
-rw-r--r--searx/engines/gigablast.py5
-rw-r--r--searx/engines/github.py3
-rw-r--r--searx/engines/google.py8
-rw-r--r--searx/engines/google_images.py10
-rw-r--r--searx/engines/google_news.py83
-rw-r--r--searx/engines/json_engine.py2
-rw-r--r--searx/engines/kickass.py49
-rw-r--r--searx/engines/nyaa.py6
-rw-r--r--searx/engines/openstreetmap.py2
-rw-r--r--searx/engines/pdbe.py109
-rw-r--r--searx/engines/piratebay.py3
-rw-r--r--searx/engines/qwant.py10
-rw-r--r--searx/engines/reddit.py3
-rw-r--r--searx/engines/searchcode_code.py5
-rw-r--r--searx/engines/searchcode_doc.py17
-rw-r--r--searx/engines/seedpeer.py77
-rw-r--r--searx/engines/spotify.py9
-rw-r--r--searx/engines/stackoverflow.py5
-rw-r--r--searx/engines/startpage.py5
-rw-r--r--searx/engines/subtitleseeker.py5
-rw-r--r--searx/engines/swisscows.py9
-rw-r--r--searx/engines/tokyotoshokan.py1
-rw-r--r--searx/engines/torrentz.py1
-rw-r--r--searx/engines/translated.py64
-rw-r--r--searx/engines/vimeo.py32
-rw-r--r--searx/engines/wolframalpha_api.py16
-rw-r--r--searx/engines/wolframalpha_noapi.py15
-rw-r--r--searx/engines/www500px.py42
-rw-r--r--searx/engines/xpath.py2
-rw-r--r--searx/engines/yacy.py4
-rw-r--r--searx/engines/yahoo.py3
-rw-r--r--searx/engines/yandex.py9
-rw-r--r--searx/engines/youtube_noapi.py8
-rw-r--r--searx/plugins/doai_rewrite.py8
-rw-r--r--searx/plugins/https_rewrite.py3
-rw-r--r--searx/plugins/self_info.py16
-rw-r--r--searx/plugins/tracker_url_remover.py10
-rw-r--r--searx/preferences.py34
-rw-r--r--searx/query.py20
-rw-r--r--searx/results.py26
-rw-r--r--searx/search.py501
-rw-r--r--searx/settings.yml114
-rw-r--r--searx/settings_robot.yml7
-rw-r--r--searx/static/plugins/js/infinite_scroll.js2
-rw-r--r--searx/static/themes/legacy/css/style-rtl.css (renamed from searx/static/themes/default/css/style-rtl.css)0
-rw-r--r--searx/static/themes/legacy/css/style.css (renamed from searx/static/themes/default/css/style.css)0
-rw-r--r--searx/static/themes/legacy/img/favicon.png (renamed from searx/static/themes/default/img/favicon.png)bin2060 -> 2060 bytes
-rw-r--r--searx/static/themes/legacy/img/github_ribbon.png (renamed from searx/static/themes/default/img/github_ribbon.png)bin5213 -> 5213 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_500px.ico (renamed from searx/static/themes/default/img/icons/icon_500px.ico)bin8348 -> 8348 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_bing.ico (renamed from searx/static/themes/default/img/icons/icon_bing.ico)bin1150 -> 1150 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_dailymotion.ico (renamed from searx/static/themes/default/img/icons/icon_dailymotion.ico)bin4286 -> 4286 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_deezer.ico (renamed from searx/static/themes/default/img/icons/icon_deezer.ico)bin4286 -> 4286 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_deviantart.ico (renamed from searx/static/themes/default/img/icons/icon_deviantart.ico)bin4286 -> 4286 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_digg.ico (renamed from searx/static/themes/default/img/icons/icon_digg.ico)bin2868 -> 2868 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_duckduckgo.ico (renamed from searx/static/themes/default/img/icons/icon_duckduckgo.ico)bin32988 -> 32988 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_flickr.ico (renamed from searx/static/themes/default/img/icons/icon_flickr.ico)bin6518 -> 6518 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_github.ico (renamed from searx/static/themes/default/img/icons/icon_github.ico)bin6518 -> 6518 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_google play apps.ico (renamed from searx/static/themes/default/img/icons/icon_google play apps.ico)bin5430 -> 5430 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_google play movies.ico (renamed from searx/static/themes/default/img/icons/icon_google play movies.ico)bin5430 -> 5430 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_google play music.ico (renamed from searx/static/themes/default/img/icons/icon_google play music.ico)bin5430 -> 5430 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_google.ico (renamed from searx/static/themes/default/img/icons/icon_google.ico)bin5430 -> 5430 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_kickass.ico (renamed from searx/static/themes/default/img/icons/icon_kickass.ico)bin1150 -> 1150 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_openstreetmap.ico (renamed from searx/static/themes/default/img/icons/icon_openstreetmap.ico)bin1406 -> 1406 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_searchcode code.ico (renamed from searx/static/themes/default/img/icons/icon_searchcode code.ico)bin4094 -> 4094 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_searchcode doc.ico (renamed from searx/static/themes/default/img/icons/icon_searchcode doc.ico)bin4094 -> 4094 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_searchcode.ico (renamed from searx/static/themes/default/img/icons/icon_searchcode.ico)bin4094 -> 4094 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_soundcloud.ico (renamed from searx/static/themes/default/img/icons/icon_soundcloud.ico)bin1150 -> 1150 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_stackoverflow.ico (renamed from searx/static/themes/default/img/icons/icon_stackoverflow.ico)bin1150 -> 1150 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_startpage.ico (renamed from searx/static/themes/default/img/icons/icon_startpage.ico)bin1150 -> 1150 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_subtitleseeker.ico (renamed from searx/static/themes/default/img/icons/icon_subtitleseeker.ico)bin1406 -> 1406 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_twitter.ico (renamed from searx/static/themes/default/img/icons/icon_twitter.ico)bin1150 -> 1150 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_vimeo.ico (renamed from searx/static/themes/default/img/icons/icon_vimeo.ico)bin6518 -> 6518 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_wikipedia.ico (renamed from searx/static/themes/default/img/icons/icon_wikipedia.ico)bin2734 -> 2734 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_yahoo.ico (renamed from searx/static/themes/default/img/icons/icon_yahoo.ico)bin5430 -> 5430 bytes
-rw-r--r--searx/static/themes/legacy/img/icons/icon_youtube.ico (renamed from searx/static/themes/default/img/icons/icon_youtube.ico)bin1150 -> 1150 bytes
-rw-r--r--searx/static/themes/legacy/img/preference-icon.png (renamed from searx/static/themes/default/img/preference-icon.png)bin532 -> 532 bytes
-rw-r--r--searx/static/themes/legacy/img/search-icon.png (renamed from searx/static/themes/default/img/search-icon.png)bin2329 -> 2329 bytes
-rw-r--r--searx/static/themes/legacy/img/searx.png (renamed from searx/static/themes/default/img/searx.png)bin3902 -> 3902 bytes
-rw-r--r--searx/static/themes/legacy/img/searx_logo.svg (renamed from searx/static/themes/default/img/searx_logo.svg)0
-rw-r--r--searx/static/themes/legacy/js/searx.js (renamed from searx/static/themes/default/js/searx.js)0
-rw-r--r--searx/static/themes/legacy/less/autocompleter.less (renamed from searx/static/themes/default/less/autocompleter.less)0
-rw-r--r--searx/static/themes/legacy/less/code.less (renamed from searx/static/themes/default/less/code.less)0
-rw-r--r--searx/static/themes/legacy/less/definitions.less (renamed from searx/static/themes/default/less/definitions.less)0
-rw-r--r--searx/static/themes/legacy/less/mixins.less (renamed from searx/static/themes/default/less/mixins.less)0
-rw-r--r--searx/static/themes/legacy/less/search.less (renamed from searx/static/themes/default/less/search.less)0
-rw-r--r--searx/static/themes/legacy/less/style-rtl.less (renamed from searx/static/themes/default/less/style-rtl.less)0
-rw-r--r--searx/static/themes/legacy/less/style.less (renamed from searx/static/themes/default/less/style.less)0
-rw-r--r--searx/static/themes/oscar/css/logicodev.min.css2
-rw-r--r--searx/static/themes/oscar/css/pointhi.min.css2
-rw-r--r--searx/static/themes/oscar/less/logicodev/navbar.less37
-rw-r--r--searx/static/themes/oscar/less/logicodev/results.less25
-rw-r--r--searx/static/themes/oscar/less/pointhi/navbar.less28
-rw-r--r--searx/static/themes/oscar/less/pointhi/oscar.less2
-rw-r--r--searx/static/themes/oscar/less/pointhi/results.less22
-rw-r--r--searx/templates/courgette/404.html9
-rw-r--r--searx/templates/courgette/about.html14
-rw-r--r--searx/templates/courgette/base.html4
-rw-r--r--searx/templates/courgette/opensearch_response_rss.xml8
-rw-r--r--searx/templates/courgette/result_templates/code.html4
-rw-r--r--searx/templates/courgette/result_templates/default.html2
-rw-r--r--searx/templates/courgette/result_templates/images.html4
-rw-r--r--searx/templates/courgette/result_templates/map.html2
-rw-r--r--searx/templates/courgette/result_templates/torrent.html4
-rw-r--r--searx/templates/courgette/result_templates/videos.html4
-rw-r--r--searx/templates/courgette/results.html10
-rw-r--r--searx/templates/default/result_templates/images.html6
-rw-r--r--searx/templates/legacy/404.html9
-rw-r--r--searx/templates/legacy/about.html (renamed from searx/templates/default/about.html)18
-rw-r--r--searx/templates/legacy/base.html (renamed from searx/templates/default/base.html)4
-rw-r--r--searx/templates/legacy/categories.html (renamed from searx/templates/default/categories.html)0
-rw-r--r--searx/templates/legacy/github_ribbon.html (renamed from searx/templates/default/github_ribbon.html)0
-rw-r--r--searx/templates/legacy/index.html (renamed from searx/templates/default/index.html)6
-rw-r--r--searx/templates/legacy/infobox.html (renamed from searx/templates/default/infobox.html)2
-rw-r--r--searx/templates/legacy/opensearch.xml (renamed from searx/templates/default/opensearch.xml)0
-rw-r--r--searx/templates/legacy/opensearch_response_rss.xml (renamed from searx/templates/default/opensearch_response_rss.xml)8
-rw-r--r--searx/templates/legacy/preferences.html (renamed from searx/templates/default/preferences.html)13
-rw-r--r--searx/templates/legacy/result_templates/code.html (renamed from searx/templates/default/result_templates/code.html)6
-rw-r--r--searx/templates/legacy/result_templates/default.html (renamed from searx/templates/default/result_templates/default.html)4
-rw-r--r--searx/templates/legacy/result_templates/images.html6
-rw-r--r--searx/templates/legacy/result_templates/map.html (renamed from searx/templates/default/result_templates/map.html)4
-rw-r--r--searx/templates/legacy/result_templates/torrent.html (renamed from searx/templates/default/result_templates/torrent.html)4
-rw-r--r--searx/templates/legacy/result_templates/videos.html (renamed from searx/templates/default/result_templates/videos.html)4
-rw-r--r--searx/templates/legacy/results.html (renamed from searx/templates/default/results.html)20
-rw-r--r--searx/templates/legacy/search.html (renamed from searx/templates/default/search.html)2
-rw-r--r--searx/templates/legacy/stats.html (renamed from searx/templates/default/stats.html)2
-rw-r--r--searx/templates/oscar/404.html9
-rw-r--r--searx/templates/oscar/about.html15
-rw-r--r--searx/templates/oscar/base.html24
-rw-r--r--searx/templates/oscar/categories.html1
-rw-r--r--searx/templates/oscar/infobox.html3
-rw-r--r--searx/templates/oscar/macros.html22
-rw-r--r--searx/templates/oscar/messages/js_disabled.html4
-rw-r--r--searx/templates/oscar/navbar.html40
-rw-r--r--searx/templates/oscar/opensearch_response_rss.xml8
-rw-r--r--searx/templates/oscar/preferences.html45
-rw-r--r--searx/templates/oscar/result_templates/code.html2
-rw-r--r--searx/templates/oscar/result_templates/default.html2
-rw-r--r--searx/templates/oscar/result_templates/images.html23
-rw-r--r--searx/templates/oscar/result_templates/videos.html2
-rw-r--r--searx/templates/oscar/results.html14
-rw-r--r--searx/templates/oscar/time-range.html3
-rw-r--r--searx/templates/pix-art/404.html9
-rw-r--r--searx/templates/pix-art/about.html14
-rw-r--r--searx/templates/pix-art/base.html2
-rw-r--r--searx/templates/pix-art/index.html2
-rw-r--r--searx/templates/pix-art/preferences.html2
-rw-r--r--searx/templates/pix-art/results.html8
-rw-r--r--searx/templates/pix-art/stats.html2
-rw-r--r--searx/translations/bg/LC_MESSAGES/messages.mobin9643 -> 11184 bytes
-rw-r--r--searx/translations/bg/LC_MESSAGES/messages.po259
-rw-r--r--searx/translations/de/LC_MESSAGES/messages.mobin8110 -> 9872 bytes
-rw-r--r--searx/translations/de/LC_MESSAGES/messages.po244
-rw-r--r--searx/translations/el_GR/LC_MESSAGES/messages.mobin8297 -> 9826 bytes
-rw-r--r--searx/translations/el_GR/LC_MESSAGES/messages.po246
-rw-r--r--searx/translations/en/LC_MESSAGES/messages.mobin7565 -> 7565 bytes
-rw-r--r--searx/translations/eo/LC_MESSAGES/messages.mobin7653 -> 9259 bytes
-rw-r--r--searx/translations/eo/LC_MESSAGES/messages.po264
-rw-r--r--searx/translations/es/LC_MESSAGES/messages.mobin8193 -> 9916 bytes
-rw-r--r--searx/translations/es/LC_MESSAGES/messages.po256
-rw-r--r--searx/translations/fr/LC_MESSAGES/messages.mobin8328 -> 10168 bytes
-rw-r--r--searx/translations/fr/LC_MESSAGES/messages.po246
-rw-r--r--searx/translations/he/LC_MESSAGES/messages.mobin8728 -> 10743 bytes
-rw-r--r--searx/translations/he/LC_MESSAGES/messages.po268
-rw-r--r--searx/translations/hu/LC_MESSAGES/messages.mobin7878 -> 9624 bytes
-rw-r--r--searx/translations/hu/LC_MESSAGES/messages.po251
-rw-r--r--searx/translations/it/LC_MESSAGES/messages.mobin7751 -> 9344 bytes
-rw-r--r--searx/translations/it/LC_MESSAGES/messages.po242
-rw-r--r--searx/translations/ja/LC_MESSAGES/messages.mobin9052 -> 10784 bytes
-rw-r--r--searx/translations/ja/LC_MESSAGES/messages.po247
-rw-r--r--searx/translations/nl/LC_MESSAGES/messages.mobin7918 -> 9592 bytes
-rw-r--r--searx/translations/nl/LC_MESSAGES/messages.po246
-rw-r--r--searx/translations/pt/LC_MESSAGES/messages.mobin7931 -> 7931 bytes
-rw-r--r--searx/translations/pt_BR/LC_MESSAGES/messages.mobin8064 -> 9647 bytes
-rw-r--r--searx/translations/pt_BR/LC_MESSAGES/messages.po246
-rw-r--r--searx/translations/ro/LC_MESSAGES/messages.mobin8156 -> 9734 bytes
-rw-r--r--searx/translations/ro/LC_MESSAGES/messages.po246
-rw-r--r--searx/translations/ru/LC_MESSAGES/messages.mobin9537 -> 11450 bytes
-rw-r--r--searx/translations/ru/LC_MESSAGES/messages.po299
-rw-r--r--searx/translations/tr/LC_MESSAGES/messages.mobin8075 -> 9645 bytes
-rw-r--r--searx/translations/tr/LC_MESSAGES/messages.po250
-rw-r--r--searx/translations/zh_CN/LC_MESSAGES/messages.mobin7465 -> 8986 bytes
-rw-r--r--searx/translations/zh_CN/LC_MESSAGES/messages.po260
-rw-r--r--searx/utils.py61
-rw-r--r--searx/version.py2
-rw-r--r--searx/webapp.py186
-rw-r--r--tests/robot/test_basic.robot59
-rw-r--r--tests/unit/engines/seedpeer_fixture.html110
-rw-r--r--tests/unit/engines/test_bing.py6
-rw-r--r--tests/unit/engines/test_bing_images.py1
-rw-r--r--tests/unit/engines/test_bing_news.py8
-rw-r--r--tests/unit/engines/test_deezer.py2
-rw-r--r--tests/unit/engines/test_deviantart.py9
-rw-r--r--tests/unit/engines/test_digbt.py61
-rw-r--r--tests/unit/engines/test_duckduckgo.py7
-rw-r--r--tests/unit/engines/test_flickr.py6
-rw-r--r--tests/unit/engines/test_flickr_noapi.py7
-rw-r--r--tests/unit/engines/test_google_news.py110
-rw-r--r--tests/unit/engines/test_kickass.py30
-rw-r--r--tests/unit/engines/test_pdbe.py109
-rw-r--r--tests/unit/engines/test_searchcode_doc.py3
-rw-r--r--tests/unit/engines/test_seedpeer.py51
-rw-r--r--tests/unit/engines/test_spotify.py2
-rw-r--r--tests/unit/engines/test_vimeo.py79
-rw-r--r--tests/unit/engines/test_wolframalpha_api.py6
-rw-r--r--tests/unit/engines/test_wolframalpha_noapi.py6
-rw-r--r--tests/unit/engines/test_www500px.py63
-rw-r--r--tests/unit/engines/test_yahoo.py7
-rw-r--r--tests/unit/engines/test_youtube_noapi.py20
-rw-r--r--tests/unit/test_answerers.py16
-rw-r--r--tests/unit/test_plugins.py45
-rw-r--r--tests/unit/test_webapp.py7
238 files changed, 5192 insertions, 2480 deletions
diff --git a/.travis.yml b/.travis.yml
index 65f8ef235..0a174ff66 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,6 +4,8 @@ cache:
- npm
- directories:
- $HOME/.cache/pip
+addons:
+ firefox: "latest"
language: python
python:
- "2.7"
@@ -12,6 +14,9 @@ before_install:
- "sh -e /etc/init.d/xvfb start"
- npm install less grunt-cli
- ( cd searx/static/themes/oscar;npm install; cd - )
+ - mkdir -p ~/drivers; export PATH=~/drivers:$PATH;
+ - GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/v0.11.1/geckodriver-v0.11.1-linux64.tar.gz";
+ - FILE=`mktemp`; wget "$GECKODRIVER_URL" -qO $FILE && tar xz -C ~/drivers -f $FILE geckodriver; rm $FILE; chmod 777 ~/drivers/geckodriver;
install:
- ./manage.sh update_dev_packages
- pip install coveralls
diff --git a/AUTHORS.rst b/AUTHORS.rst
index f3e875ada..0c224088f 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -1,4 +1,4 @@
-Searx was created by Adam Tauber and is maintained by Adam Tauber and Alexandre Flament.
+Searx was created by Adam Tauber and is maintained by Adam Tauber, Alexandre Flament and Noémi Ványi.
Major contributing authors:
@@ -7,6 +7,7 @@ Major contributing authors:
- Thomas Pointhuber
- Alexandre Flament `@dalf <https://github.com/dalf>`_
- @Cqoicebordel
+- Noémi Ványi
People who have submitted patches/translates, reported bugs, consulted features or
generally made searx better:
@@ -39,12 +40,10 @@ generally made searx better:
- @underr
- Emmanuel Benazera
- @GreenLunar
-- Noemi Vanyi
- Kang-min Liu
- Kirill Isakov
- Guilhem Bonnefille
- Marc Abonce Seguin
-
- @jibe-b
- Christian Pietsch @pietsch
- @Maxqia
@@ -52,3 +51,12 @@ generally made searx better:
- YuLun Shih @imZack
- Dmitry Mikhirev @mikhirev
- David A Roberts `@davidar <https://github.com/davidar>`_
+- Jan Verbeek @blyxxyz
+- Ammar Najjar @ammarnajjar
+- @stepshal
+- François Revol @mmuman
+- marc @a01200356
+- Harry Wood @harry-wood
+- Thomas Renard @threnard
+- Pydo `<https://github.com/pydo>`_
+- Athemis `<https://github.com/Athemis>`_
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 8907ab403..999570eb5 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,3 +1,38 @@
+0.10.0 2016.09.06
+=================
+
+- New engines
+
+ - Archive.is (general)
+ - INA (videos)
+ - Scanr (science)
+ - Google Scholar (science)
+ - Crossref (science)
+ - Openrepos (files)
+ - Microsoft Academic Search Engine (science)
+ - Hoogle (it)
+ - Diggbt (files)
+ - Dictzone (general - dictionary)
+ - Translated (general - translation)
+- New Plugins
+
+ - Infinite scroll on results page
+ - DOAI rewrite
+- Full theme redesign
+- Display the number of results
+- Filter searches by date range
+- Instance config API endpoint
+- Dependency version updates
+- Socks proxy support for outgoing requests
+- 404 page
+
+
+News
+~~~~
+
+@kvch joined the maintainer team
+
+
0.9.0 2016.05.24
================
@@ -36,6 +71,7 @@
- Multilingual autocompleter
- Qwant autocompleter backend
+
0.8.1 2015.12.22
================
diff --git a/manage.sh b/manage.sh
index 75ba32024..11f2df04d 100755
--- a/manage.sh
+++ b/manage.sh
@@ -53,8 +53,8 @@ build_style() {
styles() {
echo '[!] Building styles'
- build_style themes/default/less/style.less themes/default/css/style.css
- build_style themes/default/less/style-rtl.less themes/default/css/style-rtl.css
+ build_style themes/legacy/less/style.less themes/legacy/css/style.css
+ build_style themes/legacy/less/style-rtl.less themes/legacy/css/style-rtl.css
build_style themes/courgette/less/style.less themes/courgette/css/style.css
build_style themes/courgette/less/style-rtl.less themes/courgette/css/style-rtl.css
build_style less/bootstrap/bootstrap.less css/bootstrap.min.css
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 580ef63e5..543521895 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -3,8 +3,8 @@ mock==2.0.0
nose2[coverage-plugin]
pep8==1.7.0
plone.testing==5.0.0
-robotframework-selenium2library==1.7.4
+robotframework-selenium2library==1.8.0
robotsuite==1.7.0
-transifex-client==0.11
+transifex-client==0.12.2
unittest2==1.1.0
-zope.testrunner==4.4.10
+zope.testrunner==4.5.1
diff --git a/requirements.txt b/requirements.txt
index 0d2f61b00..c4cbe4e04 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-certifi==2016.2.28
+certifi==2016.9.26
flask==0.11.1
flask-babel==0.11.1
lxml==3.6.0
@@ -9,4 +9,4 @@ pygments==2.1.3
pyopenssl==0.15.1
python-dateutil==2.5.3
pyyaml==3.11
-requests==2.10.0
+requests[socks]==2.10.0
diff --git a/searx/__init__.py b/searx/__init__.py
index 7b67a394f..b3abc61ae 100644
--- a/searx/__init__.py
+++ b/searx/__init__.py
@@ -42,7 +42,26 @@ else:
with open(settings_path) as settings_yaml:
settings = load(settings_yaml)
-if settings.get('general', {}).get('debug'):
+'''
+enable debug if
+the environnement variable SEARX_DEBUG is 1 or true
+(whatever the value in settings.yml)
+or general.debug=True in settings.yml
+
+disable debug if
+the environnement variable SEARX_DEBUG is 0 or false
+(whatever the value in settings.yml)
+or general.debug=False in settings.yml
+'''
+searx_debug_env = environ.get('SEARX_DEBUG', '').lower()
+if searx_debug_env == 'true' or searx_debug_env == '1':
+ searx_debug = True
+elif searx_debug_env == 'false' or searx_debug_env == '0':
+ searx_debug = False
+else:
+ searx_debug = settings.get('general', {}).get('debug')
+
+if searx_debug:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.WARNING)
diff --git a/searx/answerers/__init__.py b/searx/answerers/__init__.py
new file mode 100644
index 000000000..8f5951c75
--- /dev/null
+++ b/searx/answerers/__init__.py
@@ -0,0 +1,46 @@
+from os import listdir
+from os.path import realpath, dirname, join, isdir
+from searx.utils import load_module
+from collections import defaultdict
+
+
+answerers_dir = dirname(realpath(__file__))
+
+
+def load_answerers():
+ answerers = []
+ for filename in listdir(answerers_dir):
+ if not isdir(join(answerers_dir, filename)):
+ continue
+ module = load_module('answerer.py', join(answerers_dir, filename))
+ if not hasattr(module, 'keywords') or not isinstance(module.keywords, tuple) or not len(module.keywords):
+ exit(2)
+ answerers.append(module)
+ return answerers
+
+
+def get_answerers_by_keywords(answerers):
+ by_keyword = defaultdict(list)
+ for answerer in answerers:
+ for keyword in answerer.keywords:
+ for keyword in answerer.keywords:
+ by_keyword[keyword].append(answerer.answer)
+ return by_keyword
+
+
+def ask(query):
+ results = []
+ query_parts = filter(None, query.query.split())
+
+ if query_parts[0] not in answerers_by_keywords:
+ return results
+
+ for answerer in answerers_by_keywords[query_parts[0]]:
+ result = answerer(query)
+ if result:
+ results.append(result)
+ return results
+
+
+answerers = load_answerers()
+answerers_by_keywords = get_answerers_by_keywords(answerers)
diff --git a/searx/answerers/random/answerer.py b/searx/answerers/random/answerer.py
new file mode 100644
index 000000000..510d9f5be
--- /dev/null
+++ b/searx/answerers/random/answerer.py
@@ -0,0 +1,50 @@
+import random
+import string
+from flask_babel import gettext
+
+# required answerer attribute
+# specifies which search query keywords triggers this answerer
+keywords = ('random',)
+
+random_int_max = 2**31
+
+random_string_letters = string.lowercase + string.digits + string.uppercase
+
+
+def random_string():
+ return u''.join(random.choice(random_string_letters)
+ for _ in range(random.randint(8, 32)))
+
+
+def random_float():
+ return unicode(random.random())
+
+
+def random_int():
+ return unicode(random.randint(-random_int_max, random_int_max))
+
+
+random_types = {u'string': random_string,
+ u'int': random_int,
+ u'float': random_float}
+
+
+# required answerer function
+# can return a list of results (any result type) for a given query
+def answer(query):
+ parts = query.query.split()
+ if len(parts) != 2:
+ return []
+
+ if parts[1] not in random_types:
+ return []
+
+ return [{'answer': random_types[parts[1]]()}]
+
+
+# required answerer function
+# returns information about the answerer
+def self_info():
+ return {'name': gettext('Random value generator'),
+ 'description': gettext('Generate different random values'),
+ 'examples': [u'random {}'.format(x) for x in random_types]}
diff --git a/searx/answerers/statistics/answerer.py b/searx/answerers/statistics/answerer.py
new file mode 100644
index 000000000..a04695f56
--- /dev/null
+++ b/searx/answerers/statistics/answerer.py
@@ -0,0 +1,51 @@
+from functools import reduce
+from operator import mul
+
+from flask_babel import gettext
+
+keywords = ('min',
+ 'max',
+ 'avg',
+ 'sum',
+ 'prod')
+
+
+# required answerer function
+# can return a list of results (any result type) for a given query
+def answer(query):
+ parts = query.query.split()
+
+ if len(parts) < 2:
+ return []
+
+ try:
+ args = map(float, parts[1:])
+ except:
+ return []
+
+ func = parts[0]
+ answer = None
+
+ if func == 'min':
+ answer = min(args)
+ elif func == 'max':
+ answer = max(args)
+ elif func == 'avg':
+ answer = sum(args) / len(args)
+ elif func == 'sum':
+ answer = sum(args)
+ elif func == 'prod':
+ answer = reduce(mul, args, 1)
+
+ if answer is None:
+ return []
+
+ return [{'answer': unicode(answer)}]
+
+
+# required answerer function
+# returns information about the answerer
+def self_info():
+ return {'name': gettext('Statistics functions'),
+ 'description': gettext('Compute {functions} of the arguments').format(functions='/'.join(keywords)),
+ 'examples': ['avg 123 548 2.04 24.2']}
diff --git a/searx/engines/__init__.py b/searx/engines/__init__.py
index 782b622b0..87b1b0eb4 100644
--- a/searx/engines/__init__.py
+++ b/searx/engines/__init__.py
@@ -16,13 +16,13 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
(C) 2013- by Adam Tauber, <asciimoo@gmail.com>
'''
-from os.path import realpath, dirname, splitext, join
+from os.path import realpath, dirname
import sys
-from imp import load_source
from flask_babel import gettext
from operator import itemgetter
from searx import settings
from searx import logger
+from searx.utils import load_module
logger = logger.getChild('engines')
@@ -32,6 +32,7 @@ engine_dir = dirname(realpath(__file__))
engines = {}
categories = {'general': []}
+_initialized = False
engine_shortcuts = {}
engine_default_args = {'paging': False,
@@ -46,22 +47,18 @@ engine_default_args = {'paging': False,
'time_range_support': False}
-def load_module(filename):
- modname = splitext(filename)[0]
- if modname in sys.modules:
- del sys.modules[modname]
- filepath = join(engine_dir, filename)
- module = load_source(modname, filepath)
- module.name = modname
- return module
+def load_engine(engine_data):
+
+ if '_' in engine_data['name']:
+ logger.error('Engine name conains underscore: "{}"'.format(engine_data['name']))
+ sys.exit(1)
+ engine_module = engine_data['engine']
-def load_engine(engine_data):
- engine_name = engine_data['engine']
try:
- engine = load_module(engine_name + '.py')
+ engine = load_module(engine_module + '.py', engine_dir)
except:
- logger.exception('Cannot load engine "{}"'.format(engine_name))
+ logger.exception('Cannot load engine "{}"'.format(engine_module))
return None
for param_name in engine_data:
@@ -93,6 +90,9 @@ def load_engine(engine_data):
'result_count': 0,
'search_count': 0,
'page_load_time': 0,
+ 'page_load_count': 0,
+ 'engine_time': 0,
+ 'engine_time_count': 0,
'score_count': 0,
'errors': 0
}
@@ -109,32 +109,56 @@ def load_engine(engine_data):
return engine
+def to_percentage(stats, maxvalue):
+ for engine_stat in stats:
+ if maxvalue:
+ engine_stat['percentage'] = int(engine_stat['avg'] / maxvalue * 100)
+ else:
+ engine_stat['percentage'] = 0
+ return stats
+
+
def get_engines_stats():
# TODO refactor
pageloads = []
+ engine_times = []
results = []
scores = []
errors = []
scores_per_result = []
- max_pageload = max_results = max_score = max_errors = max_score_per_result = 0 # noqa
+ max_pageload = max_engine_times = max_results = max_score = max_errors = max_score_per_result = 0 # noqa
for engine in engines.values():
if engine.stats['search_count'] == 0:
continue
results_num = \
engine.stats['result_count'] / float(engine.stats['search_count'])
- load_times = engine.stats['page_load_time'] / float(engine.stats['search_count']) # noqa
+
+ if engine.stats['page_load_count'] != 0:
+ load_times = engine.stats['page_load_time'] / float(engine.stats['page_load_count']) # noqa
+ else:
+ load_times = 0
+
+ if engine.stats['engine_time_count'] != 0:
+ this_engine_time = engine.stats['engine_time'] / float(engine.stats['engine_time_count']) # noqa
+ else:
+ this_engine_time = 0
+
if results_num:
score = engine.stats['score_count'] / float(engine.stats['search_count']) # noqa
score_per_result = score / results_num
else:
score = score_per_result = 0.0
- max_results = max(results_num, max_results)
+
max_pageload = max(load_times, max_pageload)
+ max_engine_times = max(this_engine_time, max_engine_times)
+ max_results = max(results_num, max_results)
max_score = max(score, max_score)
max_score_per_result = max(score_per_result, max_score_per_result)
max_errors = max(max_errors, engine.stats['errors'])
+
pageloads.append({'avg': load_times, 'name': engine.name})
+ engine_times.append({'avg': this_engine_time, 'name': engine.name})
results.append({'avg': results_num, 'name': engine.name})
scores.append({'avg': score, 'name': engine.name})
errors.append({'avg': engine.stats['errors'], 'name': engine.name})
@@ -143,39 +167,19 @@ def get_engines_stats():
'name': engine.name
})
- for engine in pageloads:
- if max_pageload:
- engine['percentage'] = int(engine['avg'] / max_pageload * 100)
- else:
- engine['percentage'] = 0
-
- for engine in results:
- if max_results:
- engine['percentage'] = int(engine['avg'] / max_results * 100)
- else:
- engine['percentage'] = 0
-
- for engine in scores:
- if max_score:
- engine['percentage'] = int(engine['avg'] / max_score * 100)
- else:
- engine['percentage'] = 0
-
- for engine in scores_per_result:
- if max_score_per_result:
- engine['percentage'] = int(engine['avg']
- / max_score_per_result * 100)
- else:
- engine['percentage'] = 0
-
- for engine in errors:
- if max_errors:
- engine['percentage'] = int(float(engine['avg']) / max_errors * 100)
- else:
- engine['percentage'] = 0
+ pageloads = to_percentage(pageloads, max_pageload)
+ engine_times = to_percentage(engine_times, max_engine_times)
+ results = to_percentage(results, max_results)
+ scores = to_percentage(scores, max_score)
+ scores_per_result = to_percentage(scores_per_result, max_score_per_result)
+ erros = to_percentage(errors, max_errors)
return [
(
+ gettext('Engine time (sec)'),
+ sorted(engine_times, key=itemgetter('avg'))
+ ),
+ (
gettext('Page loads (sec)'),
sorted(pageloads, key=itemgetter('avg'))
),
diff --git a/searx/engines/archlinux.py b/searx/engines/archlinux.py
index b846934f7..5ba512766 100644
--- a/searx/engines/archlinux.py
+++ b/searx/engines/archlinux.py
@@ -12,7 +12,6 @@
"""
from urlparse import urljoin
-from cgi import escape
from urllib import urlencode
from lxml import html
from searx.engines.xpath import extract_text
@@ -135,7 +134,7 @@ def response(resp):
for result in dom.xpath(xpath_results):
link = result.xpath(xpath_link)[0]
href = urljoin(base_url, link.attrib.get('href'))
- title = escape(extract_text(link))
+ title = extract_text(link)
results.append({'url': href,
'title': title})
diff --git a/searx/engines/base.py b/searx/engines/base.py
index 66491d395..a552453ce 100755
--- a/searx/engines/base.py
+++ b/searx/engines/base.py
@@ -16,7 +16,6 @@
from lxml import etree
from urllib import urlencode
from searx.utils import searx_useragent
-from cgi import escape
from datetime import datetime
import re
@@ -94,7 +93,7 @@ def response(resp):
url = item.text
elif item.attrib["name"] == "dcdescription":
- content = escape(item.text[:300])
+ content = item.text[:300]
if len(item.text) > 300:
content += "..."
diff --git a/searx/engines/bing.py b/searx/engines/bing.py
index 6bdfd378b..58db61251 100644
--- a/searx/engines/bing.py
+++ b/searx/engines/bing.py
@@ -14,7 +14,6 @@
"""
from urllib import urlencode
-from cgi import escape
from lxml import html
from searx.engines.xpath import extract_text
@@ -32,18 +31,14 @@ search_string = 'search?{query}&first={offset}'
def request(query, params):
offset = (params['pageno'] - 1) * 10 + 1
- if params['language'] == 'all':
- language = 'en-US'
- else:
- language = params['language'].replace('_', '-')
+ if params['language'] != 'all':
+ query = u'language:{} {}'.format(params['language'].split('_')[0].upper(),
+ query.decode('utf-8')).encode('utf-8')
search_path = search_string.format(
- query=urlencode({'q': query, 'setmkt': language}),
+ query=urlencode({'q': query}),
offset=offset)
- params['cookies']['SRCHHPGUSR'] = \
- 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0]
-
params['url'] = base_url + search_path
return params
@@ -65,7 +60,7 @@ def response(resp):
link = result.xpath('.//h3/a')[0]
url = link.attrib.get('href')
title = extract_text(link)
- content = escape(extract_text(result.xpath('.//p')))
+ content = extract_text(result.xpath('.//p'))
# append result
results.append({'url': url,
@@ -77,7 +72,7 @@ def response(resp):
link = result.xpath('.//h2/a')[0]
url = link.attrib.get('href')
title = extract_text(link)
- content = escape(extract_text(result.xpath('.//p')))
+ content = extract_text(result.xpath('.//p'))
# append result
results.append({'url': url,
diff --git a/searx/engines/bing_images.py b/searx/engines/bing_images.py
index 384520392..4dd362cb3 100644
--- a/searx/engines/bing_images.py
+++ b/searx/engines/bing_images.py
@@ -24,11 +24,17 @@ import re
categories = ['images']
paging = True
safesearch = True
+time_range_support = True
# search-url
base_url = 'https://www.bing.com/'
search_string = 'images/search?{query}&count=10&first={offset}'
+time_range_string = '&qft=+filterui:age-lt{interval}'
thumb_url = "https://www.bing.com/th?id={ihk}"
+time_range_dict = {'day': '1440',
+ 'week': '10080',
+ 'month': '43200',
+ 'year': '525600'}
# safesearch definitions
safesearch_types = {2: 'STRICT',
@@ -58,6 +64,8 @@ def request(query, params):
'&ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')
params['url'] = base_url + search_path
+ if params['time_range'] in time_range_dict:
+ params['url'] += time_range_string.format(interval=time_range_dict[params['time_range']])
return params
diff --git a/searx/engines/bing_news.py b/searx/engines/bing_news.py
index a2397c48e..4e7c33129 100644
--- a/searx/engines/bing_news.py
+++ b/searx/engines/bing_news.py
@@ -22,10 +22,15 @@ from searx.utils import list_get
categories = ['news']
paging = True
language_support = True
+time_range_support = True
# search-url
base_url = 'https://www.bing.com/'
search_string = 'news/search?{query}&first={offset}&format=RSS'
+search_string_with_time = 'news/search?{query}&first={offset}&qft=interval%3d"{interval}"&format=RSS'
+time_range_dict = {'day': '7',
+ 'week': '8',
+ 'month': '9'}
# remove click
@@ -46,8 +51,24 @@ def image_url_cleanup(url_string):
return url_string
+def _get_url(query, language, offset, time_range):
+ if time_range in time_range_dict:
+ search_path = search_string_with_time.format(
+ query=urlencode({'q': query, 'setmkt': language}),
+ offset=offset,
+ interval=time_range_dict[time_range])
+ else:
+ search_path = search_string.format(
+ query=urlencode({'q': query, 'setmkt': language}),
+ offset=offset)
+ return base_url + search_path
+
+
# do search-request
def request(query, params):
+ if params['time_range'] and params['time_range'] not in time_range_dict:
+ return params
+
offset = (params['pageno'] - 1) * 10 + 1
if params['language'] == 'all':
@@ -55,11 +76,7 @@ def request(query, params):
else:
language = params['language'].replace('_', '-')
- search_path = search_string.format(
- query=urlencode({'q': query, 'setmkt': language}),
- offset=offset)
-
- params['url'] = base_url + search_path
+ params['url'] = _get_url(query, language, offset, params['time_range'])
return params
diff --git a/searx/engines/btdigg.py b/searx/engines/btdigg.py
index c2b22f003..33c8355de 100644
--- a/searx/engines/btdigg.py
+++ b/searx/engines/btdigg.py
@@ -11,11 +11,11 @@
"""
from urlparse import urljoin
-from cgi import escape
from urllib import quote
from lxml import html
from operator import itemgetter
from searx.engines.xpath import extract_text
+from searx.utils import get_torrent_size
# engine dependent config
categories = ['videos', 'music', 'files']
@@ -50,8 +50,8 @@ def response(resp):
for result in search_res:
link = result.xpath('.//td[@class="torrent_name"]//a')[0]
href = urljoin(url, link.attrib.get('href'))
- title = escape(extract_text(link))
- content = escape(extract_text(result.xpath('.//pre[@class="snippet"]')[0]))
+ title = extract_text(link)
+ content = extract_text(result.xpath('.//pre[@class="snippet"]')[0])
content = "<br />".join(content.split("\n"))
filesize = result.xpath('.//span[@class="attr_val"]/text()')[0].split()[0]
@@ -68,20 +68,7 @@ def response(resp):
leech = 0
# convert filesize to byte if possible
- try:
- filesize = float(filesize)
-
- # convert filesize to byte
- if filesize_multiplier == 'TB':
- filesize = int(filesize * 1024 * 1024 * 1024 * 1024)
- elif filesize_multiplier == 'GB':
- filesize = int(filesize * 1024 * 1024 * 1024)
- elif filesize_multiplier == 'MB':
- filesize = int(filesize * 1024 * 1024)
- elif filesize_multiplier == 'KB':
- filesize = int(filesize * 1024)
- except:
- filesize = None
+ filesize = get_torrent_size(filesize, filesize_multiplier)
# convert files to int if possible
if files.isdigit():
diff --git a/searx/engines/dailymotion.py b/searx/engines/dailymotion.py
index 4eb894725..317f34f59 100644
--- a/searx/engines/dailymotion.py
+++ b/searx/engines/dailymotion.py
@@ -14,7 +14,6 @@
from urllib import urlencode
from json import loads
-from cgi import escape
from datetime import datetime
# engine dependent config
@@ -57,7 +56,7 @@ def response(resp):
for res in search_res['list']:
title = res['title']
url = res['url']
- content = escape(res['description'])
+ content = res['description']
thumbnail = res['thumbnail_360_url']
publishedDate = datetime.fromtimestamp(res['created_time'], None)
embedded = embedded_url.format(videoid=res['id'])
diff --git a/searx/engines/deezer.py b/searx/engines/deezer.py
index 0530bc072..3db1af3d2 100644
--- a/searx/engines/deezer.py
+++ b/searx/engines/deezer.py
@@ -51,10 +51,11 @@ def response(resp):
if url.startswith('http://'):
url = 'https' + url[4:]
- content = result['artist']['name'] +\
- " &bull; " +\
- result['album']['title'] +\
- " &bull; " + result['title']
+ content = u'{} - {} - {}'.format(
+ result['artist']['name'],
+ result['album']['title'],
+ result['title'])
+
embedded = embedded_url.format(audioid=result['id'])
# append result
diff --git a/searx/engines/deviantart.py b/searx/engines/deviantart.py
index d893fc7fe..a24b75b8a 100644
--- a/searx/engines/deviantart.py
+++ b/searx/engines/deviantart.py
@@ -34,6 +34,9 @@ time_range_dict = {'day': 11,
# do search-request
def request(query, params):
+ if params['time_range'] and params['time_range'] not in time_range_dict:
+ return params
+
offset = (params['pageno'] - 1) * 24
params['url'] = search_url.format(offset=offset,
diff --git a/searx/engines/dictzone.py b/searx/engines/dictzone.py
new file mode 100644
index 000000000..20a9a8980
--- /dev/null
+++ b/searx/engines/dictzone.py
@@ -0,0 +1,68 @@
+"""
+ Dictzone
+
+ @website https://dictzone.com/
+ @provide-api no
+ @using-api no
+ @results HTML (using search portal)
+ @stable no (HTML can change)
+ @parse url, title, content
+"""
+
+import re
+from urlparse import urljoin
+from lxml import html
+from searx.utils import is_valid_lang
+
+categories = ['general']
+url = u'http://dictzone.com/{from_lang}-{to_lang}-dictionary/{query}'
+weight = 100
+
+parser_re = re.compile(u'.*?([a-z]+)-([a-z]+) ([^ ]+)$', re.I)
+results_xpath = './/table[@id="r"]/tr'
+
+
+def request(query, params):
+ m = parser_re.match(unicode(query, 'utf8'))
+ if not m:
+ return params
+
+ from_lang, to_lang, query = m.groups()
+
+ from_lang = is_valid_lang(from_lang)
+ to_lang = is_valid_lang(to_lang)
+
+ if not from_lang or not to_lang:
+ return params
+
+ params['url'] = url.format(from_lang=from_lang[2],
+ to_lang=to_lang[2],
+ query=query)
+
+ return params
+
+
+def response(resp):
+ results = []
+
+ dom = html.fromstring(resp.text)
+
+ for k, result in enumerate(dom.xpath(results_xpath)[1:]):
+ try:
+ from_result, to_results_raw = result.xpath('./td')
+ except:
+ continue
+
+ to_results = []
+ for to_result in to_results_raw.xpath('./p/a'):
+ t = to_result.text_content()
+ if t.strip():
+ to_results.append(to_result.text_content())
+
+ results.append({
+ 'url': urljoin(resp.url, '?%d' % k),
+ 'title': from_result.text_content(),
+ 'content': '; '.join(to_results)
+ })
+
+ return results
diff --git a/searx/engines/digbt.py b/searx/engines/digbt.py
new file mode 100644
index 000000000..b55d7747a
--- /dev/null
+++ b/searx/engines/digbt.py
@@ -0,0 +1,58 @@
+"""
+ DigBT (Videos, Music, Files)
+
+ @website https://digbt.org
+ @provide-api no
+
+ @using-api no
+ @results HTML (using search portal)
+ @stable no (HTML can change)
+ @parse url, title, content, magnetlink
+"""
+
+from urlparse import urljoin
+from lxml import html
+from searx.engines.xpath import extract_text
+from searx.utils import get_torrent_size
+
+categories = ['videos', 'music', 'files']
+paging = True
+
+URL = 'https://digbt.org'
+SEARCH_URL = URL + '/search/{query}-time-{pageno}'
+FILESIZE = 3
+FILESIZE_MULTIPLIER = 4
+
+
+def request(query, params):
+ params['url'] = SEARCH_URL.format(query=query, pageno=params['pageno'])
+
+ return params
+
+
+def response(resp):
+ dom = html.fromstring(resp.content)
+ search_res = dom.xpath('.//td[@class="x-item"]')
+
+ if not search_res:
+ return list()
+
+ results = list()
+ for result in search_res:
+ url = urljoin(URL, result.xpath('.//a[@title]/@href')[0])
+ title = extract_text(result.xpath('.//a[@title]'))
+ content = extract_text(result.xpath('.//div[@class="files"]'))
+ files_data = extract_text(result.xpath('.//div[@class="tail"]')).split()
+ filesize = get_torrent_size(files_data[FILESIZE], files_data[FILESIZE_MULTIPLIER])
+ magnetlink = result.xpath('.//div[@class="tail"]//a[@class="title"]/@href')[0]
+
+ results.append({'url': url,
+ 'title': title,
+ 'content': content,
+ 'filesize': filesize,
+ 'magnetlink': magnetlink,
+ 'seed': 'N/A',
+ 'leech': 'N/A',
+ 'template': 'torrent.html'})
+
+ return results
diff --git a/searx/engines/digg.py b/searx/engines/digg.py
index a10b38bb6..238b466a0 100644
--- a/searx/engines/digg.py
+++ b/searx/engines/digg.py
@@ -13,7 +13,6 @@
from urllib import quote_plus
from json import loads
from lxml import html
-from cgi import escape
from dateutil import parser
# engine dependent config
@@ -56,7 +55,7 @@ def response(resp):
url = result.attrib.get('data-contenturl')
thumbnail = result.xpath('.//img')[0].attrib.get('src')
title = ''.join(result.xpath(title_xpath))
- content = escape(''.join(result.xpath(content_xpath)))
+ content = ''.join(result.xpath(content_xpath))
pubdate = result.xpath(pubdate_xpath)[0].attrib.get('datetime')
publishedDate = parser.parse(pubdate)
diff --git a/searx/engines/duckduckgo.py b/searx/engines/duckduckgo.py
index 2153492e9..9959a52e6 100644
--- a/searx/engines/duckduckgo.py
+++ b/searx/engines/duckduckgo.py
@@ -41,6 +41,9 @@ content_xpath = './/a[@class="result__snippet"]'
# do search-request
def request(query, params):
+ if params['time_range'] and params['time_range'] not in time_range_dict:
+ return params
+
offset = (params['pageno'] - 1) * 30
if params['language'] == 'all':
diff --git a/searx/engines/fdroid.py b/searx/engines/fdroid.py
index 0b16773e3..6d470a4eb 100644
--- a/searx/engines/fdroid.py
+++ b/searx/engines/fdroid.py
@@ -9,7 +9,6 @@
@parse url, title, content
"""
-from cgi import escape
from urllib import urlencode
from searx.engines.xpath import extract_text
from lxml import html
@@ -43,7 +42,7 @@ def response(resp):
img_src = app.xpath('.//img/@src')[0]
content = extract_text(app.xpath('./p')[0])
- content = escape(content.replace(title, '', 1).strip())
+ content = content.replace(title, '', 1).strip()
results.append({'url': url,
'title': title,
diff --git a/searx/engines/flickr.py b/searx/engines/flickr.py
index 68d45bc17..5ce1160e9 100644
--- a/searx/engines/flickr.py
+++ b/searx/engines/flickr.py
@@ -77,21 +77,13 @@ def response(resp):
url = build_flickr_url(photo['owner'], photo['id'])
- title = photo['title']
-
- content = '<span class="photo-author">' +\
- photo['ownername'] +\
- '</span><br />' +\
- '<span class="description">' +\
- photo['description']['_content'] +\
- '</span>'
-
# append result
results.append({'url': url,
- 'title': title,
+ 'title': photo['title'],
'img_src': img_src,
'thumbnail_src': thumbnail_src,
- 'content': content,
+ 'content': photo['description']['_content'],
+ 'author': photo['ownername'],
'template': 'images.html'})
# return results
diff --git a/searx/engines/flickr_noapi.py b/searx/engines/flickr_noapi.py
index 87b912eb3..3c0ec7b70 100644
--- a/searx/engines/flickr_noapi.py
+++ b/searx/engines/flickr_noapi.py
@@ -14,6 +14,7 @@
from urllib import urlencode
from json import loads
+from time import time
import re
from searx.engines import logger
@@ -24,21 +25,32 @@ categories = ['images']
url = 'https://www.flickr.com/'
search_url = url + 'search?{query}&page={page}'
+time_range_url = '&min_upload_date={start}&max_upload_date={end}'
photo_url = 'https://www.flickr.com/photos/{userid}/{photoid}'
regex = re.compile(r"\"search-photos-lite-models\",\"photos\":(.*}),\"totalItems\":", re.DOTALL)
image_sizes = ('o', 'k', 'h', 'b', 'c', 'z', 'n', 'm', 't', 'q', 's')
paging = True
+time_range_support = True
+time_range_dict = {'day': 60 * 60 * 24,
+ 'week': 60 * 60 * 24 * 7,
+ 'month': 60 * 60 * 24 * 7 * 4,
+ 'year': 60 * 60 * 24 * 7 * 52}
def build_flickr_url(user_id, photo_id):
return photo_url.format(userid=user_id, photoid=photo_id)
-def request(query, params):
- params['url'] = search_url.format(query=urlencode({'text': query}),
- page=params['pageno'])
+def _get_time_range_url(time_range):
+ if time_range in time_range_dict:
+ return time_range_url.format(start=time(), end=str(int(time()) - time_range_dict[time_range]))
+ return ''
+
+def request(query, params):
+ params['url'] = (search_url.format(query=urlencode({'text': query}), page=params['pageno'])
+ + _get_time_range_url(params['time_range']))
return params
@@ -91,16 +103,15 @@ def response(resp):
title = photo.get('title', '')
- content = '<span class="photo-author">' +\
- photo['username'] +\
- '</span><br />'
+ author = photo['username']
# append result
results.append({'url': url,
'title': title,
'img_src': img_src,
'thumbnail_src': thumbnail_src,
- 'content': content,
+ 'content': '',
+ 'author': author,
'template': 'images.html'})
return results
diff --git a/searx/engines/gigablast.py b/searx/engines/gigablast.py
index 6e4e24b68..5430eb3ba 100644
--- a/searx/engines/gigablast.py
+++ b/searx/engines/gigablast.py
@@ -10,7 +10,6 @@
@parse url, title, content
"""
-from cgi import escape
from json import loads
from random import randint
from time import time
@@ -78,8 +77,8 @@ def response(resp):
for result in response_json['results']:
# append result
results.append({'url': result['url'],
- 'title': escape(result['title']),
- 'content': escape(result['sum'])})
+ 'title': result['title'],
+ 'content': result['sum']})
# return results
return results
diff --git a/searx/engines/github.py b/searx/engines/github.py
index cc1fc470c..7adef3be9 100644
--- a/searx/engines/github.py
+++ b/searx/engines/github.py
@@ -12,7 +12,6 @@
from urllib import urlencode
from json import loads
-from cgi import escape
# engine dependent config
categories = ['it']
@@ -48,7 +47,7 @@ def response(resp):
url = res['html_url']
if res['description']:
- content = escape(res['description'][:500])
+ content = res['description'][:500]
else:
content = ''
diff --git a/searx/engines/google.py b/searx/engines/google.py
index ea93bc94f..a02b6940e 100644
--- a/searx/engines/google.py
+++ b/searx/engines/google.py
@@ -9,7 +9,6 @@
# @parse url, title, content, suggestion
import re
-from cgi import escape
from urllib import urlencode
from urlparse import urlparse, parse_qsl
from lxml import html, etree
@@ -96,7 +95,8 @@ search_url = ('https://{hostname}' +
time_range_search = "&tbs=qdr:{range}"
time_range_dict = {'day': 'd',
'week': 'w',
- 'month': 'm'}
+ 'month': 'm',
+ 'year': 'y'}
# other URLs
map_hostname_start = 'maps.google.'
@@ -155,7 +155,7 @@ def parse_url(url_string, google_hostname):
def extract_text_from_dom(result, xpath):
r = result.xpath(xpath)
if len(r) > 0:
- return escape(extract_text(r[0]))
+ return extract_text(r[0])
return None
@@ -264,7 +264,7 @@ def response(resp):
# parse suggestion
for suggestion in dom.xpath(suggestion_xpath):
# append suggestion
- results.append({'suggestion': escape(extract_text(suggestion))})
+ results.append({'suggestion': extract_text(suggestion)})
# return results
return results
diff --git a/searx/engines/google_images.py b/searx/engines/google_images.py
index 77bdc13b2..9a3c71c7e 100644
--- a/searx/engines/google_images.py
+++ b/searx/engines/google_images.py
@@ -10,10 +10,12 @@
@parse url, title, img_src
"""
+from datetime import date, timedelta
from urllib import urlencode
from json import loads
from lxml import html
+
# engine dependent config
categories = ['images']
paging = True
@@ -29,6 +31,7 @@ search_url = 'https://www.google.com/search'\
'&yv=2'\
'&{search_options}'
time_range_attr = "qdr:{range}"
+time_range_custom_attr = "cdr:1,cd_min:{start},cd_max{end}"
time_range_dict = {'day': 'd',
'week': 'w',
'month': 'm'}
@@ -36,7 +39,6 @@ time_range_dict = {'day': 'd',
# do search-request
def request(query, params):
-
search_options = {
'ijn': params['pageno'] - 1,
'start': (params['pageno'] - 1) * number_of_results
@@ -44,6 +46,12 @@ def request(query, params):
if params['time_range'] in time_range_dict:
search_options['tbs'] = time_range_attr.format(range=time_range_dict[params['time_range']])
+ elif params['time_range'] == 'year':
+ now = date.today()
+ then = now - timedelta(days=365)
+ start = then.strftime('%m/%d/%Y')
+ end = now.strftime('%m/%d/%Y')
+ search_options['tbs'] = time_range_custom_attr.format(start=start, end=end)
if safesearch and params['safesearch']:
search_options['safe'] = 'on'
diff --git a/searx/engines/google_news.py b/searx/engines/google_news.py
index 95d15cfb9..37253c6a7 100644
--- a/searx/engines/google_news.py
+++ b/searx/engines/google_news.py
@@ -1,41 +1,57 @@
"""
Google (News)
- @website https://www.google.com
- @provide-api yes (https://developers.google.com/web-search/docs/),
- deprecated!
+ @website https://news.google.com
+ @provide-api no
- @using-api yes
- @results JSON
- @stable yes (but deprecated)
+ @using-api no
+ @results HTML
+ @stable no
@parse url, title, content, publishedDate
"""
+from lxml import html
from urllib import urlencode
-from json import loads
-from dateutil import parser
# search-url
categories = ['news']
paging = True
language_support = True
-
-# engine dependent config
-url = 'https://ajax.googleapis.com/'
-search_url = url + 'ajax/services/search/news?v=2.0&start={offset}&rsz=large&safe=off&filter=off&{query}&hl={lang}'
+safesearch = True
+time_range_support = True
+number_of_results = 10
+
+search_url = 'https://www.google.com/search'\
+ '?{query}'\
+ '&tbm=nws'\
+ '&gws_rd=cr'\
+ '&{search_options}'
+time_range_attr = "qdr:{range}"
+time_range_dict = {'day': 'd',
+ 'week': 'w',
+ 'month': 'm',
+ 'year': 'y'}
# do search-request
def request(query, params):
- offset = (params['pageno'] - 1) * 8
- language = 'en-US'
- if params['language'] != 'all':
- language = params['language'].replace('_', '-')
+ search_options = {
+ 'start': (params['pageno'] - 1) * number_of_results
+ }
+
+ if params['time_range'] in time_range_dict:
+ search_options['tbs'] = time_range_attr.format(range=time_range_dict[params['time_range']])
+
+ if safesearch and params['safesearch']:
+ search_options['safe'] = 'on'
- params['url'] = search_url.format(offset=offset,
- query=urlencode({'q': query}),
- lang=language)
+ params['url'] = search_url.format(query=urlencode({'q': query}),
+ search_options=urlencode(search_options))
+
+ if params['language'] != 'all':
+ language_array = params['language'].lower().split('_')
+ params['url'] += '&lr=lang_' + language_array[0]
return params
@@ -44,24 +60,21 @@ def request(query, params):
def response(resp):
results = []
- search_res = loads(resp.text)
-
- # return empty array if there are no results
- if not search_res.get('responseData', {}).get('results'):
- return []
+ dom = html.fromstring(resp.text)
# parse results
- for result in search_res['responseData']['results']:
- # parse publishedDate
- publishedDate = parser.parse(result['publishedDate'])
- if 'url' not in result:
- continue
-
- # append result
- results.append({'url': result['unescapedUrl'],
- 'title': result['titleNoFormatting'],
- 'publishedDate': publishedDate,
- 'content': result['content']})
+ for result in dom.xpath('//div[@class="g"]|//div[@class="g _cy"]'):
+ r = {
+ 'url': result.xpath('.//div[@class="_cnc"]//a/@href')[0],
+ 'title': ''.join(result.xpath('.//div[@class="_cnc"]//h3//text()')),
+ 'content': ''.join(result.xpath('.//div[@class="st"]//text()')),
+ }
+
+ img = result.xpath('.//img/@src')[0]
+ if img and not img.startswith('data'):
+ r['img_src'] = img
+
+ results.append(r)
# return results
return results
diff --git a/searx/engines/json_engine.py b/searx/engines/json_engine.py
index a824c38e5..4604c3cac 100644
--- a/searx/engines/json_engine.py
+++ b/searx/engines/json_engine.py
@@ -81,7 +81,7 @@ def request(query, params):
fp = {'query': query}
if paging and search_url.find('{pageno}') >= 0:
- fp['pageno'] = (params['pageno'] + first_page_num - 1) * page_size
+ fp['pageno'] = (params['pageno'] - 1) * page_size + first_page_num
params['url'] = search_url.format(**fp)
params['query'] = query
diff --git a/searx/engines/kickass.py b/searx/engines/kickass.py
index 4c5d24008..059fa2a66 100644
--- a/searx/engines/kickass.py
+++ b/searx/engines/kickass.py
@@ -11,18 +11,18 @@
"""
from urlparse import urljoin
-from cgi import escape
from urllib import quote
from lxml import html
from operator import itemgetter
from searx.engines.xpath import extract_text
+from searx.utils import get_torrent_size, convert_str_to_int
# engine dependent config
categories = ['videos', 'music', 'files']
paging = True
# search-url
-url = 'https://kickass.to/'
+url = 'https://kickass.cd/'
search_url = url + 'search/{search_term}/{pageno}/'
# specific xpath variables
@@ -56,42 +56,17 @@ def response(resp):
link = result.xpath('.//a[@class="cellMainLink"]')[0]
href = urljoin(url, link.attrib['href'])
title = extract_text(link)
- content = escape(extract_text(result.xpath(content_xpath)))
- seed = result.xpath('.//td[contains(@class, "green")]/text()')[0]
- leech = result.xpath('.//td[contains(@class, "red")]/text()')[0]
- filesize = result.xpath('.//td[contains(@class, "nobr")]/text()')[0]
- filesize_multiplier = result.xpath('.//td[contains(@class, "nobr")]//span/text()')[0]
- files = result.xpath('.//td[contains(@class, "center")][2]/text()')[0]
-
- # convert seed to int if possible
- if seed.isdigit():
- seed = int(seed)
- else:
- seed = 0
+ content = extract_text(result.xpath(content_xpath))
+ seed = extract_text(result.xpath('.//td[contains(@class, "green")]'))
+ leech = extract_text(result.xpath('.//td[contains(@class, "red")]'))
+ filesize_info = extract_text(result.xpath('.//td[contains(@class, "nobr")]'))
+ files = extract_text(result.xpath('.//td[contains(@class, "center")][2]'))
- # convert leech to int if possible
- if leech.isdigit():
- leech = int(leech)
- else:
- leech = 0
-
- # convert filesize to byte if possible
- try:
- filesize = float(filesize)
-
- # convert filesize to byte
- if filesize_multiplier == 'TB':
- filesize = int(filesize * 1024 * 1024 * 1024 * 1024)
- elif filesize_multiplier == 'GB':
- filesize = int(filesize * 1024 * 1024 * 1024)
- elif filesize_multiplier == 'MB':
- filesize = int(filesize * 1024 * 1024)
- elif filesize_multiplier == 'KB':
- filesize = int(filesize * 1024)
- except:
- filesize = None
-
- # convert files to int if possible
+ seed = convert_str_to_int(seed)
+ leech = convert_str_to_int(leech)
+
+ filesize, filesize_multiplier = filesize_info.split()
+ filesize = get_torrent_size(filesize, filesize_multiplier)
if files.isdigit():
files = int(files)
else:
diff --git a/searx/engines/nyaa.py b/searx/engines/nyaa.py
index cda8231f7..4ca5b3171 100644
--- a/searx/engines/nyaa.py
+++ b/searx/engines/nyaa.py
@@ -9,7 +9,6 @@
@parse url, title, content, seed, leech, torrentfile
"""
-from cgi import escape
from urllib import urlencode
from lxml import html
from searx.engines.xpath import extract_text
@@ -78,7 +77,7 @@ def response(resp):
# torrent title
page_a = result.xpath(xpath_title)[0]
- title = escape(extract_text(page_a))
+ title = extract_text(page_a)
# link to the page
href = page_a.attrib.get('href')
@@ -90,7 +89,7 @@ def response(resp):
try:
file_size, suffix = result.xpath(xpath_filesize)[0].split(' ')
file_size = int(float(file_size) * get_filesize_mul(suffix))
- except Exception as e:
+ except:
file_size = None
# seed count
@@ -105,7 +104,6 @@ def response(resp):
# content string contains all information not included into template
content = 'Category: "{category}". Downloaded {downloads} times.'
content = content.format(category=category, downloads=downloads)
- content = escape(content)
results.append({'url': href,
'title': title,
diff --git a/searx/engines/openstreetmap.py b/searx/engines/openstreetmap.py
index 38baaada9..01ca7d42d 100644
--- a/searx/engines/openstreetmap.py
+++ b/searx/engines/openstreetmap.py
@@ -43,7 +43,7 @@ def response(resp):
if 'display_name' not in r:
continue
- title = r['display_name']
+ title = r['display_name'] or u''
osm_type = r.get('osm_type', r.get('type'))
url = result_base_url.format(osm_type=osm_type,
osm_id=r['osm_id'])
diff --git a/searx/engines/pdbe.py b/searx/engines/pdbe.py
new file mode 100644
index 000000000..f784e106f
--- /dev/null
+++ b/searx/engines/pdbe.py
@@ -0,0 +1,109 @@
+"""
+ PDBe (Protein Data Bank in Europe)
+
+ @website https://www.ebi.ac.uk/pdbe
+ @provide-api yes (https://www.ebi.ac.uk/pdbe/api/doc/search.html),
+ unlimited
+ @using-api yes
+ @results python dictionary (from json)
+ @stable yes
+ @parse url, title, content, img_src
+"""
+
+from json import loads
+from flask_babel import gettext
+
+categories = ['science']
+
+hide_obsolete = False
+
+# status codes of unpublished entries
+pdb_unpublished_codes = ['HPUB', 'HOLD', 'PROC', 'WAIT', 'AUTH', 'AUCO', 'REPL', 'POLC', 'REFI', 'TRSF', 'WDRN']
+# url for api query
+pdbe_solr_url = 'https://www.ebi.ac.uk/pdbe/search/pdb/select?'
+# base url for results
+pdbe_entry_url = 'https://www.ebi.ac.uk/pdbe/entry/pdb/{pdb_id}'
+# link to preview image of structure
+pdbe_preview_url = 'https://www.ebi.ac.uk/pdbe/static/entry/{pdb_id}_deposited_chain_front_image-200x200.png'
+
+
+def request(query, params):
+
+ params['url'] = pdbe_solr_url
+ params['method'] = 'POST'
+ params['data'] = {
+ 'q': query,
+ 'wt': "json" # request response in parsable format
+ }
+ return params
+
+
+def construct_body(result):
+ # set title
+ title = result['title']
+
+ # construct content body
+ content = """{title}<br />{authors} {journal} <strong>{volume}</strong>&nbsp;{page} ({year})"""
+
+ # replace placeholders with actual content
+ try:
+ if result['journal']:
+ content = content.format(
+ title=result['citation_title'],
+ authors=result['entry_author_list'][0], journal=result['journal'], volume=result['journal_volume'],
+ page=result['journal_page'], year=result['citation_year'])
+ else:
+ content = content.format(
+ title=result['citation_title'],
+ authors=result['entry_author_list'][0], journal='', volume='', page='', year=result['release_year'])
+ img_src = pdbe_preview_url.format(pdb_id=result['pdb_id'])
+ except (KeyError):
+ content = None
+ img_src = None
+
+ # construct url for preview image
+ try:
+ img_src = pdbe_preview_url.format(pdb_id=result['pdb_id'])
+ except (KeyError):
+ img_src = None
+
+ return [title, content, img_src]
+
+
+def response(resp):
+
+ results = []
+ json = loads(resp.text)['response']['docs']
+
+ # parse results
+ for result in json:
+ # catch obsolete entries and mark them accordingly
+ if result['status'] in pdb_unpublished_codes:
+ continue
+ if hide_obsolete:
+ continue
+ if result['status'] == 'OBS':
+ # expand title to add some sort of warning message
+ title = gettext('{title}&nbsp;(OBSOLETE)').format(title=result['title'])
+ superseded_url = pdbe_entry_url.format(pdb_id=result['superseded_by'])
+
+ # since we can't construct a proper body from the response, we'll make up our own
+ msg_superseded = gettext("This entry has been superseded by")
+ content = '<em>{msg_superseded} \<a href="{url}">{pdb_id}</a></em>'.format(
+ msg_superseded=msg_superseded,
+ url=superseded_url,
+ pdb_id=result['superseded_by'], )
+
+ # obsoleted entries don't have preview images
+ img_src = None
+ else:
+ title, content, img_src = construct_body(result)
+
+ results.append({
+ 'url': pdbe_entry_url.format(pdb_id=result['pdb_id']),
+ 'title': title,
+ 'content': content,
+ 'img_src': img_src
+ })
+
+ return results
diff --git a/searx/engines/piratebay.py b/searx/engines/piratebay.py
index 55446b410..ca21a3bb2 100644
--- a/searx/engines/piratebay.py
+++ b/searx/engines/piratebay.py
@@ -9,7 +9,6 @@
# @parse url, title, content, seed, leech, magnetlink
from urlparse import urljoin
-from cgi import escape
from urllib import quote
from lxml import html
from operator import itemgetter
@@ -62,7 +61,7 @@ def response(resp):
link = result.xpath('.//div[@class="detName"]//a')[0]
href = urljoin(url, link.attrib.get('href'))
title = extract_text(link)
- content = escape(extract_text(result.xpath(content_xpath)))
+ content = extract_text(result.xpath(content_xpath))
seed, leech = result.xpath('.//td[@align="right"]/text()')[:2]
# convert seed to int if possible
diff --git a/searx/engines/qwant.py b/searx/engines/qwant.py
index 872bd4e95..d8b084292 100644
--- a/searx/engines/qwant.py
+++ b/searx/engines/qwant.py
@@ -10,9 +10,11 @@
@parse url, title, content
"""
-from urllib import urlencode
-from json import loads
from datetime import datetime
+from json import loads
+from urllib import urlencode
+
+from searx.utils import html_to_text
# engine dependent config
categories = None
@@ -66,9 +68,9 @@ def response(resp):
# parse results
for result in res.get('items', {}):
- title = result['title']
+ title = html_to_text(result['title'])
res_url = result['url']
- content = result['desc']
+ content = html_to_text(result['desc'])
if category_to_keyword.get(categories[0], '') == 'web':
results.append({'title': title,
diff --git a/searx/engines/reddit.py b/searx/engines/reddit.py
index 3ca7e44f6..b29792a3a 100644
--- a/searx/engines/reddit.py
+++ b/searx/engines/reddit.py
@@ -11,7 +11,6 @@
"""
import json
-from cgi import escape
from urllib import urlencode
from urlparse import urlparse, urljoin
from datetime import datetime
@@ -68,7 +67,7 @@ def response(resp):
img_results.append(params)
else:
created = datetime.fromtimestamp(data['created_utc'])
- content = escape(data['selftext'])
+ content = data['selftext']
if len(content) > 500:
content = content[:500] + '...'
params['content'] = content
diff --git a/searx/engines/searchcode_code.py b/searx/engines/searchcode_code.py
index de8cd43be..be7a6d385 100644
--- a/searx/engines/searchcode_code.py
+++ b/searx/engines/searchcode_code.py
@@ -34,11 +34,6 @@ def request(query, params):
params['url'] = search_url.format(query=urlencode({'q': query}),
pageno=params['pageno'] - 1)
- # Disable SSL verification
- # error: (60) SSL certificate problem: unable to get local issuer
- # certificate
- params['verify'] = False
-
return params
diff --git a/searx/engines/searchcode_doc.py b/searx/engines/searchcode_doc.py
index f24fe6f90..99e10be62 100644
--- a/searx/engines/searchcode_doc.py
+++ b/searx/engines/searchcode_doc.py
@@ -27,11 +27,6 @@ def request(query, params):
params['url'] = search_url.format(query=urlencode({'q': query}),
pageno=params['pageno'] - 1)
- # Disable SSL verification
- # error: (60) SSL certificate problem: unable to get local issuer
- # certificate
- params['verify'] = False
-
return params
@@ -44,20 +39,12 @@ def response(resp):
# parse results
for result in search_results.get('results', []):
href = result['url']
- title = "[" + result['type'] + "] " +\
- result['namespace'] +\
- " " + result['name']
- content = '<span class="highlight">[' +\
- result['type'] + "] " +\
- result['name'] + " " +\
- result['synopsis'] +\
- "</span><br />" +\
- result['description']
+ title = "[{}] {} {}".format(result['type'], result['namespace'], result['name'])
# append result
results.append({'url': href,
'title': title,
- 'content': content})
+ 'content': result['description']})
# return results
return results
diff --git a/searx/engines/seedpeer.py b/searx/engines/seedpeer.py
new file mode 100644
index 000000000..e1309a9b5
--- /dev/null
+++ b/searx/engines/seedpeer.py
@@ -0,0 +1,77 @@
+# Seedpeer (Videos, Music, Files)
+#
+# @website http://seedpeer.eu
+# @provide-api no (nothing found)
+#
+# @using-api no
+# @results HTML (using search portal)
+# @stable yes (HTML can change)
+# @parse url, title, content, seed, leech, magnetlink
+
+from urlparse import urljoin
+from urllib import quote
+from lxml import html
+from operator import itemgetter
+from searx.engines.xpath import extract_text
+
+
+url = 'http://www.seedpeer.eu/'
+search_url = url + 'search/{search_term}/7/{page_no}.html'
+# specific xpath variables
+torrent_xpath = '//*[@id="body"]/center/center/table[2]/tr/td/a'
+alternative_torrent_xpath = '//*[@id="body"]/center/center/table[1]/tr/td/a'
+title_xpath = '//*[@id="body"]/center/center/table[2]/tr/td/a/text()'
+alternative_title_xpath = '//*[@id="body"]/center/center/table/tr/td/a'
+seeds_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[4]/font/text()'
+alternative_seeds_xpath = '//*[@id="body"]/center/center/table/tr/td[4]/font/text()'
+peers_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[5]/font/text()'
+alternative_peers_xpath = '//*[@id="body"]/center/center/table/tr/td[5]/font/text()'
+age_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[2]/text()'
+alternative_age_xpath = '//*[@id="body"]/center/center/table/tr/td[2]/text()'
+size_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[3]/text()'
+alternative_size_xpath = '//*[@id="body"]/center/center/table/tr/td[3]/text()'
+
+
+# do search-request
+def request(query, params):
+ params['url'] = search_url.format(search_term=quote(query),
+ page_no=params['pageno'] - 1)
+ return params
+
+
+# get response from search-request
+def response(resp):
+ results = []
+ dom = html.fromstring(resp.text)
+ torrent_links = dom.xpath(torrent_xpath)
+ if len(torrent_links) > 0:
+ seeds = dom.xpath(seeds_xpath)
+ peers = dom.xpath(peers_xpath)
+ titles = dom.xpath(title_xpath)
+ sizes = dom.xpath(size_xpath)
+ ages = dom.xpath(age_xpath)
+ else: # under ~5 results uses a different xpath
+ torrent_links = dom.xpath(alternative_torrent_xpath)
+ seeds = dom.xpath(alternative_seeds_xpath)
+ peers = dom.xpath(alternative_peers_xpath)
+ titles = dom.xpath(alternative_title_xpath)
+ sizes = dom.xpath(alternative_size_xpath)
+ ages = dom.xpath(alternative_age_xpath)
+ # return empty array if nothing is found
+ if not torrent_links:
+ return []
+
+ # parse results
+ for index, result in enumerate(torrent_links):
+ link = result.attrib.get('href')
+ href = urljoin(url, link)
+ results.append({'url': href,
+ 'title': titles[index].text_content(),
+ 'content': '{}, {}'.format(sizes[index], ages[index]),
+ 'seed': seeds[index],
+ 'leech': peers[index],
+
+ 'template': 'torrent.html'})
+
+ # return results sorted by seeder
+ return sorted(results, key=itemgetter('seed'), reverse=True)
diff --git a/searx/engines/spotify.py b/searx/engines/spotify.py
index f75796e83..249ba91ef 100644
--- a/searx/engines/spotify.py
+++ b/searx/engines/spotify.py
@@ -46,10 +46,11 @@ def response(resp):
if result['type'] == 'track':
title = result['name']
url = result['external_urls']['spotify']
- content = result['artists'][0]['name'] +\
- " &bull; " +\
- result['album']['name'] +\
- " &bull; " + result['name']
+ content = u'{} - {} - {}'.format(
+ result['artists'][0]['name'],
+ result['album']['name'],
+ result['name'])
+
embedded = embedded_url.format(audioid=result['id'])
# append result
diff --git a/searx/engines/stackoverflow.py b/searx/engines/stackoverflow.py
index fdd3711a9..5e7ab2901 100644
--- a/searx/engines/stackoverflow.py
+++ b/searx/engines/stackoverflow.py
@@ -11,7 +11,6 @@
"""
from urlparse import urljoin
-from cgi import escape
from urllib import urlencode
from lxml import html
from searx.engines.xpath import extract_text
@@ -48,8 +47,8 @@ def response(resp):
for result in dom.xpath(results_xpath):
link = result.xpath(link_xpath)[0]
href = urljoin(url, link.attrib.get('href'))
- title = escape(extract_text(link))
- content = escape(extract_text(result.xpath(content_xpath)))
+ title = extract_text(link)
+ content = extract_text(result.xpath(content_xpath))
# append result
results.append({'url': href,
diff --git a/searx/engines/startpage.py b/searx/engines/startpage.py
index d8b702c4d..6f6eae1cf 100644
--- a/searx/engines/startpage.py
+++ b/searx/engines/startpage.py
@@ -11,7 +11,6 @@
# @todo paging
from lxml import html
-from cgi import escape
from dateutil import parser
from datetime import datetime, timedelta
import re
@@ -79,10 +78,10 @@ def response(resp):
if re.match(r"^http(s|)://(www\.)?ixquick\.com/do/search\?.*$", url):
continue
- title = escape(extract_text(link))
+ title = extract_text(link)
if result.xpath('./p[@class="desc clk"]'):
- content = escape(extract_text(result.xpath('./p[@class="desc clk"]')))
+ content = extract_text(result.xpath('./p[@class="desc clk"]'))
else:
content = ''
diff --git a/searx/engines/subtitleseeker.py b/searx/engines/subtitleseeker.py
index 47d27d0b2..daba68be7 100644
--- a/searx/engines/subtitleseeker.py
+++ b/searx/engines/subtitleseeker.py
@@ -10,7 +10,6 @@
@parse url, title, content
"""
-from cgi import escape
from urllib import quote_plus
from lxml import html
from searx.languages import language_codes
@@ -59,7 +58,7 @@ def response(resp):
elif search_lang:
href = href + search_lang + '/'
- title = escape(extract_text(link))
+ title = extract_text(link)
content = extract_text(result.xpath('.//div[contains(@class,"red")]'))
content = content + " - "
@@ -75,7 +74,7 @@ def response(resp):
# append result
results.append({'url': href,
'title': title,
- 'content': escape(content)})
+ 'content': content})
# return results
return results
diff --git a/searx/engines/swisscows.py b/searx/engines/swisscows.py
index 1a94ed64e..72184e428 100644
--- a/searx/engines/swisscows.py
+++ b/searx/engines/swisscows.py
@@ -10,7 +10,6 @@
@parse url, title, content
"""
-from cgi import escape
from json import loads
from urllib import urlencode, unquote
import re
@@ -78,7 +77,7 @@ def response(resp):
# append result
results.append({'url': result['SourceUrl'],
- 'title': escape(result['Title']),
+ 'title': result['Title'],
'content': '',
'img_src': img_url,
'template': 'images.html'})
@@ -90,8 +89,8 @@ def response(resp):
# append result
results.append({'url': result_url,
- 'title': escape(result_title),
- 'content': escape(result_content)})
+ 'title': result_title,
+ 'content': result_content})
# parse images
for result in json.get('Images', []):
@@ -100,7 +99,7 @@ def response(resp):
# append result
results.append({'url': result['SourceUrl'],
- 'title': escape(result['Title']),
+ 'title': result['Title'],
'content': '',
'img_src': img_url,
'template': 'images.html'})
diff --git a/searx/engines/tokyotoshokan.py b/searx/engines/tokyotoshokan.py
index e2990e153..52b2cbe07 100644
--- a/searx/engines/tokyotoshokan.py
+++ b/searx/engines/tokyotoshokan.py
@@ -11,7 +11,6 @@
"""
import re
-from cgi import escape
from urllib import urlencode
from lxml import html
from searx.engines.xpath import extract_text
diff --git a/searx/engines/torrentz.py b/searx/engines/torrentz.py
index 92fbe7013..f9c832651 100644
--- a/searx/engines/torrentz.py
+++ b/searx/engines/torrentz.py
@@ -12,7 +12,6 @@
"""
import re
-from cgi import escape
from urllib import urlencode
from lxml import html
from searx.engines.xpath import extract_text
diff --git a/searx/engines/translated.py b/searx/engines/translated.py
new file mode 100644
index 000000000..e78db0d8e
--- /dev/null
+++ b/searx/engines/translated.py
@@ -0,0 +1,64 @@
+"""
+ MyMemory Translated
+
+ @website https://mymemory.translated.net/
+ @provide-api yes (https://mymemory.translated.net/doc/spec.php)
+ @using-api yes
+ @results JSON
+ @stable yes
+ @parse url, title, content
+"""
+import re
+from searx.utils import is_valid_lang
+
+categories = ['general']
+url = u'http://api.mymemory.translated.net/get?q={query}&langpair={from_lang}|{to_lang}{key}'
+web_url = u'http://mymemory.translated.net/en/{from_lang}/{to_lang}/{query}'
+weight = 100
+
+parser_re = re.compile(u'.*?([a-z]+)-([a-z]+) (.{2,})$', re.I)
+api_key = ''
+
+
+def request(query, params):
+ m = parser_re.match(unicode(query, 'utf8'))
+ if not m:
+ return params
+
+ from_lang, to_lang, query = m.groups()
+
+ from_lang = is_valid_lang(from_lang)
+ to_lang = is_valid_lang(to_lang)
+
+ if not from_lang or not to_lang:
+ return params
+
+ if api_key:
+ key_form = '&key=' + api_key
+ else:
+ key_form = ''
+ params['url'] = url.format(from_lang=from_lang[1],
+ to_lang=to_lang[1],
+ query=query,
+ key=key_form)
+ params['query'] = query
+ params['from_lang'] = from_lang
+ params['to_lang'] = to_lang
+
+ return params
+
+
+def response(resp):
+ results = []
+ results.append({
+ 'url': web_url.format(
+ from_lang=resp.search_params['from_lang'][2],
+ to_lang=resp.search_params['to_lang'][2],
+ query=resp.search_params['query']),
+ 'title': '[{0}-{1}] {2}'.format(
+ resp.search_params['from_lang'][1],
+ resp.search_params['to_lang'][1],
+ resp.search_params['query']),
+ 'content': resp.json()['responseData']['translatedText']
+ })
+ return results
diff --git a/searx/engines/vimeo.py b/searx/engines/vimeo.py
index 517ac1c44..5d5310544 100644
--- a/searx/engines/vimeo.py
+++ b/searx/engines/vimeo.py
@@ -12,10 +12,8 @@
# @todo rewrite to api
# @todo set content-parameter with correct data
+from json import loads
from urllib import urlencode
-from lxml import html
-from HTMLParser import HTMLParser
-from searx.engines.xpath import extract_text
from dateutil import parser
# engine dependent config
@@ -23,17 +21,10 @@ categories = ['videos']
paging = True
# search-url
-base_url = 'https://vimeo.com'
+base_url = 'https://vimeo.com/'
search_url = base_url + '/search/page:{pageno}?{query}'
-# specific xpath variables
-results_xpath = '//div[contains(@class,"results_grid")]/ul/li'
-url_xpath = './/a/@href'
-title_xpath = './/span[@class="title"]'
-thumbnail_xpath = './/img[@class="js-clip_thumbnail_image"]/@src'
-publishedDate_xpath = './/time/attribute::datetime'
-
-embedded_url = '<iframe data-src="//player.vimeo.com/video{videoid}" ' +\
+embedded_url = '<iframe data-src="//player.vimeo.com/video/{videoid}" ' +\
'width="540" height="304" frameborder="0" ' +\
'webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'
@@ -49,17 +40,18 @@ def request(query, params):
# get response from search-request
def response(resp):
results = []
-
- dom = html.fromstring(resp.text)
- p = HTMLParser()
+ data_start_pos = resp.text.find('{"filtered"')
+ data_end_pos = resp.text.find(';\n', data_start_pos + 1)
+ data = loads(resp.text[data_start_pos:data_end_pos])
# parse results
- for result in dom.xpath(results_xpath):
- videoid = result.xpath(url_xpath)[0]
+ for result in data['filtered']['data']:
+ result = result[result['type']]
+ videoid = result['uri'].split('/')[-1]
url = base_url + videoid
- title = p.unescape(extract_text(result.xpath(title_xpath)))
- thumbnail = extract_text(result.xpath(thumbnail_xpath)[0])
- publishedDate = parser.parse(extract_text(result.xpath(publishedDate_xpath)[0]))
+ title = result['name']
+ thumbnail = result['pictures']['sizes'][-1]['link']
+ publishedDate = parser.parse(result['created_time'])
embedded = embedded_url.format(videoid=videoid)
# append result
diff --git a/searx/engines/wolframalpha_api.py b/searx/engines/wolframalpha_api.py
index 4526c825f..e743c8f56 100644
--- a/searx/engines/wolframalpha_api.py
+++ b/searx/engines/wolframalpha_api.py
@@ -18,10 +18,10 @@ api_key = '' # defined in settings.yml
# xpath variables
failure_xpath = '/queryresult[attribute::success="false"]'
-answer_xpath = '//pod[attribute::primary="true"]/subpod/plaintext'
input_xpath = '//pod[starts-with(attribute::id, "Input")]/subpod/plaintext'
pods_xpath = '//pod'
subpods_xpath = './subpod'
+pod_primary_xpath = './@primary'
pod_id_xpath = './@id'
pod_title_xpath = './@title'
plaintext_xpath = './plaintext'
@@ -75,13 +75,15 @@ def response(resp):
try:
infobox_title = search_results.xpath(input_xpath)[0].text
except:
- infobox_title = None
+ infobox_title = ""
pods = search_results.xpath(pods_xpath)
result_chunks = []
+ result_content = ""
for pod in pods:
pod_id = pod.xpath(pod_id_xpath)[0]
pod_title = pod.xpath(pod_title_xpath)[0]
+ pod_is_result = pod.xpath(pod_primary_xpath)
subpods = pod.xpath(subpods_xpath)
if not subpods:
@@ -94,6 +96,10 @@ def response(resp):
if content and pod_id not in image_pods:
+ if pod_is_result or not result_content:
+ if pod_id != "Input":
+ result_content = "%s: %s" % (pod_title, content)
+
# if no input pod was found, title is first plaintext pod
if not infobox_title:
infobox_title = content
@@ -109,6 +115,8 @@ def response(resp):
if not result_chunks:
return []
+ title = "Wolfram|Alpha (%s)" % infobox_title
+
# append infobox
results.append({'infobox': infobox_title,
'attributes': result_chunks,
@@ -116,7 +124,7 @@ def response(resp):
# append link to site
results.append({'url': resp.request.headers['Referer'].decode('utf8'),
- 'title': 'Wolfram|Alpha',
- 'content': infobox_title})
+ 'title': title,
+ 'content': result_content})
return results
diff --git a/searx/engines/wolframalpha_noapi.py b/searx/engines/wolframalpha_noapi.py
index 3a8180f04..1534501b3 100644
--- a/searx/engines/wolframalpha_noapi.py
+++ b/searx/engines/wolframalpha_noapi.py
@@ -11,6 +11,7 @@
from json import loads
from time import time
from urllib import urlencode
+from lxml.etree import XML
from searx.poolrequests import get as http_get
@@ -34,7 +35,7 @@ search_url = url + 'input/json.jsp'\
referer_url = url + 'input/?{query}'
token = {'value': '',
- 'last_updated': 0}
+ 'last_updated': None}
# pods to display as image in infobox
# this pods do return a plaintext, but they look better and are more useful as images
@@ -80,10 +81,12 @@ def response(resp):
# TODO handle resp_json['queryresult']['assumptions']
result_chunks = []
- infobox_title = None
+ infobox_title = ""
+ result_content = ""
for pod in resp_json['queryresult']['pods']:
pod_id = pod.get('id', '')
pod_title = pod.get('title', '')
+ pod_is_result = pod.get('primary', None)
if 'subpods' not in pod:
continue
@@ -97,6 +100,10 @@ def response(resp):
if subpod['plaintext'] != '(requires interactivity)':
result_chunks.append({'label': pod_title, 'value': subpod['plaintext']})
+ if pod_is_result or not result_content:
+ if pod_id != "Input":
+ result_content = pod_title + ': ' + subpod['plaintext']
+
elif 'img' in subpod:
result_chunks.append({'label': pod_title, 'image': subpod['img']})
@@ -108,7 +115,7 @@ def response(resp):
'urls': [{'title': 'Wolfram|Alpha', 'url': resp.request.headers['Referer'].decode('utf8')}]})
results.append({'url': resp.request.headers['Referer'].decode('utf8'),
- 'title': 'Wolfram|Alpha',
- 'content': infobox_title})
+ 'title': 'Wolfram|Alpha (' + infobox_title + ')',
+ 'content': result_content})
return results
diff --git a/searx/engines/www500px.py b/searx/engines/www500px.py
index f1bc6c583..546521ba3 100644
--- a/searx/engines/www500px.py
+++ b/searx/engines/www500px.py
@@ -12,12 +12,9 @@
@todo rewrite to api
"""
-
+from json import loads
from urllib import urlencode
from urlparse import urljoin
-from lxml import html
-import re
-from searx.engines.xpath import extract_text
# engine dependent config
categories = ['images']
@@ -25,13 +22,27 @@ paging = True
# search-url
base_url = 'https://500px.com'
-search_url = base_url + '/search?search?page={pageno}&type=photos&{query}'
+search_url = 'https://api.500px.com/v1/photos/search?type=photos'\
+ '&{query}'\
+ '&image_size%5B%5D=4'\
+ '&image_size%5B%5D=20'\
+ '&image_size%5B%5D=21'\
+ '&image_size%5B%5D=1080'\
+ '&image_size%5B%5D=1600'\
+ '&image_size%5B%5D=2048'\
+ '&include_states=true'\
+ '&formats=jpeg%2Clytro'\
+ '&include_tags=true'\
+ '&exclude_nude=true'\
+ '&page={pageno}'\
+ '&rpp=50'\
+ '&sdk_key=b68e60cff4c929bedea36ca978830c5caca790c3'
# do search-request
def request(query, params):
params['url'] = search_url.format(pageno=params['pageno'],
- query=urlencode({'q': query}))
+ query=urlencode({'term': query}))
return params
@@ -40,19 +51,16 @@ def request(query, params):
def response(resp):
results = []
- dom = html.fromstring(resp.text)
- regex = re.compile(r'3\.jpg.*$')
+ response_json = loads(resp.text)
# parse results
- for result in dom.xpath('//div[@class="photo"]'):
- link = result.xpath('.//a')[0]
- url = urljoin(base_url, link.attrib.get('href'))
- title = extract_text(result.xpath('.//div[@class="title"]'))
- thumbnail_src = link.xpath('.//img')[0].attrib.get('src')
- # To have a bigger thumbnail, uncomment the next line
- # thumbnail_src = regex.sub('4.jpg', thumbnail_src)
- content = extract_text(result.xpath('.//div[@class="info"]'))
- img_src = regex.sub('2048.jpg', thumbnail_src)
+ for result in response_json['photos']:
+ url = urljoin(base_url, result['url'])
+ title = result['name']
+ # last index is the biggest resolution
+ img_src = result['image_url'][-1]
+ thumbnail_src = result['image_url'][0]
+ content = result['description'] or ''
# append result
results.append({'url': url,
diff --git a/searx/engines/xpath.py b/searx/engines/xpath.py
index e701c02bf..e5c0c5bea 100644
--- a/searx/engines/xpath.py
+++ b/searx/engines/xpath.py
@@ -87,7 +87,7 @@ def request(query, params):
fp = {'query': query}
if paging and search_url.find('{pageno}') >= 0:
- fp['pageno'] = (params['pageno'] + first_page_num - 1) * page_size
+ fp['pageno'] = (params['pageno'] - 1) * page_size + first_page_num
params['url'] = search_url.format(**fp)
params['query'] = query
diff --git a/searx/engines/yacy.py b/searx/engines/yacy.py
index c2f1bc7ef..92cf881c0 100644
--- a/searx/engines/yacy.py
+++ b/searx/engines/yacy.py
@@ -16,6 +16,8 @@ from json import loads
from urllib import urlencode
from dateutil import parser
+from searx.utils import html_to_text
+
# engine dependent config
categories = ['general', 'images'] # TODO , 'music', 'videos', 'files'
paging = True
@@ -88,7 +90,7 @@ def response(resp):
# append result
results.append({'url': result['link'],
'title': result['title'],
- 'content': result['description'],
+ 'content': html_to_text(result['description']),
'publishedDate': publishedDate})
# TODO parse video, audio and file results
diff --git a/searx/engines/yahoo.py b/searx/engines/yahoo.py
index 8e24a283e..2bb34b83d 100644
--- a/searx/engines/yahoo.py
+++ b/searx/engines/yahoo.py
@@ -77,6 +77,9 @@ def _get_language(params):
# do search-request
def request(query, params):
+ if params['time_range'] and params['time_range'] not in time_range_dict:
+ return params
+
offset = (params['pageno'] - 1) * 10 + 1
language = _get_language(params)
diff --git a/searx/engines/yandex.py b/searx/engines/yandex.py
index be3ec36ce..b83a747f9 100644
--- a/searx/engines/yandex.py
+++ b/searx/engines/yandex.py
@@ -9,7 +9,6 @@
@parse url, title, content
"""
-from cgi import escape
from urllib import urlencode
from lxml import html
from searx.search import logger
@@ -30,10 +29,10 @@ language_map = {'ru': 'ru',
base_url = 'https://yandex.{tld}/'
search_url = 'search/?{query}&p={page}'
-results_xpath = '//div[@class="serp-item serp-item_plain_yes clearfix i-bem"]'
+results_xpath = '//li[@class="serp-item"]'
url_xpath = './/h2/a/@href'
title_xpath = './/h2/a//text()'
-content_xpath = './/div[@class="serp-item__text"]//text()'
+content_xpath = './/div[@class="text-container typo typo_text_m typo_line_m organic__text"]//text()'
def request(query, params):
@@ -52,8 +51,8 @@ def response(resp):
for result in dom.xpath(results_xpath):
try:
res = {'url': result.xpath(url_xpath)[0],
- 'title': escape(''.join(result.xpath(title_xpath))),
- 'content': escape(''.join(result.xpath(content_xpath)))}
+ 'title': ''.join(result.xpath(title_xpath)),
+ 'content': ''.join(result.xpath(content_xpath))}
except:
logger.exception('yandex parse crash')
continue
diff --git a/searx/engines/youtube_noapi.py b/searx/engines/youtube_noapi.py
index 401fca4c9..9b7ca64c8 100644
--- a/searx/engines/youtube_noapi.py
+++ b/searx/engines/youtube_noapi.py
@@ -17,10 +17,16 @@ from searx.utils import list_get
categories = ['videos', 'music']
paging = True
language_support = False
+time_range_support = True
# search-url
base_url = 'https://www.youtube.com/results'
search_url = base_url + '?search_query={query}&page={page}'
+time_range_url = '&sp=EgII{time_range}%253D%253D'
+time_range_dict = {'day': 'Ag',
+ 'week': 'Aw',
+ 'month': 'BA',
+ 'year': 'BQ'}
embedded_url = '<iframe width="540" height="304" ' +\
'data-src="//www.youtube-nocookie.com/embed/{videoid}" ' +\
@@ -47,6 +53,8 @@ def extract_text_from_dom(result, xpath):
def request(query, params):
params['url'] = search_url.format(query=quote_plus(query),
page=params['pageno'])
+ if params['time_range'] in time_range_dict:
+ params['url'] += time_range_url.format(time_range=time_range_dict[params['time_range']])
return params
diff --git a/searx/plugins/doai_rewrite.py b/searx/plugins/doai_rewrite.py
index fc5998b14..a6e15ae5a 100644
--- a/searx/plugins/doai_rewrite.py
+++ b/searx/plugins/doai_rewrite.py
@@ -20,12 +20,12 @@ def extract_doi(url):
return None
-def on_result(request, ctx):
- doi = extract_doi(ctx['result']['parsed_url'])
+def on_result(request, search, result):
+ doi = extract_doi(result['parsed_url'])
if doi and len(doi) < 50:
for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'):
if doi.endswith(suffix):
doi = doi[:-len(suffix)]
- ctx['result']['url'] = 'http://doai.io/' + doi
- ctx['result']['parsed_url'] = urlparse(ctx['result']['url'])
+ result['url'] = 'http://doai.io/' + doi
+ result['parsed_url'] = urlparse(result['url'])
return True
diff --git a/searx/plugins/https_rewrite.py b/searx/plugins/https_rewrite.py
index 8a9fcd4ad..8b4c9784e 100644
--- a/searx/plugins/https_rewrite.py
+++ b/searx/plugins/https_rewrite.py
@@ -220,8 +220,7 @@ def https_url_rewrite(result):
return result
-def on_result(request, ctx):
- result = ctx['result']
+def on_result(request, search, result):
if result['parsed_url'].scheme == 'http':
https_url_rewrite(result)
return True
diff --git a/searx/plugins/self_info.py b/searx/plugins/self_info.py
index 75cbae0de..a2aeda98e 100644
--- a/searx/plugins/self_info.py
+++ b/searx/plugins/self_info.py
@@ -28,17 +28,19 @@ p = re.compile('.*user[ -]agent.*', re.IGNORECASE)
# attach callback to the post search hook
# request: flask request object
# ctx: the whole local context of the pre search hook
-def post_search(request, ctx):
- if ctx['search'].query == 'ip':
+def post_search(request, search):
+ if search.search_query.pageno > 1:
+ return True
+ if search.search_query.query == 'ip':
x_forwarded_for = request.headers.getlist("X-Forwarded-For")
if x_forwarded_for:
ip = x_forwarded_for[0]
else:
ip = request.remote_addr
- ctx['search'].result_container.answers.clear()
- ctx['search'].result_container.answers.add(ip)
- elif p.match(ctx['search'].query):
+ search.result_container.answers.clear()
+ search.result_container.answers.add(ip)
+ elif p.match(search.search_query.query):
ua = request.user_agent
- ctx['search'].result_container.answers.clear()
- ctx['search'].result_container.answers.add(ua)
+ search.result_container.answers.clear()
+ search.result_container.answers.add(ua)
return True
diff --git a/searx/plugins/tracker_url_remover.py b/searx/plugins/tracker_url_remover.py
index b909e3fae..68a004e33 100644
--- a/searx/plugins/tracker_url_remover.py
+++ b/searx/plugins/tracker_url_remover.py
@@ -28,8 +28,8 @@ description = gettext('Remove trackers arguments from the returned URL')
default_on = True
-def on_result(request, ctx):
- query = ctx['result']['parsed_url'].query
+def on_result(request, search, result):
+ query = result['parsed_url'].query
if query == "":
return True
@@ -37,8 +37,8 @@ def on_result(request, ctx):
for reg in regexes:
query = reg.sub('', query)
- if query != ctx['result']['parsed_url'].query:
- ctx['result']['parsed_url'] = ctx['result']['parsed_url']._replace(query=query)
- ctx['result']['url'] = urlunparse(ctx['result']['parsed_url'])
+ if query != result['parsed_url'].query:
+ result['parsed_url'] = result['parsed_url']._replace(query=query)
+ result['url'] = urlunparse(result['parsed_url'])
return True
diff --git a/searx/preferences.py b/searx/preferences.py
index e19ae7502..4436b8fe8 100644
--- a/searx/preferences.py
+++ b/searx/preferences.py
@@ -49,28 +49,32 @@ class StringSetting(Setting):
class EnumStringSetting(Setting):
"""Setting of a value which can only come from the given choices"""
+ def _validate_selection(self, selection):
+ if selection not in self.choices:
+ raise ValidationException('Invalid value: "{0}"'.format(selection))
+
def _post_init(self):
if not hasattr(self, 'choices'):
raise MissingArgumentException('Missing argument: choices')
-
- if self.value != '' and self.value not in self.choices:
- raise ValidationException('Invalid default value: {0}'.format(self.value))
+ self._validate_selection(self.value)
def parse(self, data):
- if data not in self.choices and data != self.value:
- raise ValidationException('Invalid choice: {0}'.format(data))
+ self._validate_selection(data)
self.value = data
class MultipleChoiceSetting(EnumStringSetting):
"""Setting of values which can only come from the given choices"""
+ def _validate_selections(self, selections):
+ for item in selections:
+ if item not in self.choices:
+ raise ValidationException('Invalid value: "{0}"'.format(selections))
+
def _post_init(self):
if not hasattr(self, 'choices'):
raise MissingArgumentException('Missing argument: choices')
- for item in self.value:
- if item not in self.choices:
- raise ValidationException('Invalid default value: {0}'.format(self.value))
+ self._validate_selections(self.value)
def parse(self, data):
if data == '':
@@ -78,9 +82,7 @@ class MultipleChoiceSetting(EnumStringSetting):
return
elements = data.split(',')
- for item in elements:
- if item not in self.choices:
- raise ValidationException('Invalid choice: {0}'.format(item))
+ self._validate_selections(elements)
self.value = elements
def parse_form(self, data):
@@ -214,11 +216,12 @@ class Preferences(object):
super(Preferences, self).__init__()
self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories),
- 'language': EnumStringSetting('all', choices=LANGUAGE_CODES),
+ 'language': EnumStringSetting(settings['search']['language'],
+ choices=LANGUAGE_CODES),
'locale': EnumStringSetting(settings['ui']['default_locale'],
- choices=settings['locales'].keys()),
+ choices=settings['locales'].keys() + ['']),
'autocomplete': EnumStringSetting(settings['search']['autocomplete'],
- choices=autocomplete.backends.keys()),
+ choices=autocomplete.backends.keys() + ['']),
'image_proxy': MapSetting(settings['server']['image_proxy'],
map={'': settings['server']['image_proxy'],
'0': False,
@@ -227,7 +230,8 @@ class Preferences(object):
'safesearch': MapSetting(settings['search']['safe_search'], map={'0': 0,
'1': 1,
'2': 2}),
- 'theme': EnumStringSetting(settings['ui']['default_theme'], choices=themes)}
+ 'theme': EnumStringSetting(settings['ui']['default_theme'], choices=themes),
+ 'results_on_new_tab': MapSetting(False, map={'0': False, '1': True})}
self.engines = EnginesSetting('engines', choices=engines)
self.plugins = PluginsSetting('plugins', choices=plugins)
diff --git a/searx/query.py b/searx/query.py
index 3d617ab05..b8afba6ed 100644
--- a/searx/query.py
+++ b/searx/query.py
@@ -25,8 +25,8 @@ import string
import re
-class Query(object):
- """parse query"""
+class RawTextQuery(object):
+ """parse raw text query (the value from the html input)"""
def __init__(self, query, disabled_engines):
self.query = query
@@ -130,3 +130,19 @@ class Query(object):
def getFullQuery(self):
# get full querry including whitespaces
return string.join(self.query_parts, '')
+
+
+class SearchQuery(object):
+ """container for all the search parameters (query, language, etc...)"""
+
+ def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range):
+ self.query = query
+ self.engines = engines
+ self.categories = categories
+ self.lang = lang
+ self.safesearch = safesearch
+ self.pageno = pageno
+ self.time_range = time_range
+
+ def __str__(self):
+ return str(self.query) + ";" + str(self.engines)
diff --git a/searx/results.py b/searx/results.py
index 9a4ec0b28..73a96c081 100644
--- a/searx/results.py
+++ b/searx/results.py
@@ -28,7 +28,7 @@ def compare_urls(url_a, url_b):
else:
host_b = url_b.netloc
- if host_a != host_b or url_a.query != url_b.query:
+ if host_a != host_b or url_a.query != url_b.query or url_a.fragment != url_b.fragment:
return False
# remove / from the end of the url if required
@@ -128,6 +128,8 @@ class ResultContainer(object):
self.suggestions = set()
self.answers = set()
self._number_of_results = []
+ self._ordered = False
+ self.paging = False
def extend(self, engine_name, results):
for result in list(results):
@@ -144,15 +146,19 @@ class ResultContainer(object):
self._number_of_results.append(result['number_of_results'])
results.remove(result)
- with RLock():
- engines[engine_name].stats['search_count'] += 1
- engines[engine_name].stats['result_count'] += len(results)
+ if engine_name in engines:
+ with RLock():
+ engines[engine_name].stats['search_count'] += 1
+ engines[engine_name].stats['result_count'] += len(results)
if not results:
return
self.results[engine_name].extend(results)
+ if not self.paging and engine_name in engines and engines[engine_name].paging:
+ self.paging = True
+
for i, result in enumerate(results):
try:
result['url'] = result['url'].decode('utf-8')
@@ -219,7 +225,7 @@ class ResultContainer(object):
with RLock():
self._merged_results.append(result)
- def get_ordered_results(self):
+ def order_results(self):
for result in self._merged_results:
score = result_score(result)
result['score'] = score
@@ -269,8 +275,14 @@ class ResultContainer(object):
# update categoryIndex
categoryPositions[category] = {'index': len(gresults), 'count': 8}
- # return gresults
- return gresults
+ # update _merged_results
+ self._ordered = True
+ self._merged_results = gresults
+
+ def get_ordered_results(self):
+ if not self._ordered:
+ self.order_results()
+ return self._merged_results
def results_length(self):
return len(self._merged_results)
diff --git a/searx/search.py b/searx/search.py
index 6de07d2b5..ee04b27f5 100644
--- a/searx/search.py
+++ b/searx/search.py
@@ -19,28 +19,70 @@ import gc
import threading
from thread import start_new_thread
from time import time
+from uuid import uuid4
import searx.poolrequests as requests_lib
from searx.engines import (
categories, engines
)
+from searx.answerers import ask
from searx.utils import gen_useragent
-from searx.query import Query
+from searx.query import RawTextQuery, SearchQuery
from searx.results import ResultContainer
from searx import logger
+from searx.plugins import plugins
logger = logger.getChild('search')
number_of_searches = 0
-def search_request_wrapper(fn, url, engine_name, **kwargs):
- ret = None
- engine = engines[engine_name]
+def send_http_request(engine, request_params, timeout_limit):
+ response = None
try:
- ret = fn(url, **kwargs)
+ # create dictionary which contain all
+ # informations about the request
+ request_args = dict(
+ headers=request_params['headers'],
+ cookies=request_params['cookies'],
+ timeout=timeout_limit,
+ verify=request_params['verify']
+ )
+ # specific type of request (GET or POST)
+ if request_params['method'] == 'GET':
+ req = requests_lib.get
+ else:
+ req = requests_lib.post
+ request_args['data'] = request_params['data']
+
+ # for page_load_time stats
+ time_before_request = time()
+
+ # send the request
+ response = req(request_params['url'], **request_args)
+
with threading.RLock():
+ # no error : reset the suspend variables
engine.continuous_errors = 0
engine.suspend_end_time = 0
+ # update stats with current page-load-time
+ # only the HTTP request
+ engine.stats['page_load_time'] += time() - time_before_request
+ engine.stats['page_load_count'] += 1
+
+ # is there a timeout (no parsing in this case)
+ timeout_overhead = 0.2 # seconds
+ search_duration = time() - request_params['started']
+ if search_duration > timeout_limit + timeout_overhead:
+ logger.exception('engine timeout on HTTP request:'
+ '{0} (search duration : {1} ms, time-out: {2} )'
+ .format(engine.name, search_duration, timeout_limit))
+ with threading.RLock():
+ engine.stats['errors'] += 1
+ return False
+
+ # everything is ok : return the response
+ return response
+
except:
# increase errors stats
with threading.RLock():
@@ -49,27 +91,73 @@ def search_request_wrapper(fn, url, engine_name, **kwargs):
engine.suspend_end_time = time() + min(60, engine.continuous_errors)
# print engine name and specific error message
- logger.exception('engine crash: {0}'.format(engine_name))
- return ret
+ logger.exception('engine crash: {0}'.format(engine.name))
+ return False
+
+
+def search_one_request(engine_name, query, request_params, result_container, timeout_limit):
+ engine = engines[engine_name]
+
+ # update request parameters dependent on
+ # search-engine (contained in engines folder)
+ engine.request(query, request_params)
+
+ # TODO add support of offline engines
+ if request_params['url'] is None:
+ return False
+
+ # ignoring empty urls
+ if not request_params['url']:
+ return False
+
+ # send request
+ response = send_http_request(engine, request_params, timeout_limit)
+
+ # parse response
+ success = None
+ if response:
+ # parse the response
+ response.search_params = request_params
+ try:
+ search_results = engine.response(response)
+ except:
+ logger.exception('engine crash: {0}'.format(engine.name))
+ search_results = []
+
+ # add results
+ for result in search_results:
+ result['engine'] = engine.name
+
+ result_container.extend(engine.name, search_results)
+
+ success = True
+ else:
+ success = False
+ with threading.RLock():
+ # update stats : total time
+ engine.stats['engine_time'] += time() - request_params['started']
+ engine.stats['engine_time_count'] += 1
-def threaded_requests(requests):
- timeout_limit = max(r[2]['timeout'] for r in requests)
- search_start = time()
- for fn, url, request_args, engine_name in requests:
- request_args['timeout'] = timeout_limit
+ return success
+
+
+def search_multiple_requests(requests, result_container, timeout_limit):
+ start_time = time()
+ search_id = uuid4().__str__()
+
+ for engine_name, query, request_params in requests:
th = threading.Thread(
- target=search_request_wrapper,
- args=(fn, url, engine_name),
- kwargs=request_args,
- name='search_request',
+ target=search_one_request,
+ args=(engine_name, query, request_params, result_container, timeout_limit),
+ name=search_id,
)
th._engine_name = engine_name
th.start()
for th in threading.enumerate():
- if th.name == 'search_request':
- remaining_time = max(0.0, timeout_limit - (time() - search_start))
+ if th.name == search_id:
+ remaining_time = max(0.0, timeout_limit - (time() - start_time))
th.join(remaining_time)
if th.isAlive():
logger.warning('engine timeout: {0}'.format(th._engine_name))
@@ -87,175 +175,142 @@ def default_request_params():
}
-# create a callback wrapper for the search engine results
-def make_callback(engine_name, callback, params, result_container):
-
- # creating a callback wrapper for the search engine results
- def process_callback(response, **kwargs):
- # check if redirect comparing to the True value,
- # because resp can be a Mock object, and any attribut name returns something.
- if response.is_redirect is True:
- logger.debug('{0} redirect on: {1}'.format(engine_name, response))
- return
-
- response.search_params = params
-
- search_duration = time() - params['started']
- # update stats with current page-load-time
- with threading.RLock():
- engines[engine_name].stats['page_load_time'] += search_duration
-
- timeout_overhead = 0.2 # seconds
- timeout_limit = engines[engine_name].timeout + timeout_overhead
-
- if search_duration > timeout_limit:
- with threading.RLock():
- engines[engine_name].stats['errors'] += 1
- return
-
- # callback
- search_results = callback(response)
-
- # add results
- for result in search_results:
- result['engine'] = engine_name
-
- result_container.extend(engine_name, search_results)
-
- return process_callback
-
-
-class Search(object):
-
- """Search information container"""
-
- def __init__(self, request):
- # init vars
- super(Search, self).__init__()
- self.query = None
- self.engines = []
- self.categories = []
- self.paging = False
- self.pageno = 1
- self.lang = 'all'
- self.time_range = None
- self.is_advanced = None
-
- # set blocked engines
- self.disabled_engines = request.preferences.engines.get_disabled()
-
- self.result_container = ResultContainer()
- self.request_data = {}
-
- # set specific language if set
- self.lang = request.preferences.get_value('language')
-
- # set request method
- if request.method == 'POST':
- self.request_data = request.form
- else:
- self.request_data = request.args
-
- # TODO better exceptions
- if not self.request_data.get('q'):
- raise Exception('noquery')
-
- # set pagenumber
- pageno_param = self.request_data.get('pageno', '1')
- if not pageno_param.isdigit() or int(pageno_param) < 1:
- pageno_param = 1
-
- self.pageno = int(pageno_param)
-
- # parse query, if tags are set, which change
- # the serch engine or search-language
- query_obj = Query(self.request_data['q'], self.disabled_engines)
- query_obj.parse_query()
-
- # set query
- self.query = query_obj.getSearchQuery()
-
- # get last selected language in query, if possible
- # TODO support search with multible languages
- if len(query_obj.languages):
- self.lang = query_obj.languages[-1]
-
- self.time_range = self.request_data.get('time_range')
- self.is_advanced = self.request_data.get('advanced_search')
-
- self.engines = query_obj.engines
-
- # if engines are calculated from query,
- # set categories by using that informations
- if self.engines and query_obj.specific:
- self.categories = list(set(engine['category']
- for engine in self.engines))
-
- # otherwise, using defined categories to
- # calculate which engines should be used
+def get_search_query_from_webapp(preferences, form):
+ query = None
+ query_engines = []
+ query_categories = []
+ query_pageno = 1
+ query_lang = 'all'
+ query_time_range = None
+
+ # set blocked engines
+ disabled_engines = preferences.engines.get_disabled()
+
+ # set specific language if set
+ query_lang = preferences.get_value('language')
+
+ # safesearch
+ query_safesearch = preferences.get_value('safesearch')
+
+ # TODO better exceptions
+ if not form.get('q'):
+ raise Exception('noquery')
+
+ # set pagenumber
+ pageno_param = form.get('pageno', '1')
+ if not pageno_param.isdigit() or int(pageno_param) < 1:
+ pageno_param = 1
+
+ query_pageno = int(pageno_param)
+
+ # parse query, if tags are set, which change
+ # the serch engine or search-language
+ raw_text_query = RawTextQuery(form['q'], disabled_engines)
+ raw_text_query.parse_query()
+
+ # set query
+ query = raw_text_query.getSearchQuery()
+
+ # get last selected language in query, if possible
+ # TODO support search with multible languages
+ if len(raw_text_query.languages):
+ query_lang = raw_text_query.languages[-1]
+
+ query_time_range = form.get('time_range')
+
+ query_engines = raw_text_query.engines
+
+ # if engines are calculated from query,
+ # set categories by using that informations
+ if query_engines and raw_text_query.specific:
+ query_categories = list(set(engine['category']
+ for engine in query_engines))
+
+ # otherwise, using defined categories to
+ # calculate which engines should be used
+ else:
+ # set categories/engines
+ load_default_categories = True
+ for pd_name, pd in form.items():
+ if pd_name == 'categories':
+ query_categories.extend(categ for categ in map(unicode.strip, pd.split(',')) if categ in categories)
+ elif pd_name == 'engines':
+ pd_engines = [{'category': engines[engine].categories[0],
+ 'name': engine}
+ for engine in map(unicode.strip, pd.split(',')) if engine in engines]
+ if pd_engines:
+ query_engines.extend(pd_engines)
+ load_default_categories = False
+ elif pd_name.startswith('category_'):
+ category = pd_name[9:]
+
+ # if category is not found in list, skip
+ if category not in categories:
+ continue
+
+ if pd != 'off':
+ # add category to list
+ query_categories.append(category)
+ elif category in query_categories:
+ # remove category from list if property is set to 'off'
+ query_categories.remove(category)
+
+ if not load_default_categories:
+ if not query_categories:
+ query_categories = list(set(engine['category']
+ for engine in query_engines))
else:
- # set categories/engines
- load_default_categories = True
- for pd_name, pd in self.request_data.items():
- if pd_name == 'categories':
- self.categories.extend(categ for categ in map(unicode.strip, pd.split(',')) if categ in categories)
- elif pd_name == 'engines':
- pd_engines = [{'category': engines[engine].categories[0],
- 'name': engine}
- for engine in map(unicode.strip, pd.split(',')) if engine in engines]
- if pd_engines:
- self.engines.extend(pd_engines)
- load_default_categories = False
- elif pd_name.startswith('category_'):
- category = pd_name[9:]
-
- # if category is not found in list, skip
- if category not in categories:
- continue
-
- if pd != 'off':
- # add category to list
- self.categories.append(category)
- elif category in self.categories:
- # remove category from list if property is set to 'off'
- self.categories.remove(category)
-
- if not load_default_categories:
- if not self.categories:
- self.categories = list(set(engine['category']
- for engine in self.engines))
- return
-
# if no category is specified for this search,
# using user-defined default-configuration which
# (is stored in cookie)
- if not self.categories:
- cookie_categories = request.preferences.get_value('categories')
+ if not query_categories:
+ cookie_categories = preferences.get_value('categories')
for ccateg in cookie_categories:
if ccateg in categories:
- self.categories.append(ccateg)
+ query_categories.append(ccateg)
# if still no category is specified, using general
# as default-category
- if not self.categories:
- self.categories = ['general']
+ if not query_categories:
+ query_categories = ['general']
# using all engines for that search, which are
# declared under the specific categories
- for categ in self.categories:
- self.engines.extend({'category': categ,
- 'name': engine.name}
- for engine in categories[categ]
- if (engine.name, categ) not in self.disabled_engines)
+ for categ in query_categories:
+ query_engines.extend({'category': categ,
+ 'name': engine.name}
+ for engine in categories[categ]
+ if (engine.name, categ) not in disabled_engines)
- # remove suspended engines
- self.engines = [e for e in self.engines
- if engines[e['name']].suspend_end_time <= time()]
+ return SearchQuery(query, query_engines, query_categories,
+ query_lang, query_safesearch, query_pageno, query_time_range)
+
+
+class Search(object):
+
+ """Search information container"""
+
+ def __init__(self, search_query):
+ # init vars
+ super(Search, self).__init__()
+ self.search_query = search_query
+ self.result_container = ResultContainer()
# do search-request
- def search(self, request):
+ def search(self):
global number_of_searches
+ # start time
+ start_time = time()
+
+ # answeres ?
+ answerers_results = ask(self.search_query)
+
+ if answerers_results:
+ for results in answerers_results:
+ self.result_container.extend('answer', results)
+ return self.result_container
+
# init vars
requests = []
@@ -266,88 +321,84 @@ class Search(object):
# user_agent = request.headers.get('User-Agent', '')
user_agent = gen_useragent()
+ search_query = self.search_query
+
+ # max of all selected engine timeout
+ timeout_limit = 0
+
# start search-reqest for all selected engines
- for selected_engine in self.engines:
+ for selected_engine in search_query.engines:
if selected_engine['name'] not in engines:
continue
engine = engines[selected_engine['name']]
+ # skip suspended engines
+ if engine.suspend_end_time >= time():
+ logger.debug('Engine currently suspended: %s', selected_engine['name'])
+ continue
+
# if paging is not supported, skip
- if self.pageno > 1 and not engine.paging:
+ if search_query.pageno > 1 and not engine.paging:
continue
# if search-language is set and engine does not
# provide language-support, skip
- if self.lang != 'all' and not engine.language_support:
+ if search_query.lang != 'all' and not engine.language_support:
continue
- if self.time_range and not engine.time_range_support:
+ # if time_range is not supported, skip
+ if search_query.time_range and not engine.time_range_support:
continue
# set default request parameters
request_params = default_request_params()
request_params['headers']['User-Agent'] = user_agent
request_params['category'] = selected_engine['category']
- request_params['started'] = time()
- request_params['pageno'] = self.pageno
+ request_params['started'] = start_time
+ request_params['pageno'] = search_query.pageno
if hasattr(engine, 'language') and engine.language:
request_params['language'] = engine.language
else:
- request_params['language'] = self.lang
+ request_params['language'] = search_query.lang
# 0 = None, 1 = Moderate, 2 = Strict
- request_params['safesearch'] = request.preferences.get_value('safesearch')
- request_params['time_range'] = self.time_range
- request_params['advanced_search'] = self.is_advanced
-
- # update request parameters dependent on
- # search-engine (contained in engines folder)
- engine.request(self.query.encode('utf-8'), request_params)
-
- if request_params['url'] is None:
- # TODO add support of offline engines
- pass
-
- # create a callback wrapper for the search engine results
- callback = make_callback(
- selected_engine['name'],
- engine.response,
- request_params,
- self.result_container)
-
- # create dictionary which contain all
- # informations about the request
- request_args = dict(
- headers=request_params['headers'],
- hooks=dict(response=callback),
- cookies=request_params['cookies'],
- timeout=engine.timeout,
- verify=request_params['verify']
- )
-
- # specific type of request (GET or POST)
- if request_params['method'] == 'GET':
- req = requests_lib.get
- else:
- req = requests_lib.post
- request_args['data'] = request_params['data']
-
- # ignoring empty urls
- if not request_params['url']:
- continue
+ request_params['safesearch'] = search_query.safesearch
+ request_params['time_range'] = search_query.time_range
# append request to list
- requests.append((req, request_params['url'],
- request_args,
- selected_engine['name']))
+ requests.append((selected_engine['name'], search_query.query.encode('utf-8'), request_params))
+
+ # update timeout_limit
+ timeout_limit = max(timeout_limit, engine.timeout)
- if not requests:
- return self
- # send all search-request
- threaded_requests(requests)
- start_new_thread(gc.collect, tuple())
+ if requests:
+ # send all search-request
+ search_multiple_requests(requests, self.result_container, timeout_limit - (time() - start_time))
+ start_new_thread(gc.collect, tuple())
# return results, suggestions, answers and infoboxes
- return self
+ return self.result_container
+
+
+class SearchWithPlugins(Search):
+
+ """Similar to the Search class but call the plugins."""
+
+ def __init__(self, search_query, request):
+ super(SearchWithPlugins, self).__init__(search_query)
+ self.request = request
+
+ def search(self):
+ if plugins.call('pre_search', self.request, self):
+ super(SearchWithPlugins, self).search()
+
+ plugins.call('post_search', self.request, self)
+
+ results = self.result_container.get_ordered_results()
+
+ for result in results:
+ plugins.call('on_result', self.request, self, result)
+
+ return self.result_container
diff --git a/searx/settings.yml b/searx/settings.yml
index b875c5b12..527c80829 100644
--- a/searx/settings.yml
+++ b/searx/settings.yml
@@ -5,6 +5,7 @@ general:
search:
safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default
+ language : "all"
server:
port : 8888
@@ -18,6 +19,12 @@ ui:
default_theme : oscar # ui theme
default_locale : "" # Default interface locale - leave blank to detect from browser information or use codes from the 'locales' config section
+# searx supports result proxification using an external service: https://github.com/asciimoo/morty
+# uncomment below section if you have running morty proxy
+#result_proxy:
+# url : http://127.0.0.1:3000/
+# key : your_morty_proxy_key
+
outgoing: # communication with search engines
request_timeout : 2.0 # seconds
useragent_suffix : "" # suffix of searx_useragent, could contain informations like an email address to the administrator
@@ -25,7 +32,7 @@ outgoing: # communication with search engines
pool_maxsize : 10 # Number of simultaneous requests by host
# uncomment below section if you want to use a proxy
# see http://docs.python-requests.org/en/latest/user/advanced/#proxies
-# SOCKS proxies are not supported : see https://github.com/kennethreitz/requests/pull/478
+# SOCKS proxies are also supported: see http://docs.python-requests.org/en/master/user/advanced/#socks
# proxies :
# http : http://127.0.0.1:8080
# https: http://127.0.0.1:8080
@@ -84,10 +91,6 @@ engines:
disabled : True
shortcut : bb
- - name : btdigg
- engine : btdigg
- shortcut : bt
-
- name : crossref
engine : json_engine
paging : True
@@ -118,6 +121,12 @@ engines:
weight : 2
disabled : True
+ - name : digbt
+ engine : digbt
+ shortcut : dbt
+ timeout : 6.0
+ disabled : True
+
- name : digg
engine : digg
shortcut : dg
@@ -194,6 +203,7 @@ engines:
- name : gigablast
engine : gigablast
shortcut : gb
+ timeout : 3.0
disabled: True
- name : gitlab
@@ -252,8 +262,8 @@ engines:
engine : xpath
search_url : https://play.google.com/store/search?q={query}&c=movies
url_xpath : //a[@class="title"]/@href
- title_xpath : //a[@class="title"]
- content_xpath : //a[@class="subtitle"]
+ title_xpath : //a[@class="title"]/@title
+ content_xpath : //a[contains(@class, "subtitle")]
categories : videos
shortcut : gpm
disabled : True
@@ -284,20 +294,48 @@ engines:
engine : xpath
paging : True
search_url : https://habrahabr.ru/search/page{pageno}/?q={query}
- url_xpath : //div[@class="search_results"]//a[@class="post_title"]/@href
- title_xpath : //div[@class="search_results"]//a[@class="post_title"]
+ url_xpath : //div[@class="search_results"]//a[contains(@class, "post__title_link")]/@href
+ title_xpath : //div[@class="search_results"]//a[contains(@class, "post__title_link")]
content_xpath : //div[@class="search_results"]//div[contains(@class, "content")]
categories : it
timeout : 4.0
disabled : True
shortcut : habr
+ - name : hoogle
+ engine : json_engine
+ paging : True
+ search_url : https://www.haskell.org/hoogle/?mode=json&hoogle={query}&start={pageno}
+ results_query : results
+ url_query : location
+ title_query : self
+ content_query : docs
+ page_size : 20
+ categories : it
+ shortcut : ho
+
- name : ina
engine : ina
shortcut : in
timeout : 6.0
disabled : True
+ - name: kickass
+ engine : kickass
+ shortcut : kc
+ timeout : 4.0
+ disabled : True
+
+ - name : lobste.rs
+ engine : xpath
+ search_url : https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance
+ results_xpath : //li[contains(@class, "story")]
+ url_xpath : .//span[@class="link"]/a/@href
+ title_xpath : .//span[@class="link"]/a
+ content_xpath : .//a[@class="domain"]
+ categories : it
+ shortcut : lo
+
- name : microsoft academic
engine : json_engine
paging : True
@@ -336,6 +374,13 @@ engines:
disabled : True
shortcut : or
+ - name : pdbe
+ engine : pdbe
+ shortcut : pdb
+# Hide obsolete PDB entries.
+# Default is not to hide obsolete structures
+# hide_obsolete : False
+
- name : photon
engine : photon
shortcut : ph
@@ -343,7 +388,8 @@ engines:
- name : piratebay
engine : piratebay
shortcut : tpb
- disabled : True
+ url: https://pirateproxy.red/
+ timeout : 3.0
- name : qwant
engine : qwant
@@ -373,7 +419,7 @@ engines:
timeout : 10.0
disabled : True
- - name : scanr_structures
+ - name : scanr structures
shortcut: scs
engine : scanr_structures
disabled : True
@@ -414,8 +460,8 @@ engines:
- name : ixquick
engine : startpage
- base_url : 'https://www.ixquick.com/'
- search_url : 'https://www.ixquick.com/do/search'
+ base_url : 'https://www.ixquick.eu/'
+ search_url : 'https://www.ixquick.eu/do/search'
shortcut : iq
timeout : 6.0
disabled : True
@@ -431,11 +477,6 @@ engines:
timeout : 6.0
disabled : True
- - name : torrentz
- engine : torrentz
- timeout : 5.0
- shortcut : to
-
- name : twitter
engine : twitter
shortcut : tw
@@ -451,9 +492,9 @@ engines:
# - name : urbandictionary
# engine : xpath
# search_url : http://www.urbandictionary.com/define.php?term={query}
-# url_xpath : //div[@class="word"]//a/@href
-# title_xpath : //div[@class="word"]//a
-# content_xpath : //div[@class="definition"]
+# url_xpath : //*[@class="word"]/@href
+# title_xpath : //*[@class="def-header"]
+# content_xpath : //*[@class="meaning"]
# shortcut : ud
- name : yahoo
@@ -496,6 +537,37 @@ engines:
timeout: 6.0
categories : science
+ - name : seedpeer
+ engine : seedpeer
+ shortcut: speu
+ categories: files, music, videos
+ disabled: True
+
+ - name : dictzone
+ engine : dictzone
+ shortcut : dc
+
+ - name : mymemory translated
+ engine : translated
+ shortcut : tl
+ timeout : 5.0
+ disabled : True
+ # You can use without an API key, but you are limited to 1000 words/day
+ # See : http://mymemory.translated.net/doc/usagelimits.php
+ # api_key : ''
+
+ - name : voat
+ engine: xpath
+ shortcut: vo
+ categories: social media
+ search_url : https://voat.co/search?q={query}
+ url_xpath : //p[contains(@class, "title")]/a/@href
+ title_xpath : //p[contains(@class, "title")]/a
+ content_xpath : //span[@class="domain"]
+ timeout : 10.0
+ disabled : True
+
+
#The blekko technology and team have joined IBM Watson! -> https://blekko.com/
# - name : blekko images
# engine : blekko_images
diff --git a/searx/settings_robot.yml b/searx/settings_robot.yml
index 7c7c4eec2..7d2701449 100644
--- a/searx/settings_robot.yml
+++ b/searx/settings_robot.yml
@@ -5,6 +5,7 @@ general:
search:
safe_search : 0
autocomplete : ""
+ language: "all"
server:
port : 11111
@@ -15,7 +16,7 @@ server:
ui:
themes_path : ""
- default_theme : default
+ default_theme : legacy
default_locale : ""
outgoing:
@@ -23,12 +24,12 @@ outgoing:
useragent_suffix : ""
engines:
- - name : general_dummy
+ - name : general dummy
engine : dummy
categories : general
shortcut : gd
- - name : dummy_dummy
+ - name : dummy dummy
engine : dummy
categories : dummy
shortcut : dd
diff --git a/searx/static/plugins/js/infinite_scroll.js b/searx/static/plugins/js/infinite_scroll.js
index 213f74b15..9cd582d7f 100644
--- a/searx/static/plugins/js/infinite_scroll.js
+++ b/searx/static/plugins/js/infinite_scroll.js
@@ -5,7 +5,7 @@ $(document).ready(function() {
var formData = $('#pagination form:last').serialize();
if (formData) {
$('#pagination').html('<div class="loading-spinner"></div>');
- $.post('/', formData, function (data) {
+ $.post('./', formData, function (data) {
var body = $(data);
$('#pagination').remove();
$('#main_results').append('<hr/>');
diff --git a/searx/static/themes/default/css/style-rtl.css b/searx/static/themes/legacy/css/style-rtl.css
index 65ad6638e..65ad6638e 100644
--- a/searx/static/themes/default/css/style-rtl.css
+++ b/searx/static/themes/legacy/css/style-rtl.css
diff --git a/searx/static/themes/default/css/style.css b/searx/static/themes/legacy/css/style.css
index 71422bc94..71422bc94 100644
--- a/searx/static/themes/default/css/style.css
+++ b/searx/static/themes/legacy/css/style.css
diff --git a/searx/static/themes/default/img/favicon.png b/searx/static/themes/legacy/img/favicon.png
index 1a43d7fa6..1a43d7fa6 100644
--- a/searx/static/themes/default/img/favicon.png
+++ b/searx/static/themes/legacy/img/favicon.png
Binary files differ
diff --git a/searx/static/themes/default/img/github_ribbon.png b/searx/static/themes/legacy/img/github_ribbon.png
index 3799c2ea1..3799c2ea1 100644
--- a/searx/static/themes/default/img/github_ribbon.png
+++ b/searx/static/themes/legacy/img/github_ribbon.png
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_500px.ico b/searx/static/themes/legacy/img/icons/icon_500px.ico
index b01aa20b5..b01aa20b5 100644
--- a/searx/static/themes/default/img/icons/icon_500px.ico
+++ b/searx/static/themes/legacy/img/icons/icon_500px.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_bing.ico b/searx/static/themes/legacy/img/icons/icon_bing.ico
index 5702749c1..5702749c1 100644
--- a/searx/static/themes/default/img/icons/icon_bing.ico
+++ b/searx/static/themes/legacy/img/icons/icon_bing.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_dailymotion.ico b/searx/static/themes/legacy/img/icons/icon_dailymotion.ico
index b161a57fb..b161a57fb 100644
--- a/searx/static/themes/default/img/icons/icon_dailymotion.ico
+++ b/searx/static/themes/legacy/img/icons/icon_dailymotion.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_deezer.ico b/searx/static/themes/legacy/img/icons/icon_deezer.ico
index d38c9b1f6..d38c9b1f6 100644
--- a/searx/static/themes/default/img/icons/icon_deezer.ico
+++ b/searx/static/themes/legacy/img/icons/icon_deezer.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_deviantart.ico b/searx/static/themes/legacy/img/icons/icon_deviantart.ico
index 26c353325..26c353325 100644
--- a/searx/static/themes/default/img/icons/icon_deviantart.ico
+++ b/searx/static/themes/legacy/img/icons/icon_deviantart.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_digg.ico b/searx/static/themes/legacy/img/icons/icon_digg.ico
index 162e57038..162e57038 100644
--- a/searx/static/themes/default/img/icons/icon_digg.ico
+++ b/searx/static/themes/legacy/img/icons/icon_digg.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_duckduckgo.ico b/searx/static/themes/legacy/img/icons/icon_duckduckgo.ico
index d093082cb..d093082cb 100644
--- a/searx/static/themes/default/img/icons/icon_duckduckgo.ico
+++ b/searx/static/themes/legacy/img/icons/icon_duckduckgo.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_flickr.ico b/searx/static/themes/legacy/img/icons/icon_flickr.ico
index e2304c587..e2304c587 100644
--- a/searx/static/themes/default/img/icons/icon_flickr.ico
+++ b/searx/static/themes/legacy/img/icons/icon_flickr.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_github.ico b/searx/static/themes/legacy/img/icons/icon_github.ico
index 133f0ca35..133f0ca35 100644
--- a/searx/static/themes/default/img/icons/icon_github.ico
+++ b/searx/static/themes/legacy/img/icons/icon_github.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_google play apps.ico b/searx/static/themes/legacy/img/icons/icon_google play apps.ico
index 74c84470b..74c84470b 100644
--- a/searx/static/themes/default/img/icons/icon_google play apps.ico
+++ b/searx/static/themes/legacy/img/icons/icon_google play apps.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_google play movies.ico b/searx/static/themes/legacy/img/icons/icon_google play movies.ico
index 74c84470b..74c84470b 100644
--- a/searx/static/themes/default/img/icons/icon_google play movies.ico
+++ b/searx/static/themes/legacy/img/icons/icon_google play movies.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_google play music.ico b/searx/static/themes/legacy/img/icons/icon_google play music.ico
index 74c84470b..74c84470b 100644
--- a/searx/static/themes/default/img/icons/icon_google play music.ico
+++ b/searx/static/themes/legacy/img/icons/icon_google play music.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_google.ico b/searx/static/themes/legacy/img/icons/icon_google.ico
index f594697d2..f594697d2 100644
--- a/searx/static/themes/default/img/icons/icon_google.ico
+++ b/searx/static/themes/legacy/img/icons/icon_google.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_kickass.ico b/searx/static/themes/legacy/img/icons/icon_kickass.ico
index 4aa2c77a5..4aa2c77a5 100644
--- a/searx/static/themes/default/img/icons/icon_kickass.ico
+++ b/searx/static/themes/legacy/img/icons/icon_kickass.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_openstreetmap.ico b/searx/static/themes/legacy/img/icons/icon_openstreetmap.ico
index b65863656..b65863656 100644
--- a/searx/static/themes/default/img/icons/icon_openstreetmap.ico
+++ b/searx/static/themes/legacy/img/icons/icon_openstreetmap.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_searchcode code.ico b/searx/static/themes/legacy/img/icons/icon_searchcode code.ico
index dc099ef70..dc099ef70 100644
--- a/searx/static/themes/default/img/icons/icon_searchcode code.ico
+++ b/searx/static/themes/legacy/img/icons/icon_searchcode code.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_searchcode doc.ico b/searx/static/themes/legacy/img/icons/icon_searchcode doc.ico
index dc099ef70..dc099ef70 100644
--- a/searx/static/themes/default/img/icons/icon_searchcode doc.ico
+++ b/searx/static/themes/legacy/img/icons/icon_searchcode doc.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_searchcode.ico b/searx/static/themes/legacy/img/icons/icon_searchcode.ico
index dc099ef70..dc099ef70 100644
--- a/searx/static/themes/default/img/icons/icon_searchcode.ico
+++ b/searx/static/themes/legacy/img/icons/icon_searchcode.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_soundcloud.ico b/searx/static/themes/legacy/img/icons/icon_soundcloud.ico
index 4130bea1b..4130bea1b 100644
--- a/searx/static/themes/default/img/icons/icon_soundcloud.ico
+++ b/searx/static/themes/legacy/img/icons/icon_soundcloud.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_stackoverflow.ico b/searx/static/themes/legacy/img/icons/icon_stackoverflow.ico
index b2242bc6c..b2242bc6c 100644
--- a/searx/static/themes/default/img/icons/icon_stackoverflow.ico
+++ b/searx/static/themes/legacy/img/icons/icon_stackoverflow.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_startpage.ico b/searx/static/themes/legacy/img/icons/icon_startpage.ico
index 44b94a986..44b94a986 100644
--- a/searx/static/themes/default/img/icons/icon_startpage.ico
+++ b/searx/static/themes/legacy/img/icons/icon_startpage.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_subtitleseeker.ico b/searx/static/themes/legacy/img/icons/icon_subtitleseeker.ico
index 9a0565558..9a0565558 100644
--- a/searx/static/themes/default/img/icons/icon_subtitleseeker.ico
+++ b/searx/static/themes/legacy/img/icons/icon_subtitleseeker.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_twitter.ico b/searx/static/themes/legacy/img/icons/icon_twitter.ico
index b4a71699a..b4a71699a 100644
--- a/searx/static/themes/default/img/icons/icon_twitter.ico
+++ b/searx/static/themes/legacy/img/icons/icon_twitter.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_vimeo.ico b/searx/static/themes/legacy/img/icons/icon_vimeo.ico
index 4fe4336da..4fe4336da 100644
--- a/searx/static/themes/default/img/icons/icon_vimeo.ico
+++ b/searx/static/themes/legacy/img/icons/icon_vimeo.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_wikipedia.ico b/searx/static/themes/legacy/img/icons/icon_wikipedia.ico
index e70021849..e70021849 100644
--- a/searx/static/themes/default/img/icons/icon_wikipedia.ico
+++ b/searx/static/themes/legacy/img/icons/icon_wikipedia.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_yahoo.ico b/searx/static/themes/legacy/img/icons/icon_yahoo.ico
index 9bd1d9f7c..9bd1d9f7c 100644
--- a/searx/static/themes/default/img/icons/icon_yahoo.ico
+++ b/searx/static/themes/legacy/img/icons/icon_yahoo.ico
Binary files differ
diff --git a/searx/static/themes/default/img/icons/icon_youtube.ico b/searx/static/themes/legacy/img/icons/icon_youtube.ico
index 977887dbb..977887dbb 100644
--- a/searx/static/themes/default/img/icons/icon_youtube.ico
+++ b/searx/static/themes/legacy/img/icons/icon_youtube.ico
Binary files differ
diff --git a/searx/static/themes/default/img/preference-icon.png b/searx/static/themes/legacy/img/preference-icon.png
index 8bdee641d..8bdee641d 100644
--- a/searx/static/themes/default/img/preference-icon.png
+++ b/searx/static/themes/legacy/img/preference-icon.png
Binary files differ
diff --git a/searx/static/themes/default/img/search-icon.png b/searx/static/themes/legacy/img/search-icon.png
index d70310b5d..d70310b5d 100644
--- a/searx/static/themes/default/img/search-icon.png
+++ b/searx/static/themes/legacy/img/search-icon.png
Binary files differ
diff --git a/searx/static/themes/default/img/searx.png b/searx/static/themes/legacy/img/searx.png
index a98f12a1d..a98f12a1d 100644
--- a/searx/static/themes/default/img/searx.png
+++ b/searx/static/themes/legacy/img/searx.png
Binary files differ
diff --git a/searx/static/themes/default/img/searx_logo.svg b/searx/static/themes/legacy/img/searx_logo.svg
index 67a2d4588..67a2d4588 100644
--- a/searx/static/themes/default/img/searx_logo.svg
+++ b/searx/static/themes/legacy/img/searx_logo.svg
diff --git a/searx/static/themes/default/js/searx.js b/searx/static/themes/legacy/js/searx.js
index d6d5b74bb..d6d5b74bb 100644
--- a/searx/static/themes/default/js/searx.js
+++ b/searx/static/themes/legacy/js/searx.js
diff --git a/searx/static/themes/default/less/autocompleter.less b/searx/static/themes/legacy/less/autocompleter.less
index db9601aeb..db9601aeb 100644
--- a/searx/static/themes/default/less/autocompleter.less
+++ b/searx/static/themes/legacy/less/autocompleter.less
diff --git a/searx/static/themes/default/less/code.less b/searx/static/themes/legacy/less/code.less
index a688dd98d..a688dd98d 100644
--- a/searx/static/themes/default/less/code.less
+++ b/searx/static/themes/legacy/less/code.less
diff --git a/searx/static/themes/default/less/definitions.less b/searx/static/themes/legacy/less/definitions.less
index 0ac0cc90c..0ac0cc90c 100644
--- a/searx/static/themes/default/less/definitions.less
+++ b/searx/static/themes/legacy/less/definitions.less
diff --git a/searx/static/themes/default/less/mixins.less b/searx/static/themes/legacy/less/mixins.less
index dbccce6e3..dbccce6e3 100644
--- a/searx/static/themes/default/less/mixins.less
+++ b/searx/static/themes/legacy/less/mixins.less
diff --git a/searx/static/themes/default/less/search.less b/searx/static/themes/legacy/less/search.less
index d285ca734..d285ca734 100644
--- a/searx/static/themes/default/less/search.less
+++ b/searx/static/themes/legacy/less/search.less
diff --git a/searx/static/themes/default/less/style-rtl.less b/searx/static/themes/legacy/less/style-rtl.less
index eac53c1f8..eac53c1f8 100644
--- a/searx/static/themes/default/less/style-rtl.less
+++ b/searx/static/themes/legacy/less/style-rtl.less
diff --git a/searx/static/themes/default/less/style.less b/searx/static/themes/legacy/less/style.less
index 4374f7d68..4374f7d68 100644
--- a/searx/static/themes/default/less/style.less
+++ b/searx/static/themes/legacy/less/style.less
diff --git a/searx/static/themes/oscar/css/logicodev.min.css b/searx/static/themes/oscar/css/logicodev.min.css
index 195385bba..33d451b8f 100644
--- a/searx/static/themes/oscar/css/logicodev.min.css
+++ b/searx/static/themes/oscar/css/logicodev.min.css
@@ -1 +1 @@
-.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{background:#29314d;color:#01d7d4}.navbar>li>a{padding:0;margin:0}.navbar-nav>li>a{background:#29314d;padding:0 8px;margin:0;line-height:30px}.navbar,.navbar-default{background-color:#29314d;border:none;border-top:4px solid #01d7d4;padding-top:5px;color:#f6f9fa!important;font-weight:700;font-size:1.1em;text-transform:lowercase;margin-bottom:24px;height:30px;line-height:30px;z-index:10}.navbar .navbar-nav>li>a,.navbar-default .navbar-nav>li>a{color:#f6f9fa}.navbar .navbar-brand,.navbar-default .navbar-brand{font-weight:700;color:#01d7d4;line-height:30px;padding:0 30px;margin:0}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#01d7d4;background:#29314d}.navbar-toggle{margin-top:0}*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:6px;margin-bottom:4px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight{font-weight:700}.external-link,.external-link a{color:#2ecc71}.external-link a,.external-link a a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;height:170px;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#advanced-search-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;padding-bottom:.4rem;padding-top:.4rem;padding-left:1rem;padding-right:5rem;margin-right:.5rem;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700} \ No newline at end of file
+.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{background:#29314d;color:#01d7d4}.navbar>li>a{padding:0;margin:0}.navbar-nav>li>a{background:#29314d;padding:0 8px;margin:0;line-height:30px}.navbar,.navbar-default,.menu{background-color:#29314d;border:none;border-top:4px solid #01d7d4;padding-top:5px;color:#f6f9fa!important;font-weight:700;font-size:1.1em;text-transform:lowercase;margin-bottom:24px;height:30px;line-height:30px;z-index:10}.navbar .navbar-nav>li>a,.navbar-default .navbar-nav>li>a,.menu .navbar-nav>li>a{color:#f6f9fa}.navbar .navbar-brand,.navbar-default .navbar-brand,.menu .navbar-brand{font-weight:700;color:#01d7d4;line-height:30px;padding:0 30px;margin:0}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#01d7d4;background:#29314d}.navbar-toggle{margin-top:0}.menu{margin:0;padding:0;position:absolute;top:4px;border:0;z-index:1000000000;height:40px;line-height:40px}.menu ul{padding:0;margin:0}.menu ul li{padding:0 .6em;margin:0;float:left;list-style:none}.menu ul li a{color:#f6f9fa}.menu ul li.active a{color:#01d7d4}.menu-right{right:2em}.menu-left{left:2em}*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:6px;margin-bottom:4px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight{font-weight:700}.external-link,.external-link a{color:#2ecc71}.external-link a,.external-link a a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#advanced-search-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;padding-bottom:.4rem;padding-top:.4rem;padding-left:1rem;padding-right:5rem;margin-right:.5rem;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700} \ No newline at end of file
diff --git a/searx/static/themes/oscar/css/pointhi.min.css b/searx/static/themes/oscar/css/pointhi.min.css
index 389add2b9..921d60a32 100644
--- a/searx/static/themes/oscar/css/pointhi.min.css
+++ b/searx/static/themes/oscar/css/pointhi.min.css
@@ -1 +1 @@
-html{position:relative;min-height:100%}body{margin-bottom:80px}.footer{position:absolute;bottom:0;width:100%;height:60px}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#0C0;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-bottom:5px;margin-top:20px}.result_header .favicon{margin-bottom:-3px}.result_header a{vertical-align:bottom}.result_header a .highlight{font-weight:700}.result-content{margin-top:5px;word-wrap:break-word}.result-content .highlight{font-weight:700}.result-default{clear:both}.result-images{float:left!important}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-torrents{clear:both}.result-map{clear:both}.result-code{clear:both}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:50px}.label-default{color:#AAA;background:#FFF}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:1.5rem;margin-top:1.5rem;display:flex;flex-wrap:wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-top:.8rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#DDD 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#000;font-weight:700;background-color:#EEE}#advanced-search-container{display:none;text-align:center;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-left:1.2rem;padding-right:1.2rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#DDD 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#000;font-weight:700;background-color:#EEE}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#408080;font-style:italic}.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:green;font-weight:700}.highlight .kd{color:green;font-weight:700}.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177c}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#ba2121}.highlight .sc{color:#ba2121}.highlight .sd{color:#BA2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#ba2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:green}.highlight .vc{color:#19177c}.highlight .vg{color:#19177c}.highlight .vi{color:#19177c}.highlight .il{color:#666}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0} \ No newline at end of file
+html{position:relative;min-height:100%}body{margin-bottom:80px}.footer{position:absolute;bottom:0;width:100%;height:60px}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#0C0;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-bottom:5px;margin-top:20px}.result_header .favicon{margin-bottom:-3px}.result_header a{vertical-align:bottom}.result_header a .highlight{font-weight:700}.result-content{margin-top:5px;word-wrap:break-word}.result-content .highlight{font-weight:700}.result-default{clear:both}.result-images{float:left!important}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-torrents{clear:both}.result-map{clear:both}.result-code{clear:both}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:50px}.label-default{color:#AAA;background:#FFF}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:1.5rem;margin-top:1.5rem;display:flex;flex-wrap:wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-top:.8rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#DDD 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#000;font-weight:700;background-color:#EEE}#advanced-search-container{display:none;text-align:center;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-left:1.2rem;padding-right:1.2rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#DDD 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#000;font-weight:700;background-color:#EEE}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#408080;font-style:italic}.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:green;font-weight:700}.highlight .kd{color:green;font-weight:700}.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177c}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#ba2121}.highlight .sc{color:#ba2121}.highlight .sd{color:#BA2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#ba2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:green}.highlight .vc{color:#19177c}.highlight .vg{color:#19177c}.highlight .vi{color:#19177c}.highlight .il{color:#666}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.menu{margin:0;padding:0;position:absolute;top:4px;border:0;z-index:1000000000;height:40px;line-height:40px}.menu ul{padding:0;margin:0}.menu ul li{padding:0 .6em;margin:0;float:left;list-style:none}.menu-right{right:2em}.menu-left{left:2em} \ No newline at end of file
diff --git a/searx/static/themes/oscar/less/logicodev/navbar.less b/searx/static/themes/oscar/less/logicodev/navbar.less
index 2426210ca..411fd63c6 100644
--- a/searx/static/themes/oscar/less/logicodev/navbar.less
+++ b/searx/static/themes/oscar/less/logicodev/navbar.less
@@ -15,7 +15,7 @@
line-height: 30px;
}
-.navbar, .navbar-default{
+.navbar, .navbar-default, .menu {
background-color: @black;
border: none;
border-top: 4px solid @light-green;
@@ -52,3 +52,38 @@
.navbar-toggle {
margin-top: 0;
}
+
+.menu {
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ top: 4px;
+ border: 0;
+ z-index: 1000000000;
+ height: 40px;
+ line-height: 40px;
+ ul {
+ padding: 0;
+ margin: 0;
+ li {
+ padding: 0 0.6em;
+ margin: 0;
+ float: left;
+ list-style: none;
+ a {
+ color: @dim-gray;
+ }
+ }
+ li.active a {
+ color: @light-green;
+ }
+ }
+}
+
+.menu-right {
+ right: 2em;
+}
+
+.menu-left {
+ left: 2em;
+}
diff --git a/searx/static/themes/oscar/less/logicodev/results.less b/searx/static/themes/oscar/less/logicodev/results.less
index 37a5a76d5..9e57da788 100644
--- a/searx/static/themes/oscar/less/logicodev/results.less
+++ b/searx/static/themes/oscar/less/logicodev/results.less
@@ -6,7 +6,7 @@
.favicon {
margin-bottom:-3px;
}
-
+
a {
color: @black;
text-decoration: none;
@@ -18,7 +18,7 @@
&:visited{
color: @violet;
}
-
+
.highlight {
background-color: @dim-gray;
// Chrome hack: bold is different size than normal
@@ -64,10 +64,9 @@
float: left !important;
width: 24%;
margin: .5%;
- a{
+ a {
display: block;
width: 100%;
- height: 170px;
background-size: cover;
}
}
@@ -148,3 +147,21 @@
color: @gray;
background: transparent;
}
+
+.result .text-muted small {
+ word-wrap: break-word;
+}
+
+.modal-wrapper {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+}
+
+.modal-wrapper {
+ background-clip: padding-box;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ outline: 0 none;
+ position: relative;
+}
diff --git a/searx/static/themes/oscar/less/pointhi/navbar.less b/searx/static/themes/oscar/less/pointhi/navbar.less
new file mode 100644
index 000000000..f0ce53e71
--- /dev/null
+++ b/searx/static/themes/oscar/less/pointhi/navbar.less
@@ -0,0 +1,28 @@
+.menu {
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ top: 4px;
+ border: 0;
+ z-index: 1000000000;
+ height: 40px;
+ line-height: 40px;
+ ul {
+ padding: 0;
+ margin: 0;
+ li {
+ padding: 0 0.6em;
+ margin: 0;
+ float: left;
+ list-style: none;
+ }
+ }
+}
+
+.menu-right {
+ right: 2em;
+}
+
+.menu-left {
+ left: 2em;
+}
diff --git a/searx/static/themes/oscar/less/pointhi/oscar.less b/searx/static/themes/oscar/less/pointhi/oscar.less
index ef69acee3..4e2fee129 100644
--- a/searx/static/themes/oscar/less/pointhi/oscar.less
+++ b/searx/static/themes/oscar/less/pointhi/oscar.less
@@ -15,3 +15,5 @@
@import "cursor.less";
@import "code.less";
+
+@import "navbar.less";
diff --git a/searx/static/themes/oscar/less/pointhi/results.less b/searx/static/themes/oscar/less/pointhi/results.less
index b3d87001c..beea353d0 100644
--- a/searx/static/themes/oscar/less/pointhi/results.less
+++ b/searx/static/themes/oscar/less/pointhi/results.less
@@ -6,10 +6,10 @@
.favicon {
margin-bottom:-3px;
}
-
+
a {
vertical-align: bottom;
-
+
.highlight {
font-weight:bold;
}
@@ -81,3 +81,21 @@
color: #AAA;
background: #FFF;
}
+
+.result .text-muted small {
+ word-wrap: break-word;
+}
+
+.modal-wrapper {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+}
+
+.modal-wrapper {
+ background-clip: padding-box;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ outline: 0 none;
+ position: relative;
+}
diff --git a/searx/templates/courgette/404.html b/searx/templates/courgette/404.html
new file mode 100644
index 000000000..77f1287ab
--- /dev/null
+++ b/searx/templates/courgette/404.html
@@ -0,0 +1,9 @@
+{% extends "courgette/base.html" %}
+{% block content %}
+<div class="center">
+ <h1>{{ _('Page not found') }}</h1>
+ {% autoescape false %}
+ <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p>
+ {% endautoescape %}
+</div>
+{% endblock %}
diff --git a/searx/templates/courgette/about.html b/searx/templates/courgette/about.html
index 2945e1f7b..faa7b6138 100644
--- a/searx/templates/courgette/about.html
+++ b/searx/templates/courgette/about.html
@@ -6,20 +6,20 @@
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users.
</p>
- <h2>Why use Searx?</h2>
+ <h2>Why use searx?</h2>
<ul>
- <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
- <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
- <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
+ <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
+ <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
+ <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
</ul>
<p>If you do care about privacy, want to be a conscious user, or otherwise believe
- in digital freedom, make Searx your default search engine or run it on your own server</p>
+ in digital freedom, make searx your default search engine or run it on your own server</p>
<h2>Technical details - How does it work?</h2>
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>,
-inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br />
-It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, Searx uses the search bar to perform GET requests.<br />
+inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br />
+It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, searx uses the search bar to perform GET requests.<br />
Searx can be added to your browser's search bar; moreover, it can be set as the default search engine.
</p>
diff --git a/searx/templates/courgette/base.html b/searx/templates/courgette/base.html
index 276fae870..8e272585c 100644
--- a/searx/templates/courgette/base.html
+++ b/searx/templates/courgette/base.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}>
<head>
<meta charset="UTF-8" />
- <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" />
+ <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" />
<meta name="keywords" content="searx, search, search engine, metasearch, meta search" />
<meta name="generator" content="searx/{{ searx_version }}">
<meta name="referrer" content="no-referrer">
@@ -22,7 +22,7 @@
{% endblock %}
{% block meta %}{% endblock %}
{% block head %}
- <link title="searx" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/>
+ <link title="{{ instance_name }}" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/>
{% endblock %}
<script type="text/javascript">
searx = {};
diff --git a/searx/templates/courgette/opensearch_response_rss.xml b/searx/templates/courgette/opensearch_response_rss.xml
index 5673eb2e1..ddb60fa5e 100644
--- a/searx/templates/courgette/opensearch_response_rss.xml
+++ b/searx/templates/courgette/opensearch_response_rss.xml
@@ -3,14 +3,14 @@
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
- <title>Searx search: {{ q }}</title>
- <link>{{ base_url }}?q={{ q }}</link>
- <description>Search results for "{{ q }}" - searx</description>
+ <title>Searx search: {{ q|e }}</title>
+ <link>{{ base_url }}?q={{ q|e }}</link>
+ <description>Search results for "{{ q|e }}" - searx</description>
<opensearch:totalResults>{{ number_of_results }}</opensearch:totalResults>
<opensearch:startIndex>1</opensearch:startIndex>
<opensearch:itemsPerPage>{{ number_of_results }}</opensearch:itemsPerPage>
<atom:link rel="search" type="application/opensearchdescription+xml" href="{{ base_url }}opensearch.xml"/>
- <opensearch:Query role="request" searchTerms="{{ q }}" startPage="1" />
+ <opensearch:Query role="request" searchTerms="{{ q|e }}" startPage="1" />
{% for r in results %}
<item>
<title>{{ r.title }}</title>
diff --git a/searx/templates/courgette/result_templates/code.html b/searx/templates/courgette/result_templates/code.html
index 726f305cb..953617e84 100644
--- a/searx/templates/courgette/result_templates/code.html
+++ b/searx/templates/courgette/result_templates/code.html
@@ -1,8 +1,8 @@
<div class="result {{ result.class }}">
- <h3 class="result_title">{% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title">{% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}
<p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p>
- {% if result.repository %}<p class="content"><a href="{{ result.repository|safe }}" rel="noreferrer">{{ result.repository }}</a></p>{% endif %}
+ {% if result.repository %}<p class="content"><a href="{{ result.repository|safe }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
<div dir="ltr">
{{ result.codelines|code_highlighter(result.code_language)|safe }}
</div>
diff --git a/searx/templates/courgette/result_templates/default.html b/searx/templates/courgette/result_templates/default.html
index 585ecf3f5..5f2ead63f 100644
--- a/searx/templates/courgette/result_templates/default.html
+++ b/searx/templates/courgette/result_templates/default.html
@@ -5,7 +5,7 @@
{% endif %}
<div>
- <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}
<p class="content">{% if result.content %}{{ result.content|safe }}<br />{% endif %}</p>
<p class="url">{{ result.pretty_url }}&lrm;</p>
diff --git a/searx/templates/courgette/result_templates/images.html b/searx/templates/courgette/result_templates/images.html
index 87fc7744c..49acb3b61 100644
--- a/searx/templates/courgette/result_templates/images.html
+++ b/searx/templates/courgette/result_templates/images.html
@@ -1,6 +1,6 @@
<div class="image_result">
<p>
- <a href="{{ result.img_src }}" rel="noreferrer"><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
- <span class="url"><a href="{{ result.url }}" rel="noreferrer" class="small_font">{{ _('original context') }}</a></span>
+ <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
+ <span class="url"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="small_font">{{ _('original context') }}</a></span>
</p>
</div>
diff --git a/searx/templates/courgette/result_templates/map.html b/searx/templates/courgette/result_templates/map.html
index 585ecf3f5..5f2ead63f 100644
--- a/searx/templates/courgette/result_templates/map.html
+++ b/searx/templates/courgette/result_templates/map.html
@@ -5,7 +5,7 @@
{% endif %}
<div>
- <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}
<p class="content">{% if result.content %}{{ result.content|safe }}<br />{% endif %}</p>
<p class="url">{{ result.pretty_url }}&lrm;</p>
diff --git a/searx/templates/courgette/result_templates/torrent.html b/searx/templates/courgette/result_templates/torrent.html
index 33b574244..2fd8395ad 100644
--- a/searx/templates/courgette/result_templates/torrent.html
+++ b/searx/templates/courgette/result_templates/torrent.html
@@ -2,12 +2,12 @@
{% if "icon_"~result.engine~".ico" in favicons %}
<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />
{% endif %}
- <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.content %}<span class="content">{{ result.content|safe }}</span><br />{% endif %}
<span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span><br />
<span>
{% if result.magnetlink %}<a href="{{ result.magnetlink }}" class="magnetlink">{{ _('magnet link') }}</a>{% endif %}
- {% if result.torrentfile %}<a href="{{ result.torrentfile }}" class="torrentfile" rel="noreferrer">{{ _('torrent file') }}</a>{% endif %}
+ {% if result.torrentfile %}<a href="{{ result.torrentfile }}" class="torrentfile" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('torrent file') }}</a>{% endif %}
</span>
<p class="url">{{ result.pretty_url }}&lrm;</p>
</div>
diff --git a/searx/templates/courgette/result_templates/videos.html b/searx/templates/courgette/result_templates/videos.html
index ceed8b28f..b3e19e024 100644
--- a/searx/templates/courgette/result_templates/videos.html
+++ b/searx/templates/courgette/result_templates/videos.html
@@ -3,8 +3,8 @@
<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />
{% endif %}
- <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span><br />{% endif %}
- <a href="{{ result.url }}" rel="noreferrer"><img width="400" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img width="400" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
<p class="url">{{ result.pretty_url }}&lrm;</p>
</div>
diff --git a/searx/templates/courgette/results.html b/searx/templates/courgette/results.html
index 3ffbd5882..c72b7c3f7 100644
--- a/searx/templates/courgette/results.html
+++ b/searx/templates/courgette/results.html
@@ -1,6 +1,6 @@
{% extends "courgette/base.html" %}
-{% block title %}{{ q }} - {% endblock %}
-{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}">{% endblock %}
+{% block title %}{{ q|e }} - {% endblock %}
+{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}">{% endblock %}
{% block content %}
<div class="right"><a href="{{ url_for('preferences') }}" id="preferences"><span>{{ _('preferences') }}</span></a></div>
<div class="small search center">
@@ -17,7 +17,7 @@
{% for output_type in ('csv', 'json', 'rss') %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
<div class="left">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="format" value="{{ output_type }}" />
{% for category in selected_categories %}
<input type="hidden" name="category_{{ category }}" value="1"/>
@@ -62,7 +62,7 @@
{% if pageno > 1 %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
<div class="left">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
{% for category in selected_categories %}
<input type="hidden" name="category_{{ category }}" value="1"/>
{% endfor %}
@@ -76,7 +76,7 @@
{% for category in selected_categories %}
<input type="hidden" name="category_{{ category }}" value="1"/>
{% endfor %}
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="pageno" value="{{ pageno+1 }}" />
<input type="submit" value="{{ _('next page') }} >>" />
</div>
diff --git a/searx/templates/default/result_templates/images.html b/searx/templates/default/result_templates/images.html
deleted file mode 100644
index d85f841ae..000000000
--- a/searx/templates/default/result_templates/images.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<div class="image_result">
- <p>
- <a href="{{ result.img_src }}" rel="noreferrer"><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}" /></a>
- <span class="url"><a href="{{ result.url }}" rel="noreferrer" class="small_font">{{ _('original context') }}</a></span>
- </p>
-</div>
diff --git a/searx/templates/legacy/404.html b/searx/templates/legacy/404.html
new file mode 100644
index 000000000..05c14e155
--- /dev/null
+++ b/searx/templates/legacy/404.html
@@ -0,0 +1,9 @@
+{% extends "legacy/base.html" %}
+{% block content %}
+<div class="center">
+ <h1>{{ _('Page not found') }}</h1>
+ {% autoescape false %}
+ <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p>
+ {% endautoescape %}
+</div>
+{% endblock %}
diff --git a/searx/templates/default/about.html b/searx/templates/legacy/about.html
index 1b5fc34c0..580321e47 100644
--- a/searx/templates/default/about.html
+++ b/searx/templates/legacy/about.html
@@ -1,25 +1,25 @@
-{% extends 'default/base.html' %}
+{% extends 'legacy/base.html' %}
{% block content %}
-{% include 'default/github_ribbon.html' %}
+{% include 'legacy/github_ribbon.html' %}
<div class="row"{% if rtl %} dir="ltr"{% endif %}>
<h1>About <a href="{{ url_for('index') }}">searx</a></h1>
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users.
</p>
- <h2>Why use Searx?</h2>
+ <h2>Why use searx?</h2>
<ul>
- <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
- <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
- <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
+ <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
+ <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
+ <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
</ul>
<p>If you do care about privacy, want to be a conscious user, or otherwise believe
- in digital freedom, make Searx your default search engine or run it on your own server</p>
+ in digital freedom, make searx your default search engine or run it on your own server</p>
<h2>Technical details - How does it work?</h2>
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>,
-inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br />
-It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if Searx used from the search bar it performs GET requests.<br />
+inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br />
+It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if searx used from the search bar it performs GET requests.<br />
Searx can be added to your browser's search bar; moreover, it can be set as the default search engine.
</p>
diff --git a/searx/templates/default/base.html b/searx/templates/legacy/base.html
index 143bdb8d2..da19741cb 100644
--- a/searx/templates/default/base.html
+++ b/searx/templates/legacy/base.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}>
<head>
<meta charset="UTF-8" />
- <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" />
+ <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" />
<meta name="keywords" content="searx, search, search engine, metasearch, meta search" />
<meta name="generator" content="searx/{{ searx_version }}">
<meta name="referrer" content="no-referrer">
@@ -17,7 +17,7 @@
{% endblock %}
{% block meta %}{% endblock %}
{% block head %}
- <link title="searx" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/>
+ <link title="{{ instance_name }}" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/>
{% endblock %}
</head>
<body>
diff --git a/searx/templates/default/categories.html b/searx/templates/legacy/categories.html
index 1c466781b..1c466781b 100644
--- a/searx/templates/default/categories.html
+++ b/searx/templates/legacy/categories.html
diff --git a/searx/templates/default/github_ribbon.html b/searx/templates/legacy/github_ribbon.html
index bdd9cf180..bdd9cf180 100644
--- a/searx/templates/default/github_ribbon.html
+++ b/searx/templates/legacy/github_ribbon.html
diff --git a/searx/templates/default/index.html b/searx/templates/legacy/index.html
index fc15a44b6..de956d5b3 100644
--- a/searx/templates/default/index.html
+++ b/searx/templates/legacy/index.html
@@ -1,8 +1,8 @@
-{% extends "default/base.html" %}
+{% extends "legacy/base.html" %}
{% block content %}
<div class="center">
<div class="title"><h1>searx</h1></div>
- {% include 'default/search.html' %}
+ {% include 'legacy/search.html' %}
<p class="top_margin">
{% if rtl %}
<a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a>
@@ -13,6 +13,6 @@
{% endif %}
</p>
</div>
-{% include 'default/github_ribbon.html' %}
+{% include 'legacy/github_ribbon.html' %}
{% endblock %}
diff --git a/searx/templates/default/infobox.html b/searx/templates/legacy/infobox.html
index ce26ac578..4dd25fabd 100644
--- a/searx/templates/default/infobox.html
+++ b/searx/templates/legacy/infobox.html
@@ -24,7 +24,7 @@
<div class="urls">
<ul>
{% for url in infobox.urls %}
- <li class="url"><bdi><a href="{{ url.url }}" rel="noreferrer">{{ url.title }}</a></bdi></li>
+ <li class="url"><bdi><a href="{{ url.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ url.title }}</a></bdi></li>
{% endfor %}
</ul>
</div>
diff --git a/searx/templates/default/opensearch.xml b/searx/templates/legacy/opensearch.xml
index 15d3eb792..15d3eb792 100644
--- a/searx/templates/default/opensearch.xml
+++ b/searx/templates/legacy/opensearch.xml
diff --git a/searx/templates/default/opensearch_response_rss.xml b/searx/templates/legacy/opensearch_response_rss.xml
index 5673eb2e1..ddb60fa5e 100644
--- a/searx/templates/default/opensearch_response_rss.xml
+++ b/searx/templates/legacy/opensearch_response_rss.xml
@@ -3,14 +3,14 @@
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
- <title>Searx search: {{ q }}</title>
- <link>{{ base_url }}?q={{ q }}</link>
- <description>Search results for "{{ q }}" - searx</description>
+ <title>Searx search: {{ q|e }}</title>
+ <link>{{ base_url }}?q={{ q|e }}</link>
+ <description>Search results for "{{ q|e }}" - searx</description>
<opensearch:totalResults>{{ number_of_results }}</opensearch:totalResults>
<opensearch:startIndex>1</opensearch:startIndex>
<opensearch:itemsPerPage>{{ number_of_results }}</opensearch:itemsPerPage>
<atom:link rel="search" type="application/opensearchdescription+xml" href="{{ base_url }}opensearch.xml"/>
- <opensearch:Query role="request" searchTerms="{{ q }}" startPage="1" />
+ <opensearch:Query role="request" searchTerms="{{ q|e }}" startPage="1" />
{% for r in results %}
<item>
<title>{{ r.title }}</title>
diff --git a/searx/templates/default/preferences.html b/searx/templates/legacy/preferences.html
index a47dba458..30d632c93 100644
--- a/searx/templates/default/preferences.html
+++ b/searx/templates/legacy/preferences.html
@@ -1,4 +1,4 @@
-{% extends "default/base.html" %}
+{% extends "legacy/base.html" %}
{% block head %} {% endblock %}
{% block content %}
<div class="row">
@@ -8,7 +8,7 @@
<fieldset>
<legend>{{ _('Default categories') }}</legend>
{% set display_tooltip = false %}
- {% include 'default/categories.html' %}
+ {% include 'legacy/categories.html' %}
</fieldset>
<fieldset>
<legend>{{ _('Search language') }}</legend>
@@ -81,6 +81,15 @@
</p>
</fieldset>
<fieldset>
+ <legend>{{ _('Results on new tabs') }}</legend>
+ <p>
+ <select name='results_on_new_tab'>
+ <option value="1" {% if results_on_new_tab %}selected="selected"{% endif %}>{{ _('On') }}</option>
+ <option value="0" {% if not results_on_new_tab %}selected="selected"{% endif %}>{{ _('Off')}}</option>
+ </select>
+ </p>
+ </fieldset>
+ <fieldset>
<legend>{{ _('Currently used search engines') }}</legend>
<table>
diff --git a/searx/templates/default/result_templates/code.html b/searx/templates/legacy/result_templates/code.html
index ad1d97e9e..9e3ed20af 100644
--- a/searx/templates/default/result_templates/code.html
+++ b/searx/templates/legacy/result_templates/code.html
@@ -1,9 +1,9 @@
<div class="result {{ result.class }}">
- <h3 class="result_title"> {% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
- <p class="url">{{ result.pretty_url }}&lrm; <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ _('cached') }}</a></p>
+ <h3 class="result_title"> {% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
+ <p class="url">{{ result.pretty_url }}&lrm; <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('cached') }}</a></p>
{% if result.publishedDate %}<p class="published_date">{{ result.publishedDate }}</p>{% endif %}
<p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p>
- {% if result.repository %}<p class="result-content"><a href="{{ result.repository|safe }}" rel="noreferrer">{{ result.repository }}</a></p>{% endif %}
+ {% if result.repository %}<p class="result-content"><a href="{{ result.repository|safe }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
<div dir="ltr">
{{ result.codelines|code_highlighter(result.code_language)|safe }}
diff --git a/searx/templates/default/result_templates/default.html b/searx/templates/legacy/result_templates/default.html
index 89091e280..da091174d 100644
--- a/searx/templates/default/result_templates/default.html
+++ b/searx/templates/legacy/result_templates/default.html
@@ -1,6 +1,6 @@
<div class="result {{ result.class }}">
- <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
- <p class="url">{{ result.pretty_url }}&lrm; <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ _('cached') }}</a>
+ <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
+ <p class="url">{{ result.pretty_url }}&lrm; <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('cached') }}</a>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}</p>
<p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p>
</div>
diff --git a/searx/templates/legacy/result_templates/images.html b/searx/templates/legacy/result_templates/images.html
new file mode 100644
index 000000000..00f62abcc
--- /dev/null
+++ b/searx/templates/legacy/result_templates/images.html
@@ -0,0 +1,6 @@
+<div class="image_result">
+ <p>
+ <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}" /></a>
+ <span class="url"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="small_font">{{ _('original context') }}</a></span>
+ </p>
+</div>
diff --git a/searx/templates/default/result_templates/map.html b/searx/templates/legacy/result_templates/map.html
index d413742e7..0200e0f6b 100644
--- a/searx/templates/default/result_templates/map.html
+++ b/searx/templates/legacy/result_templates/map.html
@@ -5,8 +5,8 @@
{% endif %}
<div>
- <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
- <p class="url">{{ result.pretty_url }}&lrm; <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ _('cached') }}</a>
+ <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
+ <p class="url">{{ result.pretty_url }}&lrm; <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('cached') }}</a>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}</p>
<p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p>
</div>
diff --git a/searx/templates/default/result_templates/torrent.html b/searx/templates/legacy/result_templates/torrent.html
index 4b2522ad0..67e058ae5 100644
--- a/searx/templates/default/result_templates/torrent.html
+++ b/searx/templates/legacy/result_templates/torrent.html
@@ -2,12 +2,12 @@
{% if "icon_"~result.engine~".ico" in favicons %}
<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />
{% endif %}
- <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
<p class="url">{{ result.pretty_url }}&lrm;</p>
{% if result.content %}<p class="content">{{ result.content|safe }}</p>{% endif %}
<p>
{% if result.magnetlink %}<a href="{{ result.magnetlink }}" class="magnetlink">{{ _('magnet link') }}</a>{% endif %}
- {% if result.torrentfile %}<a href="{{ result.torrentfile }}" rel="noreferrer" class="torrentfile">{{ _('torrent file') }}</a>{% endif %} -
+ {% if result.torrentfile %}<a href="{{ result.torrentfile }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="torrentfile">{{ _('torrent file') }}</a>{% endif %} -
<span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span>
</p>
</div>
diff --git a/searx/templates/default/result_templates/videos.html b/searx/templates/legacy/result_templates/videos.html
index 5a377b70f..727f44c71 100644
--- a/searx/templates/default/result_templates/videos.html
+++ b/searx/templates/legacy/result_templates/videos.html
@@ -1,6 +1,6 @@
<div class="result">
- <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span><br />{% endif %}
- <a href="{{ result.url }}" rel="noreferrer"><img class="thumbnail" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img class="thumbnail" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
<p class="url">{{ result.url }}&lrm;</p>
</div>
diff --git a/searx/templates/default/results.html b/searx/templates/legacy/results.html
index 927b7b8a8..f0d78398d 100644
--- a/searx/templates/default/results.html
+++ b/searx/templates/legacy/results.html
@@ -1,10 +1,10 @@
-{% extends "default/base.html" %}
-{% block title %}{{ q }} - {% endblock %}
-{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}">{% endblock %}
+{% extends "legacy/base.html" %}
+{% block title %}{{ q|e }} - {% endblock %}
+{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}">{% endblock %}
{% block content %}
<div class="preferences_container right"><a href="{{ url_for('preferences') }}" id="preferences"><span>preferences</span></a></div>
<div class="small search center">
- {% include 'default/search.html' %}
+ {% include 'legacy/search.html' %}
</div>
<div id="results">
<div id="sidebar">
@@ -18,7 +18,7 @@
{% for output_type in ('csv', 'json', 'rss') %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
<div class="left">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="format" value="{{ output_type }}" />
{% for category in selected_categories %}
<input type="hidden" name="category_{{ category }}" value="1"/>
@@ -55,16 +55,16 @@
{% if infoboxes %}
<div id="infoboxes">
{% for infobox in infoboxes %}
- {% include 'default/infobox.html' %}
+ {% include 'legacy/infobox.html' %}
{% endfor %}
</div>
{% endif %}
{% for result in results %}
{% if result['template'] %}
- {% include get_result_template('default', result['template']) %}
+ {% include get_result_template('legacy', result['template']) %}
{% else %}
- {% include 'default/result_templates/default.html' %}
+ {% include 'legacy/result_templates/default.html' %}
{% endif %}
{% endfor %}
@@ -73,7 +73,7 @@
{% if pageno > 1 %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
<div class="{% if rtl %}right{% else %}left{% endif %}">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
{% for category in selected_categories %}
<input type="hidden" name="category_{{ category }}" value="1"/>
{% endfor %}
@@ -87,7 +87,7 @@
{% for category in selected_categories %}
<input type="hidden" name="category_{{ category }}" value="1"/>
{% endfor %}
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="pageno" value="{{ pageno+1 }}" />
<input type="submit" value="{{ _('next page') }} >>" />
</div>
diff --git a/searx/templates/default/search.html b/searx/templates/legacy/search.html
index 5a049a492..4d37f9ba1 100644
--- a/searx/templates/default/search.html
+++ b/searx/templates/legacy/search.html
@@ -4,5 +4,5 @@
<input type="submit" value="search" id="search_submit" />
</div>
{% set display_tooltip = true %}
- {% include 'default/categories.html' %}
+ {% include 'legacy/categories.html' %}
</form>
diff --git a/searx/templates/default/stats.html b/searx/templates/legacy/stats.html
index 70fe98ac7..372447e23 100644
--- a/searx/templates/default/stats.html
+++ b/searx/templates/legacy/stats.html
@@ -1,4 +1,4 @@
-{% extends "default/base.html" %}
+{% extends "legacy/base.html" %}
{% block head %} {% endblock %}
{% block content %}
<h2>{{ _('Engine stats') }}</h2>
diff --git a/searx/templates/oscar/404.html b/searx/templates/oscar/404.html
new file mode 100644
index 000000000..11d789564
--- /dev/null
+++ b/searx/templates/oscar/404.html
@@ -0,0 +1,9 @@
+{% extends "oscar/base.html" %}
+{% block content %}
+<div class="text-center">
+ <h1>{{ _('Page not found') }}</h1>
+ {% autoescape false %}
+ <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p>
+ {% endautoescape %}
+</div>
+{% endblock %}
diff --git a/searx/templates/oscar/about.html b/searx/templates/oscar/about.html
index 39ef3663e..673738172 100644
--- a/searx/templates/oscar/about.html
+++ b/searx/templates/oscar/about.html
@@ -1,5 +1,4 @@
{% extends "oscar/base.html" %}
-{% block site_alert_warning_nojs %} {% endblock %}
{% block title %}{{ _('about') }} - {% endblock %}
{% block content %}
<div{% if rtl %} dir="ltr"{% endif %}>
@@ -7,20 +6,20 @@
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users.
</p>
- <h2>Why use Searx?</h2>
+ <h2>Why use searx?</h2>
<ul>
- <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
- <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
- <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
+ <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
+ <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
+ <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
</ul>
<p>If you do care about privacy, want to be a conscious user, or otherwise believe
- in digital freedom, make Searx your default search engine or run it on your own server</p>
+ in digital freedom, make searx your default search engine or run it on your own server</p>
<h2>Technical details - How does it work?</h2>
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>,
-inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br />
-It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, Searx uses the search bar to perform GET requests.<br />
+inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br />
+It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, searx uses the search bar to perform GET requests.<br />
Searx can be added to your browser's search bar; moreover, it can be set as the default search engine.
</p>
diff --git a/searx/templates/oscar/base.html b/searx/templates/oscar/base.html
index a1f1c1a90..220f5f8b1 100644
--- a/searx/templates/oscar/base.html
+++ b/searx/templates/oscar/base.html
@@ -1,8 +1,9 @@
+{% from 'oscar/macros.html' import icon %}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}>
<head>
<meta charset="UTF-8" />
- <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" />
+ <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" />
<meta name="keywords" content="searx, search, search engine, metasearch, meta search" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="generator" content="searx/{{ searx_version }}">
@@ -54,18 +55,25 @@
<body>
{% include 'oscar/navbar.html' %}
<div class="container">
+ {% if errors %}
+ <div class="alert alert-danger fade in" role="alert">
+ <button class="close" data-dismiss="alert" type="button">
+ <span aria-hidden="true">×</span>
+ <span class="sr-only">{{ _('Close') }}</span>
+ </button>
+ <strong class="lead">{{ icon('info-sign') }} {{ _('Error!') }}</strong>
+ <ul>
+ {% for message in errors %}
+ <li>{{ message }}</li>
+ {% endfor %}
+ </ul>
+ </div>
+ {% endif %}
{% block site_alert_error %}
{% endblock %}
{% block site_alert_warning %}
{% endblock %}
- {% block site_alert_warning_nojs %}
- <noscript>
- <div class="visible-xs-block">
- {% include 'oscar/messages/js_disabled.html' %}
- </div>
- </noscript>
- {% endblock %}
{% block site_alert_info %}
{% endblock %}
{% block site_alert_success %}
diff --git a/searx/templates/oscar/categories.html b/searx/templates/oscar/categories.html
index 241d262ea..1ace10f16 100644
--- a/searx/templates/oscar/categories.html
+++ b/searx/templates/oscar/categories.html
@@ -3,7 +3,6 @@
{% for category in categories | reverse %}
<input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
<label for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label>
- </label>
{% endfor %}
{% else %}
{% for category in categories %}
diff --git a/searx/templates/oscar/infobox.html b/searx/templates/oscar/infobox.html
index 70d12f2fb..c98fb0e63 100644
--- a/searx/templates/oscar/infobox.html
+++ b/searx/templates/oscar/infobox.html
@@ -1,3 +1,4 @@
+{% from 'oscar/macros.html' import result_link with context %}
<div class="panel panel-default infobox">
<div class="panel-heading">
<h4 class="panel-title infobox_part"><bdi>{{ infobox.infobox }}</bdi></h4>
@@ -25,7 +26,7 @@
<div class="infobox_part">
<bdi>
{% for url in infobox.urls %}
- <p class="btn btn-default btn-xs"><a href="{{ url.url }}" rel="noreferrer">{{ url.title }}</a></p>
+ <p class="btn btn-default btn-xs">{{ result_link(url.url, url.title) }}</a></p>
{% endfor %}
</bdi>
</div>
diff --git a/searx/templates/oscar/macros.html b/searx/templates/oscar/macros.html
index bf51d5940..221300fe4 100644
--- a/searx/templates/oscar/macros.html
+++ b/searx/templates/oscar/macros.html
@@ -9,16 +9,20 @@
<img width="32" height="32" class="favicon" src="static/themes/oscar/img/icons/{{ favicon }}.png" alt="{{ favicon }}" />
{%- endmacro %}
+{%- macro result_link(url, title, classes='') -%}
+<a href="{{ url }}" {% if classes %}class="{{ classes }} "{% endif %}{% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ title }}</a>
+{%- endmacro -%}
+
<!-- Draw result header -->
-{% macro result_header(result, favicons) -%}
- <h4 class="result_header">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h4>
+{% macro result_header(result, favicons) -%}
+<h4 class="result_header">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result_link(result.url, result.title|safe) }}</h4>
{%- endmacro %}
<!-- Draw result sub header -->
{% macro result_sub_header(result) -%}
{% if result.publishedDate %}<time class="text-muted" datetime="{{ result.pubdate }}" >{{ result.publishedDate }}</time>{% endif %}
- {% if result.magnetlink %}<small> &bull; <a href="{{ result.magnetlink }}" class="magnetlink">{{ icon('magnet') }} {{ _('magnet link') }}</a></small>{% endif %}
- {% if result.torrentfile %}<small> &bull; <a href="{{ result.torrentfile }}" class="torrentfile" rel="noreferrer">{{ icon('download-alt') }} {{ _('torrent file') }}</a></small>{% endif %}
+ {% if result.magnetlink %}<small> &bull; {{ result_link(result.magnetlink, icon('magnet') + _('magnet link'), "magnetlink") }}</small>{% endif %}
+ {% if result.torrentfile %}<small> &bull; {{ result_link(result.torrentfile, icon('download-alt') + _('torrent file'), "torrentfile") }}</small>{% endif %}
{%- endmacro %}
<!-- Draw result footer -->
@@ -28,7 +32,10 @@
{% for engine in result.engines %}
<span class="label label-default">{{ engine }}</span>
{% endfor %}
- <small><a class="text-info" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ icon('link') }} {{ _('cached') }}</a></small>
+ <small>{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}</small>
+ {% if proxify %}
+ <small>{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}</small>
+ {% endif %}
</div>
<div class="text-muted"><small>{{ result.pretty_url }}</small></div>
{%- endmacro %}
@@ -39,7 +46,10 @@
{% for engine in result.engines %}
<span class="label label-default">{{ engine }}</span>
{% endfor %}
- <small><a class="text-info" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ icon('link') }} {{ _('cached') }}</a></small>
+ <small>{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}</small>
+ {% if proxify %}
+ <small>{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}</small>
+ {% endif %}
<div class="text-muted"><small>{{ result.pretty_url }}</small></div>
{%- endmacro %}
diff --git a/searx/templates/oscar/messages/js_disabled.html b/searx/templates/oscar/messages/js_disabled.html
deleted file mode 100644
index 8baaf1e4c..000000000
--- a/searx/templates/oscar/messages/js_disabled.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<div class="alert alert-warning" role="alert">
- <strong class="lead">{{ _('Warning!') }}</strong>
- {{ _('Please enable JavaScript to use full functionality of this site.') }}
-</div>
diff --git a/searx/templates/oscar/navbar.html b/searx/templates/oscar/navbar.html
index c59bcda3d..d12de7dab 100644
--- a/searx/templates/oscar/navbar.html
+++ b/searx/templates/oscar/navbar.html
@@ -1,40 +1,14 @@
<!-- Static navbar -->
<div class="navbar navbar-default" role="navigation">
<div class="container-fluid">
- {% if rtl %}
- <div class="navbar-collapse collapse navbar-left">
- <ul class="nav navbar-nav navbar-left"> <!-- results.html -->
- <li{% if template_name == 'preferences.html' %} class="active"{% endif %}><a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a></li>
- <li{% if template_name == 'about.html' %} class="active"{% endif %}><a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a></li>
- <li{% if template_name == 'index.html' %} class="active"{% endif %}><a href="{{ url_for('index') }}" class="hmarg">{{ _('home') }}</a></li>
- </ul>
- </div>
- <div class="navbar-header navbar-right">
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
- <span class="sr-only">{{ _('Toggle navigation') }}</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="{{ url_for('index') }}">{{ instance_name }}</a>
- </div>
- {% else %}
- <div class="navbar-header">
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
- <span class="sr-only">{{ _('Toggle navigation') }}</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
+ <div class="navbar-header{% if rtl %} navbar-right{% endif %}">
<a class="navbar-brand" href="{{ url_for('index') }}">{{ instance_name }}</a>
</div>
- <div class="navbar-collapse collapse">
- <ul class="nav navbar-nav navbar-right"> <!-- results.html -->
- <li{% if template_name == 'index.html' %} class="active"{% endif %}><a href="{{ url_for('index') }}" class="hmarg">{{ _('home') }}</a></li>
- <li{% if template_name == 'about.html' %} class="active"{% endif %}><a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a></li>
- <li{% if template_name == 'preferences.html' %} class="active"{% endif %}><a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a></li>
- </ul>
- </div><!--/.nav-collapse -->
- {% endif %}
</div><!--/.container-fluid -->
</div>
+<div class="menu menu-{% if rtl %}left{% else %}right{% endif %}">
+ <ul> <!-- results.html -->
+ <li{% if template_name == 'about.html' %} class="active"{% endif %}><a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a></li>
+ <li{% if template_name == 'preferences.html' %} class="active"{% endif %}><a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a></li>
+ </ul>
+</div><!--/.nav-collapse -->
diff --git a/searx/templates/oscar/opensearch_response_rss.xml b/searx/templates/oscar/opensearch_response_rss.xml
index 5673eb2e1..ddb60fa5e 100644
--- a/searx/templates/oscar/opensearch_response_rss.xml
+++ b/searx/templates/oscar/opensearch_response_rss.xml
@@ -3,14 +3,14 @@
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
- <title>Searx search: {{ q }}</title>
- <link>{{ base_url }}?q={{ q }}</link>
- <description>Search results for "{{ q }}" - searx</description>
+ <title>Searx search: {{ q|e }}</title>
+ <link>{{ base_url }}?q={{ q|e }}</link>
+ <description>Search results for "{{ q|e }}" - searx</description>
<opensearch:totalResults>{{ number_of_results }}</opensearch:totalResults>
<opensearch:startIndex>1</opensearch:startIndex>
<opensearch:itemsPerPage>{{ number_of_results }}</opensearch:itemsPerPage>
<atom:link rel="search" type="application/opensearchdescription+xml" href="{{ base_url }}opensearch.xml"/>
- <opensearch:Query role="request" searchTerms="{{ q }}" startPage="1" />
+ <opensearch:Query role="request" searchTerms="{{ q|e }}" startPage="1" />
{% for r in results %}
<item>
<title>{{ r.title }}</title>
diff --git a/searx/templates/oscar/preferences.html b/searx/templates/oscar/preferences.html
index 0e3848b7c..6ad795095 100644
--- a/searx/templates/oscar/preferences.html
+++ b/searx/templates/oscar/preferences.html
@@ -1,11 +1,6 @@
{% from 'oscar/macros.html' import preferences_item_header, preferences_item_header_rtl, preferences_item_footer, preferences_item_footer_rtl, checkbox_toggle %}
{% extends "oscar/base.html" %}
{% block title %}{{ _('preferences') }} - {% endblock %}
-{% block site_alert_warning_nojs %}
-<noscript>
- {% include 'oscar/messages/js_disabled.html' %}
-</noscript>
-{% endblock %}
{% block content %}
<div>
@@ -17,6 +12,7 @@
<li class="active"><a href="#tab_general" role="tab" data-toggle="tab">{{ _('General') }}</a></li>
<li><a href="#tab_engine" role="tab" data-toggle="tab">{{ _('Engines') }}</a></li>
<li><a href="#tab_plugins" role="tab" data-toggle="tab">{{ _('Plugins') }}</a></li>
+ {% if answerers %}<li><a href="#tab_answerers" role="tab" data-toggle="tab">{{ _('Answerers') }}</a></li>{% endif %}
<li><a href="#tab_cookies" role="tab" data-toggle="tab">{{ _('Cookies') }}</a></li>
</ul>
@@ -117,6 +113,15 @@
<option value="pointhi" {% if cookies['oscar-style'] == 'pointhi' %}selected="selected"{% endif %}>Pointhi</option>
</select>
{{ preferences_item_footer(_('Choose style for this theme'), _('Style'), rtl) }}
+
+ {% set label = _('Results on new tabs') %}
+ {% set info = _('Open result links on new browser tabs') %}
+ {{ preferences_item_header(info, label, rtl) }}
+ <select class="form-control" name='results_on_new_tab'>
+ <option value="1" {% if results_on_new_tab %}selected="selected"{% endif %}>{{ _('On') }}</option>
+ <option value="0" {% if not results_on_new_tab %}selected="selected"{% endif %}>{{ _('Off')}}</option>
+ </select>
+ {{ preferences_item_footer(info, label, rtl) }}
</div>
</fieldset>
</div>
@@ -149,6 +154,7 @@
<th>{{ _("Engine name") }}</th>
<th>{{ _("Shortcut") }}</th>
<th>{{ _("SafeSearch") }}</th>
+ <th>{{ _("Time range") }}</th>
<th>{{ _("Avg. time") }}</th>
<th>{{ _("Max time") }}</th>
{% else %}
@@ -170,6 +176,7 @@
<th>{{ search_engine.name }}</th>
<td>{{ shortcuts[search_engine.name] }}</td>
<td><input type="checkbox" {{ "checked" if search_engine.safesearch==True else ""}} readonly="readonly" disabled="disabled"></td>
+ <td><input type="checkbox" {{ "checked" if search_engine.time_range_support==True else ""}} readonly="readonly" disabled="disabled"></td>
<td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
<td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>
{% else %}
@@ -218,6 +225,34 @@
</fieldset>
</div>
+ {% if answerers %}
+ <div class="tab-pane active_if_nojs" id="tab_answerers">
+ <noscript>
+ <h3>{{ _('Answerers') }}</h3>
+ </noscript>
+ <p class="text-muted" style="margin:20px 0;">
+ {{ _('This is the list of searx\'s instant answering modules.') }}
+ </p>
+ <table class="table table-striped">
+ <tr>
+ <th class="text-muted">{{ _('Name') }}</th>
+ <th class="text-muted">{{ _('Keywords') }}</th>
+ <th class="text-muted">{{ _('Description') }}</th>
+ <th class="text-muted">{{ _('Examples') }}</th>
+ </tr>
+
+ {% for answerer in answerers %}
+ <tr>
+ <td class="text-muted">{{ answerer.info.name }}</td>
+ <td class="text-muted">{{ answerer.keywords|join(', ') }}</td>
+ <td class="text-muted">{{ answerer.info.description }}</td>
+ <td class="text-muted">{{ answerer.info.examples|join(', ') }}</td>
+ </tr>
+ {% endfor %}
+ </table>
+ </div>
+ {% endif %}
+
<div class="tab-pane active_if_nojs" id="tab_cookies">
<noscript>
<h3>{{ _('Cookies') }}</h3>
diff --git a/searx/templates/oscar/result_templates/code.html b/searx/templates/oscar/result_templates/code.html
index 582a2149c..ba74d0333 100644
--- a/searx/templates/oscar/result_templates/code.html
+++ b/searx/templates/oscar/result_templates/code.html
@@ -5,7 +5,7 @@
{% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
-{% if result.repository %}<p class="result-content">{{ icon('file') }} <a href="{{ result.repository|safe }}" rel="noreferrer">{{ result.repository }}</a></p>{% endif %}
+{% if result.repository %}<p class="result-content">{{ icon('file') }} <a href="{{ result.repository }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
<div dir="ltr">
{{ result.codelines|code_highlighter(result.code_language)|safe }}
diff --git a/searx/templates/oscar/result_templates/default.html b/searx/templates/oscar/result_templates/default.html
index f283693c3..3ed0f3122 100644
--- a/searx/templates/oscar/result_templates/default.html
+++ b/searx/templates/oscar/result_templates/default.html
@@ -1,4 +1,4 @@
-{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
+{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon with context %}
{{ result_header(result, favicons) }}
{{ result_sub_header(result) }}
diff --git a/searx/templates/oscar/result_templates/images.html b/searx/templates/oscar/result_templates/images.html
index 1bfff0a1a..b23f34915 100644
--- a/searx/templates/oscar/result_templates/images.html
+++ b/searx/templates/oscar/result_templates/images.html
@@ -1,27 +1,38 @@
{% from 'oscar/macros.html' import draw_favicon %}
-<a href="{{ result.img_src }}" rel="noreferrer" data-toggle="modal" data-target="#modal-{{ index }}">
+<a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} data-toggle="modal" data-target="#modal-{{ index }}-{{pageno}}">
<img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" class="img-thumbnail">
</a>
-<div class="modal fade" id="modal-{{ index }}" tabindex="-1" role="dialog" aria-hidden="true">
+<div class="modal fade" id="modal-{{ index }}-{{ pageno }}" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog">
- <div class="modal-content">
+ <div class="modal-wrapper">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
<h4 class="modal-title">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result.title|striptags }}</h4>
</div>
<div class="modal-body">
<img class="img-responsive center-block" src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}">
- {% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
+ {% if result.author %}<span class="photo-author">{{ result.author }}</span><br />{% endif %}
+ {% if result.content %}
+ <p class="result-content">
+ {{ result.content }}
+ </p>
+ {% endif %}
</div>
<div class="modal-footer">
<div class="clearfix"></div>
<span class="label label-default pull-right">{{ result.engine }}</span>
<p class="text-muted pull-left">{{ result.pretty_url }}</p>
<div class="clearfix"></div>
- <a href="{{ result.img_src }}" rel="noreferrer" class="btn btn-default">{{ _('Get image') }}</a>
- <a href="{{ result.url }}" rel="noreferrer" class="btn btn-default">{{ _('View source') }}</a>
+ <div class="row">
+ <div class="col-md-6">
+ <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('Get image') }}</a>
+ </div>
+ <div class="col-md-6">
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('View source') }}</a>
+ </div>
+ </div>
</div>
</div>
</div>
diff --git a/searx/templates/oscar/result_templates/videos.html b/searx/templates/oscar/result_templates/videos.html
index af4841453..36fb26240 100644
--- a/searx/templates/oscar/result_templates/videos.html
+++ b/searx/templates/oscar/result_templates/videos.html
@@ -15,7 +15,7 @@
<div class="container-fluid">
<div class="row">
- <a href="{{ result.url }}" rel="noreferrer"><img class="thumbnail col-xs-6 col-sm-4 col-md-4 result-content" src="{{ image_proxify(result.thumbnail) }}" alt="{{ result.title|striptags }} {{ result.engine }}" /></a>
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img class="thumbnail col-xs-6 col-sm-4 col-md-4 result-content" src="{{ image_proxify(result.thumbnail) }}" alt="{{ result.title|striptags }} {{ result.engine }}" /></a>
{% if result.content %}<p class="col-xs-12 col-sm-8 col-md-8 result-content">{{ result.content|safe }}</p>{% endif %}
</div>
</div>
diff --git a/searx/templates/oscar/results.html b/searx/templates/oscar/results.html
index e71be325a..0ae83e74b 100644
--- a/searx/templates/oscar/results.html
+++ b/searx/templates/oscar/results.html
@@ -1,6 +1,6 @@
{% extends "oscar/base.html" %}
-{% block title %}{{ q }} - {% endblock %}
-{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}&amp;time_range={{ time_range }}">{% endblock %}
+{% block title %}{{ q|e }} - {% endblock %}
+{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}&amp;time_range={{ time_range }}">{% endblock %}
{% block content %}
<div class="row">
<div class="col-sm-8" id="main_results">
@@ -37,9 +37,9 @@
<div id="pagination">
<div class="pull-left">
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="pageno" value="{{ pageno+1 }}" />
<input type="hidden" name="time_range" value="{{ time_range }}" />
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-backward"></span> {{ _('next page') }}</button>
@@ -59,7 +59,7 @@
<div id="pagination">
<div class="pull-left">
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
<input type="hidden" name="pageno" value="{{ pageno-1 }}" />
<input type="hidden" name="time_range" value="{{ time_range }}" />
@@ -69,7 +69,7 @@
<div class="pull-right">
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="pageno" value="{{ pageno+1 }}" />
<input type="hidden" name="time_range" value="{{ time_range }}" />
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-forward"></span> {{ _('next page') }}</button>
@@ -130,7 +130,7 @@
<div class="clearfix"></div>
{% for output_type in ('csv', 'json', 'rss') %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="form-inline pull-{% if rtl %}right{% else %}left{% endif %} result_download">
- <input type="hidden" name="q" value="{{ q }}">
+ <input type="hidden" name="q" value="{{ q|e }}">
<input type="hidden" name="format" value="{{ output_type }}">
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1">{% endfor %}
<input type="hidden" name="pageno" value="{{ pageno }}">
diff --git a/searx/templates/oscar/time-range.html b/searx/templates/oscar/time-range.html
index 4a13c4fdb..6ce1b91cb 100644
--- a/searx/templates/oscar/time-range.html
+++ b/searx/templates/oscar/time-range.html
@@ -11,4 +11,7 @@
<option id="time-range-month" value="month" {{ "selected" if time_range=="month" else ""}}>
{{ _('Last month') }}
</option>
+ <option id="time-range-year" value="year" {{ "selected" if time_range=="year" else ""}}>
+ {{ _('Last year') }}
+ </option>
</select>
diff --git a/searx/templates/pix-art/404.html b/searx/templates/pix-art/404.html
new file mode 100644
index 000000000..592e8610f
--- /dev/null
+++ b/searx/templates/pix-art/404.html
@@ -0,0 +1,9 @@
+{% extends "pix-art/base.html" %}
+{% block content %}
+<div class="center">
+ <h1>{{ _('Page not found') }}</h1>
+ {% autoescape false %}
+ <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p>
+ {% endautoescape %}
+</div>
+{% endblock %}
diff --git a/searx/templates/pix-art/about.html b/searx/templates/pix-art/about.html
index cb4b351f8..041b036f2 100644
--- a/searx/templates/pix-art/about.html
+++ b/searx/templates/pix-art/about.html
@@ -5,20 +5,20 @@
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users.
</p>
- <h2>Why use Searx?</h2>
+ <h2>Why use searx?</h2>
<ul>
- <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
- <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
- <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
+ <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
+ <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
+ <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
</ul>
<p>If you do care about privacy, want to be a conscious user, or otherwise believe
- in digital freedom, make Searx your default search engine or run it on your own server</p>
+ in digital freedom, make searx your default search engine or run it on your own server</p>
<h2>Technical details - How does it work?</h2>
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>,
-inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br />
-It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if Searx used from the search bar it performs GET requests.<br />
+inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br />
+It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if searx used from the search bar it performs GET requests.<br />
Searx can be added to your browser's search bar; moreover, it can be set as the default search engine.
</p>
diff --git a/searx/templates/pix-art/base.html b/searx/templates/pix-art/base.html
index 578180c84..6af8823cc 100644
--- a/searx/templates/pix-art/base.html
+++ b/searx/templates/pix-art/base.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}>
<head>
<meta charset="UTF-8" />
- <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" />
+ <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" />
<meta name="keywords" content="searx, search, search engine, metasearch, meta search" />
<meta name="generator" content="searx/{{ searx_version }}">
<meta name="referrer" content="no-referrer">
diff --git a/searx/templates/pix-art/index.html b/searx/templates/pix-art/index.html
index d398cc829..a0c61f975 100644
--- a/searx/templates/pix-art/index.html
+++ b/searx/templates/pix-art/index.html
@@ -1,7 +1,7 @@
{% extends "pix-art/base.html" %}
{% block content %}
<div class="center">
- <div class="title"><h1><img src="{{ url_for('static', filename='img/searx-pixel.png') }}" alt="Searx Logo"/></h1></div>
+ <div class="title"><h1><img src="{{ url_for('static', filename='img/searx-pixel.png') }}" alt="searx Logo"/></h1></div>
{% include 'pix-art/search.html' %}
<p class="top_margin">
<a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a>
diff --git a/searx/templates/pix-art/preferences.html b/searx/templates/pix-art/preferences.html
index a4a6cd268..ea5557b07 100644
--- a/searx/templates/pix-art/preferences.html
+++ b/searx/templates/pix-art/preferences.html
@@ -1,4 +1,4 @@
-{% extends "default/base.html" %}
+{% extends "legacy/base.html" %}
{% block head %} {% endblock %}
{% block content %}
<div class="row">
diff --git a/searx/templates/pix-art/results.html b/searx/templates/pix-art/results.html
index 9385b608a..8999e0513 100644
--- a/searx/templates/pix-art/results.html
+++ b/searx/templates/pix-art/results.html
@@ -5,10 +5,10 @@
{% endfor %}
{% else %}
{% extends "pix-art/base.html" %}
-{% block title %}{{ q }} - {% endblock %}
+{% block title %}{{ q|e }} - {% endblock %}
{% block meta %}{% endblock %}
{% block content %}
-<div id="logo"><a href="./"><img src="{{ url_for('static', filename='img/searx-pixel-small.png') }}" alt="Searx Logo"/></a></div>
+<div id="logo"><a href="./"><img src="{{ url_for('static', filename='img/searx-pixel-small.png') }}" alt="searx Logo"/></a></div>
<div class="preferences_container right"><a href="{{ url_for('preferences') }}" id="preferences"><span>preferences</span></a></div>
<div class="small search center">
{% include 'pix-art/search.html' %}
@@ -25,8 +25,8 @@
</span>
<div id="pagination">
<br />
- <input type="button" onclick="load_more('{{ q }}', {{ pageno+1 }})" id="load_more" value="{{ _('Load more...') }}" />
+ <input type="button" onclick="load_more('{{ q|e }}', {{ pageno+1 }})" id="load_more" value="{{ _('Load more...') }}" />
</div>
</div>
{% endblock %}
-{% endif %} \ No newline at end of file
+{% endif %}
diff --git a/searx/templates/pix-art/stats.html b/searx/templates/pix-art/stats.html
index 70fe98ac7..372447e23 100644
--- a/searx/templates/pix-art/stats.html
+++ b/searx/templates/pix-art/stats.html
@@ -1,4 +1,4 @@
-{% extends "default/base.html" %}
+{% extends "legacy/base.html" %}
{% block head %} {% endblock %}
{% block content %}
<h2>{{ _('Engine stats') }}</h2>
diff --git a/searx/translations/bg/LC_MESSAGES/messages.mo b/searx/translations/bg/LC_MESSAGES/messages.mo
index 887d052bd..926beb989 100644
--- a/searx/translations/bg/LC_MESSAGES/messages.mo
+++ b/searx/translations/bg/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/bg/LC_MESSAGES/messages.po b/searx/translations/bg/LC_MESSAGES/messages.po
index b5f443001..82fa87c99 100644
--- a/searx/translations/bg/LC_MESSAGES/messages.po
+++ b/searx/translations/bg/LC_MESSAGES/messages.po
@@ -3,94 +3,124 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# poke amom <van_ds_ff@mail.bg>, 2015
+# ubone <van_ds_ff@mail.bg>, 2015
+# ubone <van_ds_ff@mail.bg>, 2016
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Bulgarian (http://www.transifex.com/asciimoo/searx/language/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "файлове"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
-msgstr "общ"
+msgstr "общо"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "музика"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "социална мрежа"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "изображения"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "видео"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
-msgstr "ай-ти"
+msgstr "IT"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "новини"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "карта"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
-msgstr ""
+msgstr "наука"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "преди {minutes} минута(минути)"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "преди {hours} час(ове), {minutes} минута(минути)"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Страницата зарежда (сек)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Брой резултати"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Грешки"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Поправи HTTP връзки на HTTPS, ако е възможно"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "Търси при избор на категория"
@@ -105,7 +135,7 @@ msgstr "Търси веднага при избрана категория. Из
msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"."
-msgstr ""
+msgstr "Показва IP-то ви и др. инфо, ако търсенето е \"ip\" или \"user agent\"."
#: searx/plugins/tracker_url_remover.py:26
msgid "Tracker URL remover"
@@ -115,6 +145,32 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -201,8 +257,8 @@ msgstr "Метод"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Безопасно търсене"
@@ -260,31 +316,30 @@ msgid "Red"
msgstr "Червено"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Използвани търсачки в момента "
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Име на търсачка"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Категория"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -292,17 +347,16 @@ msgstr "Позволи"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Забрани"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -310,43 +364,43 @@ msgid ""
msgstr "Тези настройки се съхраняват във вашите бисквитки. Това ни позволява да не съхраняваме тази информация за вас."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
"track you."
-msgstr "Тези бисквитки служат за ваше удобство. Ние не ги използваме, за да Ви следим."
+msgstr "Тези бисквитки служат за ваше удобство. Ние не ги използваме, за да ви следим."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "запази"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Върни първоначалните"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "назад"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "Търси URL"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Свали резултатите"
@@ -357,19 +411,19 @@ msgstr "Отговори"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Предложения"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "предишна страница"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "следваща страница"
@@ -405,13 +459,13 @@ msgstr "Лийчър"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "магнитна връзка"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "торент файл"
@@ -419,18 +473,37 @@ msgstr "торент файл"
msgid "Click on the magnifier to perform search"
msgstr "Кликнете лупичката, за да изпълните търсене"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "кеширана"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr ""
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr ""
@@ -448,17 +521,17 @@ msgid "General"
msgstr "Общи"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Търсачки"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Добавки"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Бисквитки"
@@ -493,36 +566,46 @@ msgstr "Филтрирай съдържание"
msgid "Change searx layout"
msgstr "Промени оформлението на searx"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "Пряк път"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "Средно време"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "Макс. време"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Това е списък на бисквитки с техните стойности, които searx съхранява на вашия компютър."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "Име на бисквитката"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "Стойност"
@@ -530,7 +613,7 @@ msgstr "Стойност"
msgid "Search results"
msgstr "Резултати от търсенето"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Връзки"
@@ -539,18 +622,26 @@ msgstr "Връзки"
msgid "Start search"
msgstr "Започни търсене"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Покажи филтрите за търсене"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Скрий филтрите за търсене"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "статистики"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/de/LC_MESSAGES/messages.mo b/searx/translations/de/LC_MESSAGES/messages.mo
index 7d3451265..41b91a9a9 100644
--- a/searx/translations/de/LC_MESSAGES/messages.mo
+++ b/searx/translations/de/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/de/LC_MESSAGES/messages.po b/searx/translations/de/LC_MESSAGES/messages.po
index 2ba9cc51e..0b12358a5 100644
--- a/searx/translations/de/LC_MESSAGES/messages.po
+++ b/searx/translations/de/LC_MESSAGES/messages.po
@@ -15,89 +15,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:07+0000\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 18:40+0000\n"
"Last-Translator: Thomas Pointhuber\n"
"Language-Team: German (http://www.transifex.com/asciimoo/searx/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "Dateien"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "Allgemein"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "Musik"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "Soziale Medien"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "Bilder"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "Videos"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "IT"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "Neuigkeiten"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "Karte"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr "Wissenschaft"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "vor {minutes} Minute(n)"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "vor {hours} Stunde(n), {minutes} Minute(n)"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Ladezeit (sek)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Trefferanzahl"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Punkte"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Punkte pro Treffer"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Fehler"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI umschreiben"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Vermeidet Bezahlschranken durch die Weiterleitung zu der Open-Access Version falls möglich"
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Wandelt wenn möglich HTTP Links in HTTPS Links um"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Undendliches Scrollen"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "Lädt automatisch die nächste Seite wenn das Ende der aktuellen Seite erreicht wurde"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "Öffne Links in einem neuen Browser Tab"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Links werden normalerweise im gleichen Fenster geöffnet. Dieses Plugin überschreibt dieses Verhalten und öffnet Links in einem neuen Browser Tab bzw Fenster.\n(es wird JavaScript benötigt)"
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "Starte Suche wenn Kategorie angeklickt wird"
@@ -122,6 +151,32 @@ msgstr "Tracker-URL entferner"
msgid "Remove trackers arguments from the returned URL"
msgstr "Entferne Tracker Argumente von den URLs"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Vim angelehnte Tastenkombinationen"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Navigiere in der Ergebnisseite mit Vim ähnlichen Tastataurkombinationen (es wird JavaScript benötigt).\nDrücke \"h\" auf der Start bzw. Ergebnisseite um eine Hifefenster anzuzeigen"
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Gehe zu %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr "Suchseite"
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -208,8 +263,8 @@ msgstr "Methode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Sichere Suche (SafeSearch)"
@@ -267,31 +322,30 @@ msgid "Red"
msgstr "Rot"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Aktuell benutzte Suchmaschinen"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Suchmaschinenname"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Kategorie"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -299,17 +353,16 @@ msgstr "Erlauben"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Blockieren"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -317,8 +370,8 @@ msgid ""
msgstr "Diese Informationen werden in Cookies auf Ihrem Rechner gespeichert, damit wir keine Ihrer persönlichen Daten speichern müssen."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -326,34 +379,34 @@ msgid ""
msgstr "Diese Cookies dienen einzig Ihrem Komfort. Wir verwenden sie nicht, um Sie zu überwachen."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "Speichern"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Zurücksetzen"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "Zurück"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "Such-URL"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Ergebnisse herunterladen"
@@ -364,19 +417,19 @@ msgstr "Antworten"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Vorschläge"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "vorherige Seite"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "nächste Seite"
@@ -412,13 +465,13 @@ msgstr "Leecher"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "Magnet Link"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "Torrent"
@@ -426,18 +479,37 @@ msgstr "Torrent"
msgid "Click on the magnifier to perform search"
msgstr "klicke auf die Lupe, um die Suche zu starten"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr "Ergebniss in neuem Tab"
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr "Ein"
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr "Aus"
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "Im Cache"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Experteneinstellungen"
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Powered by"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "eine privatsphären-respektierende, hackbare Metasuchmaschine"
@@ -455,17 +527,17 @@ msgid "General"
msgstr "Allgemein"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Suchmaschinen"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Erweiterungen"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Cookies"
@@ -500,36 +572,46 @@ msgstr "Inhalte filtern"
msgid "Change searx layout"
msgstr "ändere das Aussehen von searx"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "wähle das Aussehen des Design"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "Aussehen"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "Abkürzung"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "mittlere Zeit"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "max. Zeit"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Diese Liste zeigt alle Daten welche searx auf deinem Computer speichert."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "Mit dieser Liste können Sie die Transparenz von searx bewerten"
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "Cookie Name"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "Wert"
@@ -537,7 +619,7 @@ msgstr "Wert"
msgid "Search results"
msgstr "Suchergebnisse"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Links"
@@ -546,18 +628,26 @@ msgstr "Links"
msgid "Start search"
msgstr "Suche starten"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Suchfilter anzeigen"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Suchfilter verstecken"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "Statistiken"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr "Jederzeit"
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr "Letzter Tag"
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr "Letzte Woche"
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr "Letztes Monat"
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/el_GR/LC_MESSAGES/messages.mo b/searx/translations/el_GR/LC_MESSAGES/messages.mo
index 385bcbc84..2da4ee02e 100644
--- a/searx/translations/el_GR/LC_MESSAGES/messages.mo
+++ b/searx/translations/el_GR/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/el_GR/LC_MESSAGES/messages.po b/searx/translations/el_GR/LC_MESSAGES/messages.po
index 73b49e27f..5d62b3ce5 100644
--- a/searx/translations/el_GR/LC_MESSAGES/messages.po
+++ b/searx/translations/el_GR/LC_MESSAGES/messages.po
@@ -8,89 +8,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Greek (Greece) (http://www.transifex.com/asciimoo/searx/language/el_GR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: el_GR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "αρχεία"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "γενικά"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "μουσική"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "κοινωνικά δίκτυα"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "εικόνες"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr ""
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr ""
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "νέα"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "χάρτης"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr ""
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr ""
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr ""
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr ""
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Αριθμός αποτελεσμάτων"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Λάθη"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr ""
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr ""
@@ -115,6 +144,32 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -201,8 +256,8 @@ msgstr "Μέθοδος"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr ""
@@ -260,31 +315,30 @@ msgid "Red"
msgstr "Κόκκινο"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr ""
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr ""
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Κατηγορία"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -292,17 +346,16 @@ msgstr ""
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr ""
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -310,8 +363,8 @@ msgid ""
msgstr ""
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -319,34 +372,34 @@ msgid ""
msgstr ""
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "αποθήκευση"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr ""
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "πίσω"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr ""
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr ""
@@ -357,19 +410,19 @@ msgstr "Απαντήσεις"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Προτάσεις"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "προηγούμενη σελίδα"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "επόμενη σελίδα"
@@ -405,13 +458,13 @@ msgstr ""
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr ""
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr ""
@@ -419,18 +472,37 @@ msgstr ""
msgid "Click on the magnifier to perform search"
msgstr ""
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr ""
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr ""
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr ""
@@ -448,17 +520,17 @@ msgid "General"
msgstr ""
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr ""
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr ""
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr ""
@@ -493,36 +565,46 @@ msgstr ""
msgid "Change searx layout"
msgstr ""
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr ""
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr ""
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr ""
@@ -530,7 +612,7 @@ msgstr ""
msgid "Search results"
msgstr "Αποτελέσματα αναζήτησης"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Σύνδεσμοι"
@@ -539,18 +621,26 @@ msgstr "Σύνδεσμοι"
msgid "Start search"
msgstr "Έναρξη αναζήτησης"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Προβολή φίλτρων αναζήτησης"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Απόκρυψη φίλτρων αναζήτησης"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "στατιστικά"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/en/LC_MESSAGES/messages.mo b/searx/translations/en/LC_MESSAGES/messages.mo
index e852afc30..48bf06224 100644
--- a/searx/translations/en/LC_MESSAGES/messages.mo
+++ b/searx/translations/en/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/eo/LC_MESSAGES/messages.mo b/searx/translations/eo/LC_MESSAGES/messages.mo
index d9d1d5fc8..fcddb7d41 100644
--- a/searx/translations/eo/LC_MESSAGES/messages.mo
+++ b/searx/translations/eo/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/eo/LC_MESSAGES/messages.po b/searx/translations/eo/LC_MESSAGES/messages.po
index 51323c264..861b0d379 100644
--- a/searx/translations/eo/LC_MESSAGES/messages.po
+++ b/searx/translations/eo/LC_MESSAGES/messages.po
@@ -3,94 +3,123 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# juanda097 <juanda097@openmailbox.org>, 2015
+# juanda097 <juanda097@openmailbox.org>, 2015-2016
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Esperanto (http://www.transifex.com/asciimoo/searx/language/eo/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: eo\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "dosieroj"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "ĝenerala"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "muziko"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "sociaj retservoj"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "bildoj"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "videoj"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr ""
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "novaĵoj"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "mapo"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
-msgstr ""
+msgstr "scienco"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr ""
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr ""
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr ""
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Nombro de rezultoj"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Poentaroj"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Poentaroj por unu rezulto"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Eraroj"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Reverki HTTP ligiloj HTTP se eble"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr ""
@@ -115,6 +144,32 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -196,15 +251,15 @@ msgstr ""
#: searx/templates/oscar/preferences.html:85
#: searx/templates/pix-art/preferences.html:30
msgid "Method"
-msgstr ""
+msgstr "Metodo"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
-msgstr ""
+msgstr " SekuraSerĉo"
#: searx/templates/courgette/preferences.html:66
#: searx/templates/default/preferences.html:67
@@ -260,31 +315,30 @@ msgid "Red"
msgstr "Ruĝa"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
-msgstr ""
+msgstr " Aktuale uzitajn serĉilojn"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
-msgstr ""
+msgstr " Motoro nomo"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Kategorio"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -292,17 +346,16 @@ msgstr "Permesi"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Bloko"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -310,8 +363,8 @@ msgid ""
msgstr ""
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -319,34 +372,34 @@ msgid ""
msgstr ""
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr ""
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr ""
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr ""
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr ""
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Deŝuto rezultoj"
@@ -357,21 +410,21 @@ msgstr "Respondoj"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr ""
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
-msgstr ""
+msgstr " antaŭa paĝo"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
-msgstr ""
+msgstr " sekvanta paĝo"
#: searx/templates/courgette/search.html:3
#: searx/templates/default/search.html:3 searx/templates/oscar/search.html:4
@@ -405,13 +458,13 @@ msgstr ""
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr ""
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr ""
@@ -419,18 +472,37 @@ msgstr ""
msgid "Click on the magnifier to perform search"
msgstr ""
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr ""
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr ""
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr ""
@@ -445,20 +517,20 @@ msgstr ""
#: searx/templates/oscar/preferences.html:17
#: searx/templates/oscar/preferences.html:25
msgid "General"
-msgstr ""
+msgstr "Ĝenerala"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
-msgstr ""
+msgstr "Motoroj"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr ""
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr ""
@@ -493,36 +565,46 @@ msgstr ""
msgid "Change searx layout"
msgstr ""
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr ""
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr ""
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr ""
@@ -530,26 +612,34 @@ msgstr ""
msgid "Search results"
msgstr "Serĉrezultoj"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr ""
#: searx/templates/oscar/search.html:6
#: searx/templates/oscar/search_full.html:11
msgid "Start search"
+msgstr "Komenco serĉo"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "statistiko"
+
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
msgstr ""
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
msgstr ""
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
msgstr ""
-#: searx/templates/oscar/stats.html:2
-msgid "stats"
-msgstr "statistiko"
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
diff --git a/searx/translations/es/LC_MESSAGES/messages.mo b/searx/translations/es/LC_MESSAGES/messages.mo
index 1afc7256d..49c156f2e 100644
--- a/searx/translations/es/LC_MESSAGES/messages.mo
+++ b/searx/translations/es/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/es/LC_MESSAGES/messages.po b/searx/translations/es/LC_MESSAGES/messages.po
index de6c0a438..332ffc60b 100644
--- a/searx/translations/es/LC_MESSAGES/messages.po
+++ b/searx/translations/es/LC_MESSAGES/messages.po
@@ -7,94 +7,125 @@
# Alejandro León Aznar, 2014
# Alejandro León Aznar, 2014-2015
# juanda097 <juanda097@openmailbox.org>, 2016
+# marc, 2016
# Oscar Carrero <ocf@openmailbox.org>, 2015
+# wefwefew ewfewfewf <nnnedmz0d@moakt.ws>, 2016
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-02-24 23:02+0000\n"
-"Last-Translator: juanda097 <juanda097@openmailbox.org>\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/asciimoo/searx/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "Archivos"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "General"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "Música"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "Medios sociales"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "Imágenes"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "Vídeos"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
-msgstr "TIC"
+msgstr "Informática"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
-msgstr "noticias"
+msgstr "Noticias"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
-msgstr "mapa"
+msgstr "Mapa"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
-msgstr "ciencia"
+msgstr "Ciencia"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "hace {minutes} minuto(s)"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "hace {hours} hora(s) y {minutes} minuto(s)"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Tiempo de carga (segundos)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Número de resultados"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Puntuaciones"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Puntuaciones por resultado"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Errores"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Cambiar los enlaces HTTP a HTTPS si es posible"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "Abrir los enlaces del resultado en una nueva pestaña del navegador"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Los resultados se abren en la misma ventana por defecto. Este plugin sobrescribe el comportamiento por defecto para abrir enlaces en nuevas pestañas / ventanas. (es necesario JavaScript)"
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "Buscar en la categoría seleccionada"
@@ -119,6 +150,32 @@ msgstr "Eliminador de URL rastreadora"
msgid "Remove trackers arguments from the returned URL"
msgstr "Eliminar los argumentos de los rastreadores en la URL devuelta"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Teclas de acceso rápido como-Vim"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Navegar por los resultados de búsqueda con las teclas de acceso rápido como-Vim (es necesario JavaScript). Pulse la tecla \"h\" en la página principal o en el resultado para obtener ayuda."
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -205,8 +262,8 @@ msgstr "Método"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Búsqueda segura"
@@ -264,31 +321,30 @@ msgid "Red"
msgstr "Rojo"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Motores de búsqueda actualmente en uso"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Nombre del motor de búsqueda"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Categoría"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -296,17 +352,16 @@ msgstr "Permitir"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Bloquear"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -314,8 +369,8 @@ msgid ""
msgstr "Esta configuración se guarda en sus cookies, lo que nos permite no almacenar dicha información sobre usted."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -323,34 +378,34 @@ msgid ""
msgstr "Estas cookies son para su propia comodidad, no las utilizamos para rastrearle."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "Guardar"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Restablecer configuración por defecto"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "Atrás"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "URL de la búsqueda"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Descargar resultados"
@@ -361,19 +416,19 @@ msgstr "Respuestas"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Sugerencias"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "Página anterior"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "Página siguiente"
@@ -409,13 +464,13 @@ msgstr "Descargador"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "magnet link (enlace sin archivo)"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "archivo torrent"
@@ -423,18 +478,37 @@ msgstr "archivo torrent"
msgid "Click on the magnifier to perform search"
msgstr "Haz clic en la lupa para realizar la búsqueda"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "en caché"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Creado por"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "un metabuscador hackable que respeta la privacidad"
@@ -452,17 +526,17 @@ msgid "General"
msgstr "General"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Motores"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugins"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Cookies"
@@ -497,36 +571,46 @@ msgstr "Filtro de contenido"
msgid "Change searx layout"
msgstr "Cambiar aspecto de searx"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "Elige un estilo para este tema"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "Estilo"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "Atajo"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "Tiempo promedio"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "Tiempo máximo"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Esta es la lista de cookies y sus valores que searx está almacenando en tu ordenador."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "Con esa lista puedes valorar la transparencia de searx."
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "Nombre de la cookie"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "Valor"
@@ -534,7 +618,7 @@ msgstr "Valor"
msgid "Search results"
msgstr "Buscar"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Enlaces"
@@ -543,18 +627,26 @@ msgstr "Enlaces"
msgid "Start search"
msgstr "Comenzar búsqueda"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Mostrar filtros de búsqueda"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Ocultar filtros de búsqueda"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "estadísitcas"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/fr/LC_MESSAGES/messages.mo b/searx/translations/fr/LC_MESSAGES/messages.mo
index d33c51b63..c21b8415b 100644
--- a/searx/translations/fr/LC_MESSAGES/messages.mo
+++ b/searx/translations/fr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/fr/LC_MESSAGES/messages.po b/searx/translations/fr/LC_MESSAGES/messages.po
index 77ccaa28e..3a2843757 100644
--- a/searx/translations/fr/LC_MESSAGES/messages.po
+++ b/searx/translations/fr/LC_MESSAGES/messages.po
@@ -13,89 +13,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:31+0000\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 17:58+0000\n"
"Last-Translator: Cqoicebordel <david.barouh@wanadoo.fr>\n"
"Language-Team: French (http://www.transifex.com/asciimoo/searx/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "fichiers"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "général"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "musique"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "réseaux sociaux"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "images"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "vidéos"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "informatique"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "actus"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "carte"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr "science"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "il y a {minutes} minute(s)"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "il y a {hours} heure(s), {minutes} minute(s)"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Chargement de la page (sec)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Nombre de résultats"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Score"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Score par résultat"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Erreurs"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Utiliser DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Contourne les verrous payants de certaines publications scientifiques en redirigeant vers la version ouverte de ces papiers si elle est disponible."
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Réécrire les liens HTTP en HTTPS si possible"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Défilement infini"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "Charge automatiquement la page suivante quand vous arriver en bas de la page"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "Ouvrir les liens de résultats dans un nouvel onglet"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Les résultats sont ouvert dans la même fenêtre par défaut. Cette extension change le comportement par défaut pour ouvrir les liens dans des nouveaux onglets ou fenêtres (Javascript est nécessaire)"
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "Lancer la recherche lors du choix d'une catégorie"
@@ -120,6 +149,32 @@ msgstr "Nettoyeur d'URL de suivis"
msgid "Remove trackers arguments from the returned URL"
msgstr "Retire les arguments utilisés pour vous pister des URL retournées"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Raccourcis comme Vim"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Parcourez les résultats de recherche avec des raccourcis clavier similaires à Vim (Javascript est nécessaire. Appuyez sur \"h\" dans la fenêtre principale de résultats pour afficher de l'aide."
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr "Page non trouvée"
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Aller à %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr "la page d'accueil"
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -206,8 +261,8 @@ msgstr "Méthode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Recherche sécurisée"
@@ -265,31 +320,30 @@ msgid "Red"
msgstr "Rouge"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Moteurs de recherche actuellement utilisés"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Nom du moteur"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Catégorie"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -297,17 +351,16 @@ msgstr "Autoriser"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Bloquer"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -315,8 +368,8 @@ msgid ""
msgstr "Ces paramètres sont stockés dans vos cookies ; ceci nous permet de ne pas collecter vos données."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -324,34 +377,34 @@ msgid ""
msgstr "Ces cookies existent pour votre confort d'utilisation, nous ne les utilisons pas pour vous espionner."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "enregistrer"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Remettre les valeurs par défaut"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "retour"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "URL de recherche"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Télécharger les résultats"
@@ -362,19 +415,19 @@ msgstr "Réponses"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Suggestions"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "page précédente"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "page suivante"
@@ -410,13 +463,13 @@ msgstr "Téléchargeurs"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "lien magnet"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "fichier torrent"
@@ -424,18 +477,37 @@ msgstr "fichier torrent"
msgid "Click on the magnifier to perform search"
msgstr "Cliquez sur la loupe pour effectuer une recherche"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr "Résultats dans de nouveaux onglets"
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr "On"
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr "Off"
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "en cache"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Paramètres avancés"
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Powered by"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "un meta-moteur de recherche hackable et respectueux de la vie privée"
@@ -453,17 +525,17 @@ msgid "General"
msgstr "Général"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Moteurs"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugins"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Cookies"
@@ -498,36 +570,46 @@ msgstr "Filtrer le contenu"
msgid "Change searx layout"
msgstr "Modifier l'affichage de searx"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "Choisir un style pour ce thème"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "Style"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "Raccourcis"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "Temps moy."
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "Temps max"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "C'est une liste de cookies et de leurs valeurs que searx enregistre sur votre ordinateur."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "Avec cette liste, vous pouvez juger de la transparence de searx."
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "Nom du cookie"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "Valeur"
@@ -535,7 +617,7 @@ msgstr "Valeur"
msgid "Search results"
msgstr "Résultats de recherche"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Liens"
@@ -544,18 +626,26 @@ msgstr "Liens"
msgid "Start search"
msgstr "Lancer une recherche"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Afficher les filtres de recherche"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Cacher les filtres de recherche"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "statistiques"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr "N'importe quand"
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr "Dernières 24h"
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr "Semaine précédente"
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr "Mois précédent"
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
@@ -586,7 +676,7 @@ msgstr "Information !"
#: searx/templates/oscar/messages/no_cookies.html:4
msgid "currently, there are no cookies defined."
-msgstr "il n'y a pas de cookies définit pour le moment."
+msgstr "il n'y a pas de cookies définis pour le moment."
#: searx/templates/oscar/messages/no_data_available.html:4
msgid "There is currently no data available. "
diff --git a/searx/translations/he/LC_MESSAGES/messages.mo b/searx/translations/he/LC_MESSAGES/messages.mo
index 4458e0f3c..743ed6bb5 100644
--- a/searx/translations/he/LC_MESSAGES/messages.mo
+++ b/searx/translations/he/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/he/LC_MESSAGES/messages.po b/searx/translations/he/LC_MESSAGES/messages.po
index 753d25dfa..19830743c 100644
--- a/searx/translations/he/LC_MESSAGES/messages.po
+++ b/searx/translations/he/LC_MESSAGES/messages.po
@@ -12,112 +12,167 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-03-01 15:21+0000\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-05 18:36+0000\n"
"Last-Translator: GenghisKhan <genghiskhan@gmx.ca>\n"
"Language-Team: Hebrew (http://www.transifex.com/asciimoo/searx/language/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: he\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "קבצים"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "כללי"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "מוזיקה"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "מדיה חברתית"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "תמונות"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "סרטונים"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "IT"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "חדשות"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
-msgstr "מפה"
+msgstr "מפות"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr "מדע"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "לפני {minutes} דקות"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "לפני {hours} שעות, {minutes} דקות"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "עומס עמוד (שניות)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "מספר תוצאות"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "דירוג"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "דירוג לכל תוצאה"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "שגיאות"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "שכתוב DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
-msgstr "שכתב קישורי HTTP לקישורי HTTPS כאשר אפשר"
+msgstr "שכתוב קישורי HTTP לקישורי HTTPS כאשר ניתן"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "גלילה אינסופית"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "טען אוטומטית עמוד הלאה כאשר גוללים לתחתית של עמוד נוכחי"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "פתח קישורי תוצאה בכרטיסיות דפדפן חדשות"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "תוצאות נפתחות בתוך אותו חלון באופן שגרתי. תוסף זה משכתב את ההתנהגות השגרתית כדי לפתוח קישורים בתוך כרטיסיות/חלונות חדשים. (JavaScript נדרש)"
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
-msgstr "חפש בעת בחירת קטגוריה"
+msgstr "חיפוש בעת בחירת קטגוריה"
#: searx/plugins/search_on_category_select.py:19
msgid ""
"Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)"
-msgstr "בצע חיפוש כאשר קטגוריה נבחרת. נטרל כדי לבחור קטגוריות מרובות. (מצריך JavaScript)"
+msgstr "ביצוע חיפוש כאשר קטגוריה נבחרת. יש לנטרל את תוסף זה כדי לבחור קטגוריות מרובות. (מצריך JavaScript)"
#: searx/plugins/self_info.py:20
msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"."
-msgstr "מציגה כתובת IP המשוייכת לך אם השאילתא היא \"ip\" וגם סוכן משתמש אם שאילתא מכילה \"user agent\"."
+msgstr "הצגת כתובת IP המשוייכת לך אם השאילתא היא \"ip\" וגם סוכן משתמש אם השאילתא מכילה \"user agent\"."
#: searx/plugins/tracker_url_remover.py:26
msgid "Tracker URL remover"
-msgstr "מסיר URL גשש"
+msgstr "הסרת Tracker URL"
#: searx/plugins/tracker_url_remover.py:27
msgid "Remove trackers arguments from the returned URL"
-msgstr "הסר ארגומנטים מאתרים מתוך URL מוחזר"
+msgstr "הסרת ארגומנטים מאתרים מתוך URL מוחזר"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "מקשים חמים Vim-like"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "ניווט בתוצאות בעזרת מקשים חמים Vim-like (JavaScript נדרש). לחיצה על קליד \"h\" במסך ראשי או תוצאות תציג דו שיח עזרה."
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr "עמוד לא נמצא"
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "עבור אל %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
@@ -205,8 +260,8 @@ msgstr "שיטה"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "חיפוש בטוח"
@@ -233,7 +288,7 @@ msgstr "בלי"
#: searx/templates/oscar/preferences.html:104
#: searx/templates/pix-art/preferences.html:39
msgid "Themes"
-msgstr "מוטיבים"
+msgstr "עיצובים"
#: searx/templates/courgette/preferences.html:83
msgid "Color"
@@ -264,31 +319,30 @@ msgid "Red"
msgstr "אדום"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "מנועי חיפוש בשימוש עתה"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "שם מנוע"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "קטגוריה"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -296,17 +350,16 @@ msgstr "התר"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "חסום"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -314,8 +367,8 @@ msgid ""
msgstr "הגדרות אלו מאוחסנות בתוך העוגיות שלך, אלו מאפשרות לנו לא לאחסן את מידע זה אודותייך."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -323,34 +376,34 @@ msgid ""
msgstr "עוגיות אלו משרתות את נוחותך הבלעדית, אנחנו לא משתמשים בהן כדי לעקוב אחריך."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "שמור"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "אפס ברירות מחדל"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "חזור"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "קישור חיפוש"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "הורד תוצאות"
@@ -361,19 +414,19 @@ msgstr "תשובות"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "הצעות"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "עמוד קודם"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "עמוד הבא"
@@ -409,13 +462,13 @@ msgstr "יונקים"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "קישור magnet"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "קובץ torrent"
@@ -423,18 +476,37 @@ msgstr "קובץ torrent"
msgid "Click on the magnifier to perform search"
msgstr "לחצו על הזכוכית מגדלת כדי לבצע חיפוש"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr "תוצאות בכרטיסיות חדשות"
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "מוטמן"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "הגדרות מתקדמות"
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "מופעל באמצעות"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "מנוע מטא-חיפוש גמיש, ומכבד פרטיות"
@@ -444,7 +516,7 @@ msgstr "בית"
#: searx/templates/oscar/navbar.html:14 searx/templates/oscar/navbar.html:24
msgid "Toggle navigation"
-msgstr "Toggle ניווט"
+msgstr "החלף ניווט"
#: searx/templates/oscar/preferences.html:17
#: searx/templates/oscar/preferences.html:25
@@ -452,17 +524,17 @@ msgid "General"
msgstr "כללי"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "מנועים"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "תוספים"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "עוגיות"
@@ -480,53 +552,63 @@ msgstr "מציאת דברים בזמן הקלדה"
#: searx/templates/oscar/preferences.html:77
msgid "Proxying image results through searx"
-msgstr "שלוף תוצאות תמונה דרך searx"
+msgstr "שליפת (מבעד Proxy) תוצאות תמונה דרך searx"
#: searx/templates/oscar/preferences.html:86
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
-msgstr "שינוי האופן בו טפסים נשלחים, <a href=\"http://he.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">למדו עוד אודות שיטות בקשה (request methods)</a>"
+msgstr "שינוי האופן בו טפסים נשלחים, <a href=\"https://he.wikipedia.org/wiki/Hypertext_Transfer_Protocol#.D7.A9.D7.99.D7.98.D7.95.D7.AA_.D7.91.D7.A7.D7.A9.D7.94\" rel=\"external\">למדו עוד אודות שיטות בקשה (request methods)</a>"
#: searx/templates/oscar/preferences.html:95
msgid "Filter content"
-msgstr "סנן תוכן"
+msgstr "סינון תוכן"
#: searx/templates/oscar/preferences.html:105
msgid "Change searx layout"
msgstr "שינוי ממשק searx"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "בחר סגנון עבור עיצוב זה"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "סגנון"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "קיצור דרך"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "זמן ממוצע"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "זמן מירבי"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "זוהי רשימה של עוגיות וערכיהן אשר searx מאחסנת על המחשב שלך."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "בעזרת רשימה זו, באפשרותך לגשת אל searx transparency."
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "שם עוגייה"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "ערך"
@@ -534,7 +616,7 @@ msgstr "ערך"
msgid "Search results"
msgstr "תוצאות חיפוש"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "קישורים"
@@ -543,18 +625,26 @@ msgstr "קישורים"
msgid "Start search"
msgstr "התחל חיפוש"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "הצג מסנני חיפוש"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "הסתר מסנני חיפוש"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "סטטיסטיקות"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr "כל עת"
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr "יום אחרון"
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr "שבוע אחרון"
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr "חודש אחרון"
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/hu/LC_MESSAGES/messages.mo b/searx/translations/hu/LC_MESSAGES/messages.mo
index b418c486a..bf67caea6 100644
--- a/searx/translations/hu/LC_MESSAGES/messages.mo
+++ b/searx/translations/hu/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/hu/LC_MESSAGES/messages.po b/searx/translations/hu/LC_MESSAGES/messages.po
index ba2978e42..906b69bb9 100644
--- a/searx/translations/hu/LC_MESSAGES/messages.po
+++ b/searx/translations/hu/LC_MESSAGES/messages.po
@@ -5,96 +5,126 @@
# Translators:
# Adam Tauber <asciimoo@gmail.com>, 2014-2016
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014
+# Noémi Ványi <sitbackandwait@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-02-06 08:36+0000\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:42+0000\n"
"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Hungarian (http://www.transifex.com/asciimoo/searx/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "fájlok"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "általános"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "zene"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "közösségi média"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "képek"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "videók"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "it"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "hírek"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "térkép"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr "tudomány"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutes} perce"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} óra, {minutes} perce"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Válaszidők (sec)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Találatok száma"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Pontszámok"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Pontszámok találatonként"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Hibák"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Szabad publikációs oldalak"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Publikácós linkeknél szabad forrás használat, amennyiben lehetséges"
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "HTTP linkek lecserélése HTTPS-re"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Végtelenített találatok"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "További találatok automatikus betöltése"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "Találatok megnyitása új lapon"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "A találatok az aktuális oldalon nyílnak meg alapértelmezetten. Ez a plugin megváltoztatja ezt a működést és új lapra nyitja meg a találatokat. (ez a funkció JavaScript-et igényel)"
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
-msgstr "Azonnal keresés kategória választással"
+msgstr "Azonnali keresés kategória választással"
#: searx/plugins/search_on_category_select.py:19
msgid ""
@@ -116,6 +146,32 @@ msgstr "Tracker URL eltávolítás"
msgid "Remove trackers arguments from the returned URL"
msgstr "Felhasználó követéshez használt találati URL paraméterek eltávolítása"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Vim típusú billentyűzetes navigáció"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Navigálj néhány gombnyomással a találatok között. Aktiválás után a \"h\" betű lenyomásával jeleníthető meg részletes segítség a használatról. (Ez a funkció JavaScript-et igényel)"
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr "Az oldal nem található"
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Vissza a %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr "kereső oldalra"
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -202,8 +258,8 @@ msgstr "Method"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Felnőtt tartalom szűrés"
@@ -250,7 +306,7 @@ msgstr "Zöld"
#: searx/templates/courgette/preferences.html:89
msgid "Cyan"
-msgstr "Türkisz"
+msgstr "Türkiz"
#: searx/templates/courgette/preferences.html:90
msgid "Orange"
@@ -261,31 +317,30 @@ msgid "Red"
msgstr "Piros"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Jelenleg használt keresők"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Kereső neve"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Kategória"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -293,17 +348,16 @@ msgstr "Engedélyezés"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Tiltás"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -311,8 +365,8 @@ msgid ""
msgstr "Ezek a beállítások csak a böngésző cookie-jaiban tárolódnak."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -320,34 +374,34 @@ msgid ""
msgstr "Ezek a cookie-k csak kényelmi funkciókat látnak el, nem használjuk a felhasználók követésére."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "mentés"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Alapbeállítások visszaállítása"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "vissza"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "Keresési URL"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Találatok letöltése"
@@ -358,19 +412,19 @@ msgstr "Válaszok"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Javaslatok"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "előző oldal"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "következő oldal"
@@ -406,13 +460,13 @@ msgstr "Leecher"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "magnet link"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "torrent fájl"
@@ -420,18 +474,37 @@ msgstr "torrent fájl"
msgid "Click on the magnifier to perform search"
msgstr "A nagyítóra kattintva indítható a keresés"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr "Eredmények új tabon"
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr "On"
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr "Off"
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "tárolt"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Keresés beállításai"
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Az oldalt kiszolgálja: "
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "egy privátszféra tisztelő, könnyen módosítható metakereső"
@@ -449,17 +522,17 @@ msgid "General"
msgstr "Általános"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
-msgstr "Kereső motorok"
+msgstr "Keresőmotorok"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Pluginek"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Sütik"
@@ -494,36 +567,46 @@ msgstr "Tartalom szűrés"
msgid "Change searx layout"
msgstr "Megjelenés"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "Válassz megjelenést ehhez a témához"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "Megjelenés"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "Rövidítés"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "Átlag idő"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "Maximális idő"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Searx által használt sütik listája."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "Ez a lista a kereső transzparenciáját hivatott megmutatni."
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "Süti név"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "Érték"
@@ -531,7 +614,7 @@ msgstr "Érték"
msgid "Search results"
msgstr "Keresési eredmények"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Linkek"
@@ -540,18 +623,26 @@ msgstr "Linkek"
msgid "Start search"
msgstr "Keresés indítása"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Keresési szűrők megjelenítése"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Keresési szűrők elrejtése"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "statisztikák"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr "Bármikor"
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr "Legutóbbi nap"
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr "Legutóbbi hét"
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr "Legutóbbi hónap"
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/it/LC_MESSAGES/messages.mo b/searx/translations/it/LC_MESSAGES/messages.mo
index 756f41fb2..9b303e287 100644
--- a/searx/translations/it/LC_MESSAGES/messages.mo
+++ b/searx/translations/it/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/it/LC_MESSAGES/messages.po b/searx/translations/it/LC_MESSAGES/messages.po
index 672d1e054..7ad36c87a 100644
--- a/searx/translations/it/LC_MESSAGES/messages.po
+++ b/searx/translations/it/LC_MESSAGES/messages.po
@@ -10,89 +10,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/asciimoo/searx/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "documenti"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "generale"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "musica"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "social media"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "immagini"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "video"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "it"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "notizie"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "mappe"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr ""
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "di {minutes} minuti fa"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "di {ore} h e {minutes} minuti fa"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr " Caricamento della pagina (secondi)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Risultati ottenuti"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Punteggio"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Punteggio per risultato"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Errori"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr ""
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr ""
@@ -117,6 +146,32 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -203,8 +258,8 @@ msgstr "Metodo"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Ricerca rassicurato"
@@ -262,31 +317,30 @@ msgid "Red"
msgstr "Rosso"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Motori di ricerca attualmente in uso"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Nome del motore"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Categoria"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -294,17 +348,16 @@ msgstr "Autorizza"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Blocca"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -312,8 +365,8 @@ msgid ""
msgstr "Queste impostazioni sono salvate nei tuoi cookie, consentendoci di non conservare dati su di te."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -321,34 +374,34 @@ msgid ""
msgstr "I cookie sono funzionali ad un servizio migliore. Non usiamo i cookie per sorvegliarti."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "salva"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Azzerare default"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "indietro"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "URL della ricerca"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Scarica i risultati"
@@ -359,19 +412,19 @@ msgstr "Riposte"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Suggerimenti"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "pagina precedente"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "pagina successiva"
@@ -407,13 +460,13 @@ msgstr ""
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr ""
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr ""
@@ -421,18 +474,37 @@ msgstr ""
msgid "Click on the magnifier to perform search"
msgstr ""
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr ""
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr ""
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr ""
@@ -450,17 +522,17 @@ msgid "General"
msgstr ""
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr ""
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr ""
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr ""
@@ -495,36 +567,46 @@ msgstr ""
msgid "Change searx layout"
msgstr ""
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr ""
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr ""
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr ""
@@ -532,7 +614,7 @@ msgstr ""
msgid "Search results"
msgstr ""
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr ""
@@ -541,16 +623,24 @@ msgstr ""
msgid "Start search"
msgstr ""
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
msgstr ""
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
msgstr ""
-#: searx/templates/oscar/stats.html:2
-msgid "stats"
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
msgstr ""
#: searx/templates/oscar/messages/first_time.html:4
diff --git a/searx/translations/ja/LC_MESSAGES/messages.mo b/searx/translations/ja/LC_MESSAGES/messages.mo
index e8bb56ed5..3be04b797 100644
--- a/searx/translations/ja/LC_MESSAGES/messages.mo
+++ b/searx/translations/ja/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ja/LC_MESSAGES/messages.po b/searx/translations/ja/LC_MESSAGES/messages.po
index 00158358f..9d0dc7e1c 100644
--- a/searx/translations/ja/LC_MESSAGES/messages.po
+++ b/searx/translations/ja/LC_MESSAGES/messages.po
@@ -3,6 +3,7 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# Akio Nishimura <akionux@gmail.com>, 2016
# Thomas Pointhuber, 2014-2015
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014,2016
# Lucas Phillips <mail@lep.pw>, 2015
@@ -13,89 +14,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-02-14 00:11+0000\n"
-"Last-Translator: Akio Nishimura <akionux@gmail.com>\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Japanese (http://www.transifex.com/asciimoo/searx/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "ファイル"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "一般"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "音楽"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "ソーシャルメディア"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "画像"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "動画"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "情報技術"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "お知らせ"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "地図"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr "学問"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutes}分前"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours}時間と{minutes}分前"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "ページ読み込み時間 (秒)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "通知の数"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "スコア"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "検索結果当たりスコア"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "エラー"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "可能ならばHTTPリンクをHTTPSリンクに書き換える"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "検索結果のリンクを新しいタブで開く"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "デフォルトでは結果は同じウィンドウで開きます。このプラグインはデフォルトの動作を書き換えて新しいタブ/ウィンドウで開くようにします。(JavaScriptが必要です)"
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "カテゴリ選択したら検索を実行"
@@ -120,6 +150,32 @@ msgstr "トラッカーURLリムーバー"
msgid "Remove trackers arguments from the returned URL"
msgstr "返されたURLからトラッカー引数を消去します。"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Vim風のホットキー"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "検索結果をVim風のホットキーで操作します(JavaScriptが必要)。メインページまたは検索結果ページで\"h\"キーを押してヘルプを表示します。"
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -206,8 +262,8 @@ msgstr "方法"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "安全な検索"
@@ -265,31 +321,30 @@ msgid "Red"
msgstr "赤"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "現在使用中の検索エンジン"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "検索エンジン名"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "カテゴリー"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -297,17 +352,16 @@ msgstr "許可する"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "禁止する"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -315,8 +369,8 @@ msgid ""
msgstr "これらの設定はあなたのクッキーに保存されますが、これはサーバーがあなたの情報の保存するわけではありません。"
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -324,34 +378,34 @@ msgid ""
msgstr "クッキーはあなたが便利に使えるようにするために使うのであって、サーバーはあなたを追跡するためにクッキーを使うことはありません。"
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "保存"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "デフォルト設定に戻す"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "戻る"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "URLを検索する"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "ダウンロードするファイル形式"
@@ -362,19 +416,19 @@ msgstr "回答"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "提案"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "前のページ"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "次のページ"
@@ -410,13 +464,13 @@ msgstr "リーチャー"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "マグネットリンク"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "トレントファイル"
@@ -424,18 +478,37 @@ msgstr "トレントファイル"
msgid "Click on the magnifier to perform search"
msgstr "検索を実行するには虫めがねをクリックしてください"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "キャッシュ"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "提供:"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "プライバシー保護を重視した、ハッカブルなメタサーチエンジン"
@@ -453,17 +526,17 @@ msgid "General"
msgstr "一般設定"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "検索エンジン"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "プラグイン"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "クッキー"
@@ -498,36 +571,46 @@ msgstr "コンテンツをフィルタリングする"
msgid "Change searx layout"
msgstr "searxのレイアウトの変更"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "このテーマのスタイルを選択"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "スタイル"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "ショートカット"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "平均時間"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "最大時間"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "これはクッキーのリストで、これらの値はあなたのコンピュータに保存されています。"
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "このリストによって、あなたはsearxの透明性を評価できます。"
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "クッキー名"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "値"
@@ -535,7 +618,7 @@ msgstr "値"
msgid "Search results"
msgstr "検索結果"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "リンク"
@@ -544,18 +627,26 @@ msgstr "リンク"
msgid "Start search"
msgstr "検索を開始"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "サーチフィルタを表示"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "サーチフィルタを隠す"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "統計"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/nl/LC_MESSAGES/messages.mo b/searx/translations/nl/LC_MESSAGES/messages.mo
index bd55e44fd..744d55e02 100644
--- a/searx/translations/nl/LC_MESSAGES/messages.mo
+++ b/searx/translations/nl/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/nl/LC_MESSAGES/messages.po b/searx/translations/nl/LC_MESSAGES/messages.po
index b04ede24b..945bc2c51 100644
--- a/searx/translations/nl/LC_MESSAGES/messages.po
+++ b/searx/translations/nl/LC_MESSAGES/messages.po
@@ -9,89 +9,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-31 11:35+0000\n"
-"Last-Translator: Nathan Follens\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Dutch (http://www.transifex.com/asciimoo/searx/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "bestanden"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "algemeen"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "muziek"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "social media"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "afbeeldingen"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "video's"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "it"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "nieuws"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "kaart"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr "wetenschap"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutes} min geleden"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} uur, {minutes} min geleden"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Pagina laadt (sec)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Aantal zoekresultaten"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Scores"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Scores per zoekresultaat"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Fouten"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Herschrijf HTTP-koppelingen naar HTTPS, indien mogelijk"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "Open koppelingen in nieuwe tabbladen"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Resultaten worden standaard in hetzelfde venster geopend. Deze plug-in overschrijft het standaardgedrag zodat koppelingen in nieuwe tabbladen/vensters geopend worden. (JavaScript vereist)"
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "Zoeken bij selecteren van categorie"
@@ -116,6 +145,32 @@ msgstr "Tracker-URL verwijderaar"
msgid "Remove trackers arguments from the returned URL"
msgstr "Verwijdert trackerargumenten van de gekregen URL"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Sneltoetsen als in Vim"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Blader door zoekresultaten met sneltoetsen zoals die in Vim (JavaScript vereist). Druk op \"h\" op de hoofdpagina of de pagina met resultaten voor hulp."
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -202,8 +257,8 @@ msgstr "Methode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "SafeSearch"
@@ -261,31 +316,30 @@ msgid "Red"
msgstr "Rood"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Momenteel gebruikte zoekmachines"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Naam zoekmachine"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Categorie"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -293,17 +347,16 @@ msgstr "Toestaan"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Blokkeren"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -311,8 +364,8 @@ msgid ""
msgstr "Deze instellingen worden bewaard in je cookies. Hierdoor hoeven wij niets over jou te bewaren."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -320,34 +373,34 @@ msgid ""
msgstr "Deze cookies zijn alleen voor je eigen gemak, we gebruiken deze cookies niet om je te volgen."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "bewaren"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Standaardinstellingen herstellen"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "terug"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "Zoek URL"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Downloaden zoekresultaten"
@@ -358,19 +411,19 @@ msgstr "Antwoorden"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Suggesties"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "vorige pagina"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "volgende pagina"
@@ -406,13 +459,13 @@ msgstr "Ophaler"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "magneetlink"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "torrentbestand"
@@ -420,18 +473,37 @@ msgstr "torrentbestand"
msgid "Click on the magnifier to perform search"
msgstr "Klik op het vergrootglas om te zoeken"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "gecached"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Powered by"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "een privacy eerbiedigende, aanpasbare metazoekmachine"
@@ -449,17 +521,17 @@ msgid "General"
msgstr "Algemeen"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Zoekmachines"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugins"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Cookies"
@@ -494,36 +566,46 @@ msgstr "Filteren content"
msgid "Change searx layout"
msgstr "Wijzig searx layout"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "Kies een stijl voor dit thema"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "Stijl"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "Snelkoppeling"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "Gem. duur"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "Max. duur"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Dit is de lijst van cookies en hun waarden die searx op je computer opslaat."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "Met deze lijst kan je de openheid van searx beoordelen."
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "Cookienaam"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "Waarde"
@@ -531,7 +613,7 @@ msgstr "Waarde"
msgid "Search results"
msgstr "Zoekresultaten"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Links"
@@ -540,18 +622,26 @@ msgstr "Links"
msgid "Start search"
msgstr "Start zoeken"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Toon zoekfilters"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Verberg zoekfilters"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "stats"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/pt/LC_MESSAGES/messages.mo b/searx/translations/pt/LC_MESSAGES/messages.mo
index acf83eb6f..73a2c489e 100644
--- a/searx/translations/pt/LC_MESSAGES/messages.mo
+++ b/searx/translations/pt/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/pt_BR/LC_MESSAGES/messages.mo b/searx/translations/pt_BR/LC_MESSAGES/messages.mo
index 325b8f267..17b267bc0 100644
--- a/searx/translations/pt_BR/LC_MESSAGES/messages.mo
+++ b/searx/translations/pt_BR/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/pt_BR/LC_MESSAGES/messages.po b/searx/translations/pt_BR/LC_MESSAGES/messages.po
index 8580ff528..96d1a7360 100644
--- a/searx/translations/pt_BR/LC_MESSAGES/messages.po
+++ b/searx/translations/pt_BR/LC_MESSAGES/messages.po
@@ -8,89 +8,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/asciimoo/searx/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "Arquivos"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "geral"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "áudio"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "rede social"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "imagens"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "vídeos"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "códigos"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "notícias"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "mapas"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr ""
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutos} minuto(s) atrás"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{horas} hora(s), {minutos} minuto(s) atrás"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Carregamento da página (sec)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Número de resultados"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Pontuações"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Pontuações por resultado"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Erros"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Redirecionar conexões HTTP para HTTPS, se possível"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "Pesquisar na categoria selecionada"
@@ -115,6 +144,32 @@ msgstr "Remover Tracker da url"
msgid "Remove trackers arguments from the returned URL"
msgstr "Remover argumentos de url retornáveis"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -201,8 +256,8 @@ msgstr "Método"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Busca Segura"
@@ -260,31 +315,30 @@ msgid "Red"
msgstr "Vermelho"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Serviço de busca usado atualmente"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Nome do serviço"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Categoria"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -292,17 +346,16 @@ msgstr "Ativo"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Bloqueado"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -310,8 +363,8 @@ msgid ""
msgstr "Essas configurações são armazenadas em seus cookies, nos não armazenamos nenhum dado a seu respeito."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -319,34 +372,34 @@ msgid ""
msgstr "Estes cookies servem ao seu único propósito, nós não usamos esses cookies para rastreá-lo."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "salvar"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Redefinir configurações"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "voltar"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "Buscar URL"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Resultados para download"
@@ -357,19 +410,19 @@ msgstr "Perguntas"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Sugestões"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "Página anterior"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "Próxima página"
@@ -405,13 +458,13 @@ msgstr "Leecher"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "Link magnético"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "Arquivo torrent"
@@ -419,18 +472,37 @@ msgstr "Arquivo torrent"
msgid "Click on the magnifier to perform search"
msgstr "Clique na lupa para executar a busca"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "em cache"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Distribuído por"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "um mecanismo de metabusca que respeita a sua privacidade"
@@ -448,17 +520,17 @@ msgid "General"
msgstr "Geral"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Buscadores"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Complementos"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Cookies"
@@ -493,36 +565,46 @@ msgstr "Filtrar conteúdo"
msgid "Change searx layout"
msgstr "Alterar interface do searx"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "Atalhos"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "Avg.tempo"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "Tempo máximo"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Esta é a lista de cookies que searx está armazenando em seu computador."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr "Com essa lista, você pode avaliar a transparência do searx."
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "Nome do cookie"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "Valor"
@@ -530,7 +612,7 @@ msgstr "Valor"
msgid "Search results"
msgstr "Procurar resultados"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Links"
@@ -539,18 +621,26 @@ msgstr "Links"
msgid "Start search"
msgstr "Iniciar busca"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Mostrar filtros de busca"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Ocultar filtros de busca"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "estatísticas"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/ro/LC_MESSAGES/messages.mo b/searx/translations/ro/LC_MESSAGES/messages.mo
index 25cbf25a8..41e282b4c 100644
--- a/searx/translations/ro/LC_MESSAGES/messages.mo
+++ b/searx/translations/ro/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ro/LC_MESSAGES/messages.po b/searx/translations/ro/LC_MESSAGES/messages.po
index 9abe0fb9f..950f59f96 100644
--- a/searx/translations/ro/LC_MESSAGES/messages.po
+++ b/searx/translations/ro/LC_MESSAGES/messages.po
@@ -8,89 +8,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Romanian (http://www.transifex.com/asciimoo/searx/language/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: ro\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "fișiere"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "general"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "muzică"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "rețele sociale"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "imagini"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "videouri"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "el(ea)"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "știri"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "hartă"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr ""
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutes} minut(e) în urmă"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} oră(e), {minutes} minut(e) în urmă"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Încărcarea paginilor (sec)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Numărul de rezultate"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Scoruri"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Scoruri per rezultat"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Erori"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Rescrie legăturile HTTP cu HTTPS dacă e posibil"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "Căutare în categoria selectată"
@@ -115,6 +144,32 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -201,8 +256,8 @@ msgstr "Metodă"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "CăutareSigură"
@@ -260,31 +315,30 @@ msgid "Red"
msgstr "Roșu"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Motoarele de căutare folosite curent"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Numele motorului"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Categorie"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -292,17 +346,16 @@ msgstr "Permite"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Blochează"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -310,8 +363,8 @@ msgid ""
msgstr "Aceste setări sunt stocate în cookie-urile d-voastră, aceasta ne permite să nu stocăm aceste date despre d-voastră."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -319,34 +372,34 @@ msgid ""
msgstr "Aceste cookie-uri servesc doar pentru confortul d-voastră, noi nu stocăm aceste cookie-uri pentru a vă urmări."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "salvează"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Resetează valorile implicite"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "înapoi"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "URL de căutare"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Descarcă rezultate"
@@ -357,19 +410,19 @@ msgstr "Răspunsuri"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Sugestii"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "pagina anterioară"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "pagina următoare"
@@ -405,13 +458,13 @@ msgstr "Leecher"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "legătură magnet"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "fișier torrent"
@@ -419,18 +472,37 @@ msgstr "fișier torrent"
msgid "Click on the magnifier to perform search"
msgstr "Apăsați pe lupă pentru a executa căutarea"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "stocat temporar"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Motorizat de"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "un meta-motor de căutare care respectă confidențialitatea"
@@ -448,17 +520,17 @@ msgid "General"
msgstr "General"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Motoare"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Module"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr ""
@@ -493,36 +565,46 @@ msgstr "Filtrează conținutul"
msgid "Change searx layout"
msgstr "Schimbă aspectul lui searx"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr ""
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr ""
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr ""
@@ -530,7 +612,7 @@ msgstr ""
msgid "Search results"
msgstr "Rezultatele căutării"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Legături"
@@ -539,18 +621,26 @@ msgstr "Legături"
msgid "Start search"
msgstr "Pornește căutarea"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Arată filtrele căutării"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Ascunde filtrele căutării"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "statistici"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/ru/LC_MESSAGES/messages.mo b/searx/translations/ru/LC_MESSAGES/messages.mo
index b3777d074..6e49e0855 100644
--- a/searx/translations/ru/LC_MESSAGES/messages.mo
+++ b/searx/translations/ru/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ru/LC_MESSAGES/messages.po b/searx/translations/ru/LC_MESSAGES/messages.po
index 2319625d5..4ef57cf33 100644
--- a/searx/translations/ru/LC_MESSAGES/messages.po
+++ b/searx/translations/ru/LC_MESSAGES/messages.po
@@ -5,108 +5,138 @@
# Translators:
# dimqua <dimqua@riseup.net>, 2015
# dimqua <dimqua@riseup.net>, 2015
+# Дмитрий Михирев <bizdelnick@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Russian (http://www.transifex.com/asciimoo/searx/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "файлы"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "общие"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "музыка"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "соцсети"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "картинки"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "видео"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "IT"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "новости"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "карты"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
-msgstr ""
+msgstr "наука"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutes} минут назад"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} час, {minutes} минут назад"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Время загрузки (сек)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Число результатов"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "Попаданий"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "Попаданий за результат"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Ошибок"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "По возможности заменять в ссылках HTTP на HTTPS"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
msgstr ""
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
-msgstr ""
+msgstr "Искать при выборе категории"
#: searx/plugins/search_on_category_select.py:19
msgid ""
"Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)"
-msgstr ""
+msgstr "Выполнять поиск сразу при выборе категории. Отключить выбор нескольких категорий. (Требуется JavaScript)"
#: searx/plugins/self_info.py:20
msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"."
-msgstr ""
+msgstr "Показывает IP-адрес при запросе \"ip\" и user-agent при запросе \"user agent\"."
#: searx/plugins/tracker_url_remover.py:26
msgid "Tracker URL remover"
@@ -116,6 +146,32 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -145,7 +201,7 @@ msgstr "Опции"
#: searx/templates/oscar/preferences.html:36
#: searx/templates/oscar/preferences.html:38
msgid "Default categories"
-msgstr "Категории по-умолчанию"
+msgstr "Категории по умолчанию"
#: searx/templates/courgette/preferences.html:13
#: searx/templates/default/preferences.html:14
@@ -172,7 +228,7 @@ msgstr "Язык интерфейса"
#: searx/templates/default/preferences.html:35
#: searx/templates/oscar/preferences.html:65
msgid "Autocomplete"
-msgstr "Авто-подсказки"
+msgstr "Автодополнение"
#: searx/templates/courgette/preferences.html:45
#: searx/templates/default/preferences.html:46
@@ -202,8 +258,8 @@ msgstr "Метод"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Безопасный поиск"
@@ -238,7 +294,7 @@ msgstr "Цвет"
#: searx/templates/courgette/preferences.html:86
msgid "Blue (default)"
-msgstr "Синий (по-умолчанию)"
+msgstr "Синий (по умолчанию)"
#: searx/templates/courgette/preferences.html:87
msgid "Violet"
@@ -261,31 +317,30 @@ msgid "Red"
msgstr "Красный"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Используемые поисковые движки"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Имя движка"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Категория"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -293,61 +348,60 @@ msgstr "Разрешить"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Блокировать"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
"data about you."
-msgstr "Настройки хранятся в ваших cookies-файлах, что позволяет нам не хранить эти сведения о Вас."
+msgstr "Настройки хранятся в ваших cookies-файлах, что позволяет нам не хранить эти сведения о вас."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
"track you."
-msgstr "Данные cookies применяются для вашего удобства, мы не используем их, чтобы отслеживать Вас."
+msgstr "Данные cookies применяются для вашего удобства, мы не используем их чтобы отслеживать вас."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "сохранить"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
-msgstr ""
+msgstr "Восстановить настройки по умолчанию"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "назад"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "Ссылка на поиск"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Загрузить результаты"
@@ -358,19 +412,19 @@ msgstr "Ответы"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Предложения"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "предыдущая стр."
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "следующая стр. "
@@ -406,13 +460,13 @@ msgstr "Личер"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "магнет-ссылка"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "торрент-файл"
@@ -420,18 +474,37 @@ msgstr "торрент-файл"
msgid "Click on the magnifier to perform search"
msgstr "Нажмите на лупу, чтобы выполнить поиск"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "в архиве"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Используется"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "свободный движок метапоиска, уважающий вашу приватность"
@@ -449,19 +522,19 @@ msgid "General"
msgstr "Общие"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Движки"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
-msgstr ""
+msgstr "Плагины"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
-msgstr ""
+msgstr "Cookies"
#: searx/templates/oscar/preferences.html:45
msgid "What language do you prefer for search?"
@@ -494,44 +567,54 @@ msgstr "Использовать ли фильтр контента"
msgid "Change searx layout"
msgstr "Изменить тему сайта"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
-msgid "Shortcut"
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
msgstr ""
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
-msgid "Avg. time"
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
msgstr ""
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
+msgid "Shortcut"
+msgstr "Ускоритель"
+
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
+msgid "Avg. time"
+msgstr "Среднее время"
+
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
-msgstr ""
+msgstr "Максимальное время"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
-msgstr ""
+msgstr "Это список cookies и их значений, которые searx хранит на вашем компьютере."
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
-msgstr ""
+msgstr "Имя cookie"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
-msgstr ""
+msgstr "Значение"
#: searx/templates/oscar/results.html:7
msgid "Search results"
msgstr "Результаты поиска"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Ссылки"
@@ -540,18 +623,26 @@ msgstr "Ссылки"
msgid "Start search"
msgstr "Начать поиск"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Показать фильтры поиска"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Скрыть фильтры поиска"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "статистика"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
@@ -578,11 +669,11 @@ msgstr "Пожалуйста включите JavaScript, чтобы испол
#: searx/templates/oscar/messages/no_cookies.html:3
msgid "Information!"
-msgstr ""
+msgstr "Информация!"
#: searx/templates/oscar/messages/no_cookies.html:4
msgid "currently, there are no cookies defined."
-msgstr ""
+msgstr "в данный момент cookies не установлены."
#: searx/templates/oscar/messages/no_data_available.html:4
msgid "There is currently no data available. "
@@ -596,7 +687,7 @@ msgstr "Сожалеем!"
msgid ""
"we didn't find any results. Please use another query or search in more "
"categories."
-msgstr "результатов не найдено. Попробуйте другой запрос или выберете больше категорий."
+msgstr "результатов не найдено. Попробуйте другой запрос или выберите больше категорий."
#: searx/templates/oscar/messages/save_settings_successfull.html:7
msgid "Well done!"
@@ -656,19 +747,19 @@ msgstr "Байт"
#: searx/templates/oscar/result_templates/torrent.html:10
msgid "kiB"
-msgstr "Кбайт"
+msgstr "КиБ"
#: searx/templates/oscar/result_templates/torrent.html:11
msgid "MiB"
-msgstr "Мбайт"
+msgstr "МиБ"
#: searx/templates/oscar/result_templates/torrent.html:12
msgid "GiB"
-msgstr "Гбайт"
+msgstr "ГиБ"
#: searx/templates/oscar/result_templates/torrent.html:13
msgid "TiB"
-msgstr "Тбайт"
+msgstr "ТиБ"
#: searx/templates/oscar/result_templates/torrent.html:15
msgid "Number of Files"
@@ -684,4 +775,4 @@ msgstr "скрыть видео"
#: searx/templates/pix-art/results.html:28
msgid "Load more..."
-msgstr ""
+msgstr "Загрузить ещё…"
diff --git a/searx/translations/tr/LC_MESSAGES/messages.mo b/searx/translations/tr/LC_MESSAGES/messages.mo
index 7b785fa9a..012e4c125 100644
--- a/searx/translations/tr/LC_MESSAGES/messages.mo
+++ b/searx/translations/tr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/tr/LC_MESSAGES/messages.po b/searx/translations/tr/LC_MESSAGES/messages.po
index eb9fe8fa4..cabb3f624 100644
--- a/searx/translations/tr/LC_MESSAGES/messages.po
+++ b/searx/translations/tr/LC_MESSAGES/messages.po
@@ -3,95 +3,124 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# Caner Başaran <basaran.caner@gmail.com>, 2014-2015
+# Caner Başaran <basaran.caner@gmail.com>, 2014-2016
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 15:06+0000\n"
-"Last-Translator: Thomas Pointhuber\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-04 16:41+0000\n"
+"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Turkish (http://www.transifex.com/asciimoo/searx/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "dosyalar"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
msgstr "genel"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "müzik"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "sosyal medya"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "görseller"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "videolar"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "bilişim"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "haberler"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "harita"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
-msgstr ""
+msgstr "bilim"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutes} dakika() önce"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} saat(), {minutes} dakika() önce"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "Yüklenen sayfa (sn)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "Sonuç sayısı"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "Hatalar"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Mümkünse HTTP bağlantıları HTTPS olarak düzelt"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr ""
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr ""
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "Bağlantıları yeni sekmede aç"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr ""
@@ -116,6 +145,32 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr ""
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr ""
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr ""
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -202,8 +257,8 @@ msgstr "Sorgu gönderim yöntemi"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "Güvenli Arama"
@@ -261,31 +316,30 @@ msgid "Red"
msgstr "Kırmızı"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "Şu anda kullanılan arama motorları"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "Motor adı"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "Türü"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -293,17 +347,16 @@ msgstr "İzin ver"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "Engelle"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
@@ -311,8 +364,8 @@ msgid ""
msgstr "Ayarlar çerezlerinizde saklanır. Verdiğiniz izinler, sizin hakkınızda veri saklamak için değildir."
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
@@ -320,34 +373,34 @@ msgid ""
msgstr "Bu çerezler size kolaylık sağlar. Sizi takip etmek için kullanılmaz."
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "kaydet"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "Varsayılanları sıfırla"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "geri"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "Arama Bağlantısı"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "Arama sonuçlarını indir"
@@ -358,19 +411,19 @@ msgstr ""
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "Öneriler"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "önceki sayfa"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "sonraki sayfa"
@@ -406,13 +459,13 @@ msgstr "Sömürenler"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "mıknatıs bağlantı"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "torrent dosyası"
@@ -420,18 +473,37 @@ msgstr "torrent dosyası"
msgid "Click on the magnifier to perform search"
msgstr "Arama yapmak için büyütece tıklayın"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr ""
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr ""
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr ""
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "önbellek"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr ""
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Gücümün kaynağı"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "kişisel gizliliğe saygılı ve merak edenlerin kurcalayabildiği bir meta arama motoru"
@@ -449,17 +521,17 @@ msgid "General"
msgstr "Genel"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "Motorlar"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Eklentiler"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr ""
@@ -494,36 +566,46 @@ msgstr "İçeriyi süz"
msgid "Change searx layout"
msgstr "searx yerleşim düzenini değiştir"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr ""
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr ""
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr ""
@@ -531,7 +613,7 @@ msgstr ""
msgid "Search results"
msgstr "Arama sonuçları"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "Bağlantılar"
@@ -540,18 +622,26 @@ msgstr "Bağlantılar"
msgid "Start search"
msgstr "Aramayı başlat"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "Arama süzgeçlerini göster"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "Arama süzgeçlerini gizle"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "istatistikler"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr ""
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr ""
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/translations/zh_CN/LC_MESSAGES/messages.mo b/searx/translations/zh_CN/LC_MESSAGES/messages.mo
index 0cd5edd96..3d80c8151 100644
--- a/searx/translations/zh_CN/LC_MESSAGES/messages.mo
+++ b/searx/translations/zh_CN/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/zh_CN/LC_MESSAGES/messages.po b/searx/translations/zh_CN/LC_MESSAGES/messages.po
index c7903563c..beda94e7e 100644
--- a/searx/translations/zh_CN/LC_MESSAGES/messages.po
+++ b/searx/translations/zh_CN/LC_MESSAGES/messages.po
@@ -9,89 +9,118 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2016-01-21 16:05+0100\n"
-"PO-Revision-Date: 2016-01-21 16:25+0000\n"
+"POT-Creation-Date: 2016-09-04 18:36+0200\n"
+"PO-Revision-Date: 2016-09-05 09:42+0000\n"
"Last-Translator: wenke\n"
"Language-Team: Chinese (China) (http://www.transifex.com/asciimoo/searx/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.2.0\n"
+"Generated-By: Babel 2.3.4\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: searx/webapp.py:114
+#: searx/webapp.py:115
msgid "files"
msgstr "文件"
-#: searx/webapp.py:115
+#: searx/webapp.py:116
msgid "general"
-msgstr "一般"
+msgstr "全部"
-#: searx/webapp.py:116
+#: searx/webapp.py:117
msgid "music"
msgstr "音乐"
-#: searx/webapp.py:117
+#: searx/webapp.py:118
msgid "social media"
msgstr "社交媒体"
-#: searx/webapp.py:118
+#: searx/webapp.py:119
msgid "images"
msgstr "图片"
-#: searx/webapp.py:119
+#: searx/webapp.py:120
msgid "videos"
msgstr "视频"
-#: searx/webapp.py:120
+#: searx/webapp.py:121
msgid "it"
msgstr "it"
-#: searx/webapp.py:121
+#: searx/webapp.py:122
msgid "news"
msgstr "新闻"
-#: searx/webapp.py:122
+#: searx/webapp.py:123
msgid "map"
msgstr "地图"
-#: searx/webapp.py:123
+#: searx/webapp.py:124
msgid "science"
msgstr "学术"
-#: searx/webapp.py:415
+#: searx/webapp.py:423
msgid "{minutes} minute(s) ago"
msgstr "{minutes}分钟之前"
-#: searx/webapp.py:417
+#: searx/webapp.py:425
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours}小时{minutes}分钟之前"
-#: searx/engines/__init__.py:185
+#: searx/engines/__init__.py:179
msgid "Page loads (sec)"
msgstr "页面加载 (秒)"
-#: searx/engines/__init__.py:189
+#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88
msgid "Number of results"
msgstr "结果数"
-#: searx/engines/__init__.py:193
+#: searx/engines/__init__.py:187
msgid "Scores"
msgstr "得分"
-#: searx/engines/__init__.py:197
+#: searx/engines/__init__.py:191
msgid "Scores per result"
msgstr "每个结果等分"
-#: searx/engines/__init__.py:201
+#: searx/engines/__init__.py:195
msgid "Errors"
msgstr "错误"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI改写"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr ""
+
#: searx/plugins/https_rewrite.py:29
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "如果可能的话重定向HTTP链接到HTTPS"
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "无限滚动"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "滚动到当前页面底部时自动加载下一页"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:122
+msgid "Open result links on new browser tabs"
+msgstr "在新标签页打开搜索链接"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "搜索结果默认在原窗口打开。这个插件使其在新标签页/窗口打开。(需要启用JavaScript )"
+
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
msgstr "搜索类别选择"
@@ -100,13 +129,13 @@ msgstr "搜索类别选择"
msgid ""
"Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)"
-msgstr "如果选中一个类别立即搜索。禁用选择多个类别功能。(JavaScript 启用)"
+msgstr "选中一个类别立即搜索。禁用可以选择多个类别搜索。(JavaScript 启用)"
#: searx/plugins/self_info.py:20
msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"."
-msgstr "搜索“ip”显示你的ip和搜索内容包括“user agent”显示你的user agent。"
+msgstr "搜索“ip”显示你的ip以及搜索内容含有“user agent”显示你的user agent。"
#: searx/plugins/tracker_url_remover.py:26
msgid "Tracker URL remover"
@@ -116,6 +145,32 @@ msgstr "移除跟踪链接"
msgid "Remove trackers arguments from the returned URL"
msgstr "从返回的链接中移除跟踪参数"
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "类vim快捷键"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "使用类vim快捷键浏览搜索结果(JavaScript启用)。按“h”键获取帮助。"
+
+#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+msgid "Page not found"
+msgstr "未找到网页"
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "返回%(search_page)s。"
+
+#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+msgid "search page"
+msgstr "搜索页面"
+
#: searx/templates/courgette/index.html:9
#: searx/templates/courgette/index.html:13
#: searx/templates/courgette/results.html:5
@@ -202,8 +257,8 @@ msgstr "方法"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/default/preferences.html:64
#: searx/templates/oscar/preferences.html:94
-#: searx/templates/oscar/preferences.html:144
-#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/oscar/preferences.html:166
msgid "SafeSearch"
msgstr "安全搜索"
@@ -261,31 +316,30 @@ msgid "Red"
msgstr "红色"
#: searx/templates/courgette/preferences.html:96
-#: searx/templates/default/preferences.html:84
+#: searx/templates/default/preferences.html:93
#: searx/templates/pix-art/preferences.html:49
msgid "Currently used search engines"
msgstr "目前使用的搜索引擎"
#: searx/templates/courgette/preferences.html:100
-#: searx/templates/default/preferences.html:88
-#: searx/templates/oscar/preferences.html:142
-#: searx/templates/oscar/preferences.html:152
+#: searx/templates/default/preferences.html:97
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/oscar/preferences.html:168
#: searx/templates/pix-art/preferences.html:53
msgid "Engine name"
msgstr "搜索引擎名称"
#: searx/templates/courgette/preferences.html:101
-#: searx/templates/default/preferences.html:89
+#: searx/templates/default/preferences.html:98
msgid "Category"
msgstr "类别"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:113
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:101
-#: searx/templates/oscar/macros.html:71
-#: searx/templates/oscar/preferences.html:141
-#: searx/templates/oscar/preferences.html:153
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:110
+#: searx/templates/oscar/preferences.html:157
+#: searx/templates/oscar/preferences.html:169
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
msgid "Allow"
@@ -293,61 +347,60 @@ msgstr "允许"
#: searx/templates/courgette/preferences.html:102
#: searx/templates/courgette/preferences.html:114
-#: searx/templates/default/preferences.html:90
-#: searx/templates/default/preferences.html:102
-#: searx/templates/oscar/macros.html:70
+#: searx/templates/default/preferences.html:99
+#: searx/templates/default/preferences.html:111
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:65
msgid "Block"
msgstr "阻止"
#: searx/templates/courgette/preferences.html:122
-#: searx/templates/default/preferences.html:110
-#: searx/templates/oscar/preferences.html:235
+#: searx/templates/default/preferences.html:119
+#: searx/templates/oscar/preferences.html:257
#: searx/templates/pix-art/preferences.html:73
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
"data about you."
-msgstr "这些设置保存你的cookie,这代表我们不能储存你的数据。"
+msgstr "这些设置保存在你的cookie,我们不能保存你的数据。"
#: searx/templates/courgette/preferences.html:124
-#: searx/templates/default/preferences.html:112
-#: searx/templates/oscar/preferences.html:237
+#: searx/templates/default/preferences.html:121
+#: searx/templates/oscar/preferences.html:259
#: searx/templates/pix-art/preferences.html:75
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
"track you."
-msgstr "这些cookie是为了让你更加方便,我们不会使用这些cookie跟踪你。"
+msgstr "这些cookie是为了让你更加方便,我们不会使用这些cookie追踪你。"
#: searx/templates/courgette/preferences.html:127
-#: searx/templates/default/preferences.html:115
-#: searx/templates/oscar/preferences.html:240
+#: searx/templates/default/preferences.html:124
+#: searx/templates/oscar/preferences.html:262
#: searx/templates/pix-art/preferences.html:78
msgid "save"
msgstr "保存"
#: searx/templates/courgette/preferences.html:128
-#: searx/templates/default/preferences.html:116
-#: searx/templates/oscar/preferences.html:242
+#: searx/templates/default/preferences.html:125
+#: searx/templates/oscar/preferences.html:264
msgid "Reset defaults"
msgstr "恢复默认"
#: searx/templates/courgette/preferences.html:129
-#: searx/templates/default/preferences.html:117
-#: searx/templates/oscar/preferences.html:241
+#: searx/templates/default/preferences.html:126
+#: searx/templates/oscar/preferences.html:263
#: searx/templates/pix-art/preferences.html:79
msgid "back"
msgstr "返回"
#: searx/templates/courgette/results.html:12
#: searx/templates/default/results.html:13
-#: searx/templates/oscar/results.html:110
+#: searx/templates/oscar/results.html:124
msgid "Search URL"
msgstr "搜索链接"
#: searx/templates/courgette/results.html:16
#: searx/templates/default/results.html:17
-#: searx/templates/oscar/results.html:115
+#: searx/templates/oscar/results.html:129
msgid "Download results"
msgstr "下载结果"
@@ -358,19 +411,19 @@ msgstr "回答"
#: searx/templates/courgette/results.html:42
#: searx/templates/default/results.html:43
-#: searx/templates/oscar/results.html:90
+#: searx/templates/oscar/results.html:104
msgid "Suggestions"
msgstr "搜索建议"
#: searx/templates/courgette/results.html:70
#: searx/templates/default/results.html:81
-#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63
+#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66
msgid "previous page"
msgstr "上一页"
#: searx/templates/courgette/results.html:81
#: searx/templates/default/results.html:92
-#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71
+#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75
msgid "next page"
msgstr "下一页"
@@ -406,13 +459,13 @@ msgstr "Leecher"
#: searx/templates/courgette/result_templates/torrent.html:9
#: searx/templates/default/result_templates/torrent.html:9
-#: searx/templates/oscar/macros.html:21
+#: searx/templates/oscar/macros.html:24
msgid "magnet link"
msgstr "磁力链接"
#: searx/templates/courgette/result_templates/torrent.html:10
#: searx/templates/default/result_templates/torrent.html:10
-#: searx/templates/oscar/macros.html:22
+#: searx/templates/oscar/macros.html:25
msgid "torrent file"
msgstr "种子文件"
@@ -420,18 +473,37 @@ msgstr "种子文件"
msgid "Click on the magnifier to perform search"
msgstr "点击放大镜执行搜索"
+#: searx/templates/default/preferences.html:84
+#: searx/templates/oscar/preferences.html:121
+msgid "Results on new tabs"
+msgstr "在新标签页打开搜索结果"
+
+#: searx/templates/default/preferences.html:87
+#: searx/templates/oscar/preferences.html:125
+msgid "On"
+msgstr "开"
+
+#: searx/templates/default/preferences.html:88
+#: searx/templates/oscar/preferences.html:126
+msgid "Off"
+msgstr "关"
+
#: searx/templates/default/result_templates/code.html:3
#: searx/templates/default/result_templates/default.html:3
#: searx/templates/default/result_templates/map.html:9
-#: searx/templates/oscar/macros.html:20
+#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46
msgid "cached"
msgstr "缓存"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "高级设置"
+
+#: searx/templates/oscar/base.html:82
msgid "Powered by"
msgstr "Powered by"
-#: searx/templates/oscar/base.html:78
+#: searx/templates/oscar/base.html:82
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "一个尊重隐私,可再开发的元搜索引擎"
@@ -449,17 +521,17 @@ msgid "General"
msgstr "常规"
#: searx/templates/oscar/preferences.html:18
-#: searx/templates/oscar/preferences.html:126
+#: searx/templates/oscar/preferences.html:142
msgid "Engines"
msgstr "搜索引擎"
#: searx/templates/oscar/preferences.html:19
-#: searx/templates/oscar/preferences.html:187
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "插件"
#: searx/templates/oscar/preferences.html:20
-#: searx/templates/oscar/preferences.html:210
+#: searx/templates/oscar/preferences.html:232
msgid "Cookies"
msgstr "Cookie"
@@ -484,7 +556,7 @@ msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
-msgstr "更改请求方法,<a href=\"http://zh.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">了解更多请求方法相关</a>"
+msgstr "更改请求方法,<a href=\"http://zh.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">深入了解请求方法</a>"
#: searx/templates/oscar/preferences.html:95
msgid "Filter content"
@@ -494,36 +566,46 @@ msgstr "过滤内容"
msgid "Change searx layout"
msgstr "改变searx布局"
-#: searx/templates/oscar/preferences.html:143
-#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Choose style for this theme"
+msgstr "选择这个主题的样式"
+
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/oscar/preferences.html:119
+msgid "Style"
+msgstr "样式"
+
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/oscar/preferences.html:167
msgid "Shortcut"
msgstr "快捷键"
-#: searx/templates/oscar/preferences.html:145
-#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:165
msgid "Avg. time"
msgstr "平均时间"
-#: searx/templates/oscar/preferences.html:146
-#: searx/templates/oscar/preferences.html:148
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:164
msgid "Max time"
msgstr "最大时间"
-#: searx/templates/oscar/preferences.html:213
+#: searx/templates/oscar/preferences.html:235
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
-msgstr "这是searx保存在你的电脑上的cookie列表。"
+msgstr "这里展示了searx保存在你的电脑上的cookie。"
-#: searx/templates/oscar/preferences.html:214
+#: searx/templates/oscar/preferences.html:236
msgid "With that list, you can assess searx transparency."
-msgstr "有了这个列表,你可以评价searx透明度。"
+msgstr "有了这个列表,你可以评估searx透明度。"
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:241
msgid "Cookie name"
msgstr "cookie名称"
-#: searx/templates/oscar/preferences.html:220
+#: searx/templates/oscar/preferences.html:242
msgid "Value"
msgstr "值"
@@ -531,7 +613,7 @@ msgstr "值"
msgid "Search results"
msgstr "搜索结果"
-#: searx/templates/oscar/results.html:105
+#: searx/templates/oscar/results.html:119
msgid "Links"
msgstr "链接"
@@ -540,18 +622,26 @@ msgstr "链接"
msgid "Start search"
msgstr "开始搜索"
-#: searx/templates/oscar/search_full.html:15
-msgid "Show search filters"
-msgstr "显示搜索过滤器"
-
-#: searx/templates/oscar/search_full.html:15
-msgid "Hide search filters"
-msgstr "隐藏搜索过滤器"
-
#: searx/templates/oscar/stats.html:2
msgid "stats"
msgstr "统计"
+#: searx/templates/oscar/time-range.html:3
+msgid "Anytime"
+msgstr "时间不限"
+
+#: searx/templates/oscar/time-range.html:6
+msgid "Last day"
+msgstr "过去一天内"
+
+#: searx/templates/oscar/time-range.html:9
+msgid "Last week"
+msgstr "过去一周内"
+
+#: searx/templates/oscar/time-range.html:12
+msgid "Last month"
+msgstr "过去一个月内"
+
#: searx/templates/oscar/messages/first_time.html:4
#: searx/templates/oscar/messages/no_results.html:5
#: searx/templates/oscar/messages/save_settings_successfull.html:5
diff --git a/searx/utils.py b/searx/utils.py
index aa8ce92a1..faa634853 100644
--- a/searx/utils.py
+++ b/searx/utils.py
@@ -6,9 +6,13 @@ import re
from babel.dates import format_date
from codecs import getincrementalencoder
from HTMLParser import HTMLParser
+from imp import load_source
+from os.path import splitext, join
from random import choice
+import sys
from searx.version import VERSION_STRING
+from searx.languages import language_codes
from searx import settings
from searx import logger
@@ -237,3 +241,60 @@ def list_get(a_list, index, default=None):
return a_list[index]
else:
return default
+
+
+def get_torrent_size(filesize, filesize_multiplier):
+ try:
+ filesize = float(filesize)
+
+ if filesize_multiplier == 'TB':
+ filesize = int(filesize * 1024 * 1024 * 1024 * 1024)
+ elif filesize_multiplier == 'GB':
+ filesize = int(filesize * 1024 * 1024 * 1024)
+ elif filesize_multiplier == 'MB':
+ filesize = int(filesize * 1024 * 1024)
+ elif filesize_multiplier == 'KB':
+ filesize = int(filesize * 1024)
+ elif filesize_multiplier == 'TiB':
+ filesize = int(filesize * 1000 * 1000 * 1000 * 1000)
+ elif filesize_multiplier == 'GiB':
+ filesize = int(filesize * 1000 * 1000 * 1000)
+ elif filesize_multiplier == 'MiB':
+ filesize = int(filesize * 1000 * 1000)
+ elif filesize_multiplier == 'KiB':
+ filesize = int(filesize * 1000)
+ except:
+ filesize = None
+
+ return filesize
+
+
+def convert_str_to_int(number_str):
+ if number_str.isdigit():
+ return int(number_str)
+ else:
+ return 0
+
+
+def is_valid_lang(lang):
+ is_abbr = (len(lang) == 2)
+ if is_abbr:
+ for l in language_codes:
+ if l[0][:2] == lang.lower():
+ return (True, l[0][:2], l[1].lower())
+ return False
+ else:
+ for l in language_codes:
+ if l[1].lower() == lang.lower():
+ return (True, l[0][:2], l[1].lower())
+ return False
+
+
+def load_module(filename, module_dir):
+ modname = splitext(filename)[0]
+ if modname in sys.modules:
+ del sys.modules[modname]
+ filepath = join(module_dir, filename)
+ module = load_source(modname, filepath)
+ module.name = modname
+ return module
diff --git a/searx/version.py b/searx/version.py
index 7f254df90..e32307b65 100644
--- a/searx/version.py
+++ b/searx/version.py
@@ -18,7 +18,7 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
# version of searx
VERSION_MAJOR = 0
-VERSION_MINOR = 9
+VERSION_MINOR = 10
VERSION_BUILD = 0
VERSION_STRING = "{0}.{1}.{2}".format(VERSION_MAJOR,
diff --git a/searx/webapp.py b/searx/webapp.py
index 460681b35..096e1f269 100644
--- a/searx/webapp.py
+++ b/searx/webapp.py
@@ -22,10 +22,11 @@ if __name__ == '__main__':
from os.path import realpath, dirname
path.append(realpath(dirname(realpath(__file__)) + '/../'))
-import json
import cStringIO
-import os
import hashlib
+import hmac
+import json
+import os
import requests
from searx import logger
@@ -39,7 +40,7 @@ except:
logger.critical("cannot import dependency: pygments")
from sys import exit
exit(1)
-
+from cgi import escape
from datetime import datetime, timedelta
from urllib import urlencode
from urlparse import urlparse, urljoin
@@ -50,7 +51,7 @@ from flask import (
)
from flask_babel import Babel, gettext, format_date, format_decimal
from flask.json import jsonify
-from searx import settings, searx_dir
+from searx import settings, searx_dir, searx_debug
from searx.engines import (
categories, engines, get_engines_stats, engine_shortcuts
)
@@ -61,11 +62,12 @@ from searx.utils import (
)
from searx.version import VERSION_STRING
from searx.languages import language_codes
-from searx.search import Search
-from searx.query import Query
+from searx.search import SearchWithPlugins, get_search_query_from_webapp
+from searx.query import RawTextQuery
from searx.autocomplete import searx_bang, backends as autocomplete_backends
from searx.plugins import plugins
from searx.preferences import Preferences, ValidationException
+from searx.answerers import answerers
# check if the pyopenssl, ndg-httpsclient, pyasn1 packages are installed.
# They are needed for SSL connection without trouble, see #298
@@ -77,6 +79,9 @@ except ImportError:
logger.critical("The pyopenssl, ndg-httpsclient, pyasn1 packages have to be installed.\n"
"Some HTTPS connections will fail")
+# serve pages with HTTP/1.1
+from werkzeug.serving import WSGIRequestHandler
+WSGIRequestHandler.protocol_version = "HTTP/1.1"
static_path, templates_path, themes =\
get_themes(settings['ui']['themes_path']
@@ -242,6 +247,24 @@ def url_for_theme(endpoint, override_theme=None, **values):
return url_for(endpoint, **values)
+def proxify(url):
+ if url.startswith('//'):
+ url = 'https:' + url
+
+ if not settings.get('result_proxy'):
+ return url
+
+ url_params = dict(mortyurl=url.encode('utf-8'))
+
+ if settings['result_proxy'].get('key'):
+ url_params['mortyhash'] = hmac.new(settings['result_proxy']['key'],
+ url.encode('utf-8'),
+ hashlib.sha256).hexdigest()
+
+ return '{0}?{1}'.format(settings['result_proxy']['url'],
+ urlencode(url_params))
+
+
def image_proxify(url):
if url.startswith('//'):
@@ -250,8 +273,10 @@ def image_proxify(url):
if not request.preferences.get_value('image_proxy'):
return url
- hash_string = url + settings['server']['secret_key']
- h = hashlib.sha256(hash_string.encode('utf-8')).hexdigest()
+ if settings.get('result_proxy'):
+ return proxify(url)
+
+ h = hmac.new(settings['server']['secret_key'], url.encode('utf-8'), hashlib.sha256).hexdigest()
return '{0}?{1}'.format(url_for('image_proxy'),
urlencode(dict(url=url.encode('utf-8'), h=h)))
@@ -310,6 +335,8 @@ def render(template_name, override_theme=None, **kwargs):
kwargs['image_proxify'] = image_proxify
+ kwargs['proxify'] = proxify if settings.get('result_proxy') else None
+
kwargs['get_result_template'] = get_result_template
kwargs['theme'] = get_current_theme_name(override=override_theme)
@@ -318,8 +345,12 @@ def render(template_name, override_theme=None, **kwargs):
kwargs['cookies'] = request.cookies
+ kwargs['errors'] = request.errors
+
kwargs['instance_name'] = settings['general']['instance_name']
+ kwargs['results_on_new_tab'] = request.preferences.get_value('results_on_new_tab')
+
kwargs['scripts'] = set()
for plugin in request.user_plugins:
for script in plugin.js_dependencies:
@@ -336,16 +367,23 @@ def render(template_name, override_theme=None, **kwargs):
@app.before_request
def pre_request():
- # merge GET, POST vars
+ request.errors = []
+
preferences = Preferences(themes, categories.keys(), engines, plugins)
- preferences.parse_cookies(request.cookies)
request.preferences = preferences
+ try:
+ preferences.parse_cookies(request.cookies)
+ except:
+ request.errors.append(gettext('Invalid settings, please edit your preferences'))
+ # merge GET, POST vars
+ # request.form
request.form = dict(request.form.items())
for k, v in request.args.items():
if k not in request.form:
request.form[k] = v
+ # request.user_plugins
request.user_plugins = []
allowed_plugins = preferences.plugins.get_enabled()
disabled_plugins = preferences.plugins.get_disabled()
@@ -363,37 +401,42 @@ def index():
Supported outputs: html, json, csv, rss.
"""
- if not request.args and not request.form:
+ if request.form.get('q') is None:
return render(
'index.html',
)
+ # search
+ search_query = None
+ result_container = None
try:
- search = Search(request)
+ search_query = get_search_query_from_webapp(request.preferences, request.form)
+ # search = Search(search_query) # without plugins
+ search = SearchWithPlugins(search_query, request)
+ result_container = search.search()
except:
+ request.errors.append(gettext('search error'))
+ logger.exception('search error')
return render(
'index.html',
)
- if plugins.call('pre_search', request, locals()):
- search.search(request)
-
- plugins.call('post_search', request, locals())
+ results = result_container.get_ordered_results()
- results = search.result_container.get_ordered_results()
+ # UI
+ advanced_search = request.form.get('advanced_search', None)
+ output_format = request.form.get('format', 'html')
+ if output_format not in ['html', 'csv', 'json', 'rss']:
+ output_format = 'html'
+ # output
for result in results:
-
- plugins.call('on_result', request, locals())
- if not search.paging and engines[result['engine']].paging:
- search.paging = True
-
- if search.request_data.get('format', 'html') == 'html':
- if 'content' in result:
- result['content'] = highlight_content(result['content'],
- search.query.encode('utf-8')) # noqa
- result['title'] = highlight_content(result['title'],
- search.query.encode('utf-8'))
+ if output_format == 'html':
+ if 'content' in result and result['content']:
+ result['content'] = highlight_content(escape(result['content'][:1024]),
+ search_query.query.encode('utf-8'))
+ result['title'] = highlight_content(escape(result['title'] or u''),
+ search_query.query.encode('utf-8'))
else:
if result.get('content'):
result['content'] = html_to_text(result['content']).strip()
@@ -420,16 +463,19 @@ def index():
else:
result['publishedDate'] = format_date(result['publishedDate'])
- number_of_results = search.result_container.results_number()
- if number_of_results < search.result_container.results_length():
+ number_of_results = result_container.results_number()
+ if number_of_results < result_container.results_length():
number_of_results = 0
- if search.request_data.get('format') == 'json':
- return Response(json.dumps({'query': search.query,
+ if output_format == 'json':
+ return Response(json.dumps({'query': search_query.query,
'number_of_results': number_of_results,
- 'results': results}),
+ 'results': results,
+ 'answers': list(result_container.answers),
+ 'infoboxes': result_container.infoboxes,
+ 'suggestions': list(result_container.suggestions)}),
mimetype='application/json')
- elif search.request_data.get('format') == 'csv':
+ elif output_format == 'csv':
csv = UnicodeWriter(cStringIO.StringIO())
keys = ('title', 'url', 'content', 'host', 'engine', 'score')
csv.writerow(keys)
@@ -438,14 +484,14 @@ def index():
csv.writerow([row.get(key, '') for key in keys])
csv.stream.seek(0)
response = Response(csv.stream.read(), mimetype='application/csv')
- cont_disp = 'attachment;Filename=searx_-_{0}.csv'.format(search.query.encode('utf-8'))
+ cont_disp = 'attachment;Filename=searx_-_{0}.csv'.format(search_query.query.encode('utf-8'))
response.headers.add('Content-Disposition', cont_disp)
return response
- elif search.request_data.get('format') == 'rss':
+ elif output_format == 'rss':
response_rss = render(
'opensearch_response_rss.xml',
results=results,
- q=search.request_data['q'],
+ q=request.form['q'],
number_of_results=number_of_results,
base_url=get_base_url()
)
@@ -454,17 +500,17 @@ def index():
return render(
'results.html',
results=results,
- q=search.request_data['q'],
- selected_categories=search.categories,
- paging=search.paging,
+ q=request.form['q'],
+ selected_categories=search_query.categories,
+ pageno=search_query.pageno,
+ time_range=search_query.time_range,
number_of_results=format_decimal(number_of_results),
- pageno=search.pageno,
- advanced_search=search.is_advanced,
- time_range=search.time_range,
+ advanced_search=advanced_search,
+ suggestions=result_container.suggestions,
+ answers=result_container.answers,
+ infoboxes=result_container.infoboxes,
+ paging=result_container.paging,
base_url=get_base_url(),
- suggestions=search.result_container.suggestions,
- answers=search.result_container.answers,
- infoboxes=search.result_container.infoboxes,
theme=get_current_theme_name(),
favicons=global_favicons[themes.index(get_current_theme_name())]
)
@@ -481,30 +527,23 @@ def about():
@app.route('/autocompleter', methods=['GET', 'POST'])
def autocompleter():
"""Return autocompleter results"""
- request_data = {}
-
- # select request method
- if request.method == 'POST':
- request_data = request.form
- else:
- request_data = request.args
# set blocked engines
disabled_engines = request.preferences.engines.get_disabled()
# parse query
- query = Query(request_data.get('q', '').encode('utf-8'), disabled_engines)
- query.parse_query()
+ raw_text_query = RawTextQuery(request.form.get('q', '').encode('utf-8'), disabled_engines)
+ raw_text_query.parse_query()
# check if search query is set
- if not query.getSearchQuery():
+ if not raw_text_query.getSearchQuery():
return '', 400
# run autocompleter
completer = autocomplete_backends.get(request.preferences.get_value('autocomplete'))
# parse searx specific autocompleter results like !bang
- raw_results = searx_bang(query)
+ raw_results = searx_bang(raw_text_query)
# normal autocompletion results only appear if max 3 inner results returned
if len(raw_results) <= 3 and completer:
@@ -515,19 +554,19 @@ def autocompleter():
else:
language = language.split('_')[0]
# run autocompletion
- raw_results.extend(completer(query.getSearchQuery(), language))
+ raw_results.extend(completer(raw_text_query.getSearchQuery(), language))
# parse results (write :language and !engine back to result string)
results = []
for result in raw_results:
- query.changeSearchQuery(result)
+ raw_text_query.changeSearchQuery(result)
# add parsed result
- results.append(query.getFullQuery())
+ results.append(raw_text_query.getFullQuery())
# return autocompleter results
- if request_data.get('format') == 'x-suggestions':
- return Response(json.dumps([query.query, results]),
+ if request.form.get('format') == 'x-suggestions':
+ return Response(json.dumps([raw_text_query.query, results]),
mimetype='application/json')
return Response(json.dumps(results),
@@ -544,7 +583,7 @@ def preferences():
try:
request.preferences.parse_form(request.form)
except ValidationException:
- # TODO use flash feature of flask
+ request.errors.append(gettext('Invalid settings, please edit your preferences'))
return resp
return request.preferences.save(resp)
@@ -565,6 +604,8 @@ def preferences():
if e.timeout > settings['outgoing']['request_timeout']:
stats[e.name]['warn_timeout'] = True
+ # get first element [0], the engine time,
+ # and then the second element [1] : the time (the first one is the label)
for engine_stat in get_engines_stats()[0][1]:
stats[engine_stat.get('name')]['time'] = round(engine_stat.get('avg'), 3)
if engine_stat.get('avg') > settings['outgoing']['request_timeout']:
@@ -579,6 +620,7 @@ def preferences():
language_codes=language_codes,
engines_by_category=categories,
stats=stats,
+ answerers=[{'info': a.self_info(), 'keywords': a.keywords} for a in answerers],
disabled_engines=disabled_engines,
autocomplete_backends=autocomplete_backends,
shortcuts={y: x for x, y in engine_shortcuts.items()},
@@ -595,7 +637,7 @@ def image_proxy():
if not url:
return '', 400
- h = hashlib.sha256(url + settings['server']['secret_key'].encode('utf-8')).hexdigest()
+ h = hmac.new(settings['server']['secret_key'], url, hashlib.sha256).hexdigest()
if h != request.args.get('h'):
return '', 400
@@ -653,6 +695,7 @@ Allow: /
Allow: /about
Disallow: /stats
Disallow: /preferences
+Disallow: /*?*q=*
""", mimetype='text/plain')
@@ -712,15 +755,22 @@ def config():
'default_locale': settings['ui']['default_locale'],
'autocomplete': settings['search']['autocomplete'],
'safe_search': settings['search']['safe_search'],
- 'default_theme': settings['ui']['default_theme']})
+ 'default_theme': settings['ui']['default_theme'],
+ 'version': VERSION_STRING})
+
+
+@app.errorhandler(404)
+def page_not_found(e):
+ return render('404.html'), 404
def run():
app.run(
- debug=settings['general']['debug'],
- use_debugger=settings['general']['debug'],
+ debug=searx_debug,
+ use_debugger=searx_debug,
port=settings['server']['port'],
- host=settings['server']['bind_address']
+ host=settings['server']['bind_address'],
+ threaded=True
)
diff --git a/tests/robot/test_basic.robot b/tests/robot/test_basic.robot
index 4a20d0ba2..a466a095c 100644
--- a/tests/robot/test_basic.robot
+++ b/tests/robot/test_basic.robot
@@ -4,14 +4,27 @@ Test Setup Open Browser http://localhost:11111/
Test Teardown Close All Browsers
+*** Keywords ***
+Submit Preferences
+ Set Selenium Speed 2 seconds
+ Submit Form id=search_form
+ Location Should Be http://localhost:11111/
+ Set Selenium Speed 0 seconds
+
+
*** Test Cases ***
Front page
Page Should Contain about
Page Should Contain preferences
+404 page
+ Go To http://localhost:11111/no-such-page
+ Page Should Contain Page not found
+ Page Should Contain Go to search page
+
About page
Click Element link=about
- Page Should Contain Why use Searx?
+ Page Should Contain Why use searx?
Page Should Contain Element link=search engines
Preferences page
@@ -19,8 +32,8 @@ Preferences page
Page Should Contain Preferences
Page Should Contain Default categories
Page Should Contain Currently used search engines
- Page Should Contain dummy_dummy
- Page Should Contain general_dummy
+ Page Should Contain dummy dummy
+ Page Should Contain general dummy
Switch category
Go To http://localhost:11111/preferences
@@ -28,8 +41,7 @@ Switch category
Page Should Contain Checkbox category_dummy
Click Element xpath=//*[.="general"]
Click Element xpath=//*[.="dummy"]
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Checkbox Should Not Be Selected category_general
Checkbox Should Be Selected category_dummy
@@ -38,8 +50,7 @@ Change language
Page Should Contain preferences
Go To http://localhost:11111/preferences
Select From List locale hu
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Page Should Contain rólunk
Page Should Contain beállítások
@@ -48,13 +59,11 @@ Change method
Page Should Contain preferences
Go To http://localhost:11111/preferences
Select From List method GET
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be method GET
Select From List method POST
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be method POST
@@ -62,10 +71,9 @@ Change theme
Page Should Contain about
Page Should Contain preferences
Go To http://localhost:11111/preferences
- List Selection Should Be theme default
+ List Selection Should Be theme legacy
Select From List theme oscar
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be theme oscar
@@ -75,8 +83,7 @@ Change safesearch
Go To http://localhost:11111/preferences
List Selection Should Be safesearch None
Select From List safesearch Strict
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be safesearch Strict
@@ -86,8 +93,7 @@ Change image proxy
Go To http://localhost:11111/preferences
List Selection Should Be image_proxy Disabled
Select From List image_proxy Enabled
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be image_proxy Enabled
@@ -97,8 +103,7 @@ Change search language
Go To http://localhost:11111/preferences
List Selection Should Be language Automatic
Select From List language Turkish (Turkey) - tr_TR
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be language Turkish (Turkey) - tr_TR
@@ -108,8 +113,7 @@ Change autocomplete
Go To http://localhost:11111/preferences
List Selection Should Be autocomplete -
Select From List autocomplete google
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be autocomplete google
@@ -121,8 +125,7 @@ Change allowed/disabled engines
Element Should Contain xpath=//label[@class="deny"][@for='engine_dummy_dummy_dummy'] Block
Element Should Contain xpath=//label[@class="deny"][@for='engine_general_general_dummy'] Block
Click Element xpath=//label[@class="deny"][@for='engine_general_general_dummy']
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Page Should Contain about
Page Should Contain preferences
Go To http://localhost:11111/preferences
@@ -134,18 +137,16 @@ Block a plugin
Page Should Contain about
Page Should Contain preferences
Go To http://localhost:11111/preferences
- List Selection Should Be theme default
+ List Selection Should Be theme legacy
Select From List theme oscar
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
List Selection Should Be theme oscar
Page Should Contain Plugins
Click Link Plugins
Checkbox Should Not Be Selected id=plugin_HTTPS_rewrite
Click Element xpath=//label[@for='plugin_HTTPS_rewrite']
- Submit Form id=search_form
- Location Should Be http://localhost:11111/
+ Submit Preferences
Go To http://localhost:11111/preferences
Page Should Contain Plugins
Click Link Plugins
diff --git a/tests/unit/engines/seedpeer_fixture.html b/tests/unit/engines/seedpeer_fixture.html
new file mode 100644
index 000000000..28207bfad
--- /dev/null
+++ b/tests/unit/engines/seedpeer_fixture.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ </head>
+ <body>
+ <div id="header">
+ <div id="whoIsYou">
+ <a href="/lang.php"><small>SeedPeer in your own language?</small></a>&nbsp;&nbsp;&nbsp;<a href="http://www.seedpeer.eu"><img src="/images/flags/uk.gif" width="16px" alt="Torrents EN" /></a> <a href="http://spanish.seedpeer.eu"><img src="/images/flags/es.gif" width="16px" alt="Torrents ES" /></a> <a href="http://german.seedpeer.eu"><img src="/images/flags/de.gif" width="16px" alt="Torrents DE" /></a> <a href="http://french.seedpeer.eu"><img src="/images/flags/fr.gif" width="16px" alt="Torrents FR" /></a> <a href="http://portuguese.seedpeer.eu"><img src="/images/flags/pt.gif" width="16px" alt="Torrents Portuguese" /></a> <a href="http://swedish.seedpeer.eu"><img src="/images/flags/se.gif" width="16px" alt="Torrents Sweden" /></a>
+ </div>
+
+ <script type="text/javascript">
+ whoIsYou();
+ </script>
+ <div id="search">
+ <form action="/search.php" method="get">
+ <input id="topsearchbar" name="search" value="narcos season 2" />
+ <input type="submit" class="searchbutton" value="Torrents" />
+ <input style="color:#000" type="submit" class="searchbutton" name="usenet" value="Usenet Binaries" />
+ </form>
+ <div id="suggestion"></div>
+ </div>
+ <div id="logo"><a href="/"><img src="/images/logo2.gif" alt="Seedpeer homepage" width="415" height="143" /></a></div>
+ <div id="subtext"><a href="/">Home</a> &gt; <a href="/search.html">Torrent search</a> &gt; Narcos season 2 | page 1</div>
+ </div>
+ <div id="nav">
+ <ul>
+ <!--
+ <li><font style="color:red;font-size:9px;font-weight:bold;">NEW</font><a title="Download TOP Games for FREE" rel="nofollow" href="http://www.bigrebelads.com/affiliate/index?ref=9301" target="_blank">FREE Games</a></li>
+
+ -->
+ <li style="border-left:none" id="categories"><a title="Browse Torrent Categories" href="/browse.html">Categories</a>
+ <ul>
+ <li><a title="Browse Anime Torrents" href="/browse.html#6">Anime</a></li>
+ <li><a title="Browse Game Torrents" href="/browse.html#4">Games</a></li>
+ <li><a title="Browse Movie Torrents" href="/browse.html#1">Movies</a></li>
+ <li><a title="Browse Music Torrents" href="/browse.html#3">Music</a></li>
+ <li><a title="Browse Software Torrents" href="/browse.html#5">Software</a></li>
+ <li><a title="Browse TV Torrents" href="/browse.html#2">TV Shows</a></li>
+ <li><a title="Browse Other Torrents" href="/browse.html#7">Others</a></li>
+ </ul>
+ </li>
+ <li><a title="Upload A Torrents" href="/upload.html">Upload torrent</a></li>
+ <li id="verified"><a title="Verified Torrents" href="/verified.html">Verified</a></li>
+ <li id="searchoptions"><a title="Search Torrents" href="/search.html">Torrent search</a></li>
+ <li id="newsgroups"><a style="color:#212b3e" title="News Groups" href="/usenet.html">Usenet Binaries</a></li>
+ <li id="about" style="border-right:none"><a rel="nofollow" href="/faq.html">About Us</a>
+ <ul>
+ <li><a title="SeedPeer Statistics" href="/stats.html">Statistics</a></li>
+ <li><a title="Contact Us" href="/contact.html">Contact</a></li>
+ <li><a title="Frequently Asked Questions" href="/faq.html">FAQ</a></li>
+ <li><a title="SeedPeer API" href="http://api.seedpeer.eu">Our API</a></li>
+ <li><a title="SeedPeer Blog" href="/blog">Blog</a></li>
+ </ul>
+ </li>
+ <!--<li><a href="/toolbar.php">Our Toolbar</a></li>-->
+ </ul>
+ <div class="clear"></div>
+ </div>
+ <div id="body"><div id="pageTop"></div>
+ <div id="headerbox"><h1>Verified <font class="colored">Narcos season 2</font> torrents</h1></div><table width="100%"><tr><th>
+ <span style="float:right">
+ <a href="/search/narcos-season-2/8/1.html"><img style="vertical-align:middle" src="/images/comments.gif" alt="comments" /></a> |
+ <a href="/search/narcos-season-2/7/1.html"><img style="vertical-align:middle" src="/images/ver.gif" alt="verified" /></a>
+ </span>
+ <a href="/search/narcos-season-2/1/1.html">Torrent name</a></th><th class="right"><a href="/search/narcos-season-2/2/1.html">Age</a></th><th class="right"><a href="/search/narcos-season-2/3/1.html">Size</a></th><th class="right"><a href="/search/narcos-season-2/4/1.html">Seeds</a></th><th class="right"><a href="/search/narcos-season-2/5/1.html">Peers</a></th><th class="center"><a href="/search/narcos-season-2/6/1.html">Health</a></th><td class="tableAd" rowspan="6"><iframe src="http://creative.wwwpromoter.com/13689?d=300x250" width="300" height="250" style="border: none;" frameborder="0" scrolling="no"></iframe></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_1" href="" data-tad="431726" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> Full Version</a></td><td class="right">20 hours</td><td class="right">681.3 MB</td><td class="right"><font color="green">28</font> </td><td class="right"><font color="navy">654</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class="tdark"><td><a class="pblink" id="pblink_table_item_2" href="" data-tad="431727" data-url="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> Trusted Source</a></td><td class="right">12 hours</td><td class="right">787.1 MB</td><td class="right"><font color="green">64</font> </td><td class="right"><font color="navy">220</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_3" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Full Narcos season 2 Download</strong></a> <small><a class="pblink" id="pblink_table_item_4" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Usenet</a></small></td><td class="right">24 hours</td><td class="right">775.5 MB</td><td class="right"><font color="green">60</font> </td><td class="right"><font color="navy">236</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class="tdark"><td><a class="pblink" id="pblink_table_item_5" href="" data-tad="431730" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> 2014 - DIRECT STREAMING</a> <small><a class="pblink" id="pblink_table_item_6" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Movies</a></small></td><td class="right">17 hours</td><td class="right">654.1 MB</td><td class="right"><font color="green">2</font> </td><td class="right"><font color="navy">391</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_7" href="" data-tad="431731" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> 2014</a> <small><a class="pblink" id="pblink_table_item_8" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Movies</a></small></td><td class="right">20 hours</td><td class="right">754.5 MB</td><td class="right"><font color="green">21</font> </td><td class="right"><font color="navy">919</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr></table><br /><br /><center><iframe src='http://creative.wwwpromoter.com/13689?d=728x90' width='728' height='90' style='border: none;' frameborder='0' scrolling='no'></iframe><center><span style="float:right;margin:1em .2em 0 0"><a title="Download at the speed of your connection" href="/usenet.php?search=narcos+season+2"><img src="/images/dlf.gif" alt="Search Binaries" /></a></span><div style="margin-bottom:1em;margin-right:290px" id="headerbox"><h1><a href="/searchfeed/narcos+season+2.xml" target="_blank" title="SeedPeer RSS Torrent Search Feed fornarcos season 2"><img src="/images/feedIcon.png" border="0" /></a>&nbsp;2 <font class="colored">Narcos season 2</font> Torrents were found</h1></div><table width="100%"><tr><th>
+ <span style="float:right">
+ <a href="/search/narcos-season-2/8/1.html"><img style="vertical-align:middle" src="/images/comments.gif" alt="comments" /></a> |
+ <a href="/search/narcos-season-2/7/1.html"><img style="vertical-align:middle" src="/images/ver.gif" alt="verified" /></a>
+ </span>
+ <a href="/search/narcos-season-2/1/1.html">Torrent name</a></th><th class="right"><a href="/search/narcos-season-2/2/1.html">Age</a></th><th class="right"><a href="/search/narcos-season-2/3/1.html">Size</a></th><th class="right"><a href="/search/narcos-season-2/4/1.html">Seeds</a></th><th class="right"><a href="/search/narcos-season-2/5/1.html">Peers</a></th><th class="center"><a href="/search/narcos-season-2/6/1.html">Health</a></th></tr><tr class=""><td><small class="comments"><a href="http://www.facebook.com/sharer.php?t=Download%20<strong class='colored'>Narcos</strong> <strong class='colored'>Season</strong> <strong class='colored'>2</strong> Complete 7<strong class='colored'>2</strong>0p WebRip EN-SUB x<strong class='colored'>2</strong>64-[MULVAcoded] S0<strong class='colored'>2</strong>%20 torrent&u=http://seedpeer.seedpeer.eu/details/11686840/Narcos-Season-2-Complete-720p-WebRip-EN-SUB-x264-[MULVAcoded]-S02.html"><img src="/images/facebook.png" alt="Add to Facebook" width="14" height="14" /></a></small><a href="/details/11686840/Narcos-Season-2-Complete-720p-WebRip-EN-SUB-x264-[MULVAcoded]-S02.html"><strong class='colored'>Narcos</strong> <strong class='colored'>Season</strong> <strong class='colored'>2</strong> Complete 7<strong class='colored'>2</strong>0p WebRip EN-SUB x<strong class='colored'>2</strong>64-[MULVAcoded] S0<strong class='colored'>2</strong> <small><a href="/browse.html#11686840"></a></small></a></td><td class="right">19 hours</td><td class="right">4.39 GB</td><td class="right"><font color="green">715</font> </td><td class="right"><font color="navy">183</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" width="40" height="11" /></td></tr><tr class="tdark"><td><small class="comments"><a href="http://www.facebook.com/sharer.php?t=Download%20<strong class='colored'>Narcos</strong> - <strong class='colored'>Season</strong> <strong class='colored'>2</strong> - 7<strong class='colored'>2</strong>0p WEBRiP - x<strong class='colored'>2</strong>65 HEVC - ShAaNiG%20 torrent&u=http://seedpeer.seedpeer.eu/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html"><img src="/images/facebook.png" alt="Add to Facebook" width="14" height="14" /></a></small><a href="/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html"><strong class='colored'>Narcos</strong> - <strong class='colored'>Season</strong> <strong class='colored'>2</strong> - 7<strong class='colored'>2</strong>0p WEBRiP - x<strong class='colored'>2</strong>65 HEVC - ShAaNiG <small><a href="/browse.html#11685972"></a></small></a></td><td class="right">1 day</td><td class="right">2.48 GB</td><td class="right"><font color="green">861</font> </td><td class="right"><font color="navy">332</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" width="40" height="11" /></td></tr></table><div id="headerbox"><h1>Related searches for: <font class="colored">Narcos season 2</font></h1></div><div id="search_suggestions"><br />Other suggested searches: </div><br /><a href="http://torrentz2.eu/search?f=narcos-season-2">Search for "narcos-season-2" on Torrentz2.eu</a><br /><a href="http://torrent-finder.info/show.php?q=narcos-season-2">Search for "narcos-season-2" on Torrent-Finder</a><br /><center><iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe>&nbsp;<iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe>&nbsp;<iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe></center><div id="footer">
+ <table width="100%">
+ <tr>
+ <td width="30%">
+ <h2>Torrents Download</h2>
+ <a href="/">Torrent search</a><br />
+ <a href="/browse.html">Browse categories</a><br />
+ <a href="/verified.html">Verified Torrents</a><br />
+ <a href="/order-date.html">Today's torrents</a><br />
+ <a href="/yesterday.html">Yesterday's torrents</a><br />
+ <a href="/stats.html">Statistics</a><br />
+ <br />
+ <a href="/faq.html#copyright"><strong>Copyright & Removal</strong></a>
+ </td>
+ <td width="30%"><h2>Cool Stuff</h2>
+ <a href="/promotional.php">Promotional</a><br />
+ <a href="/contact.html">Advertising Information</a><br />
+ <strong><a href="/plugins.php" title="Add a search plugin to Firefox or Internet Explorer">Search Plugin <span style="color:red">*</span></a></strong><br />
+ <a href="http://www.utorrent.com">&micro;Torrent Client</a><br />
+ <a href="/blog">Seedpeer Blog</a><br />
+ </td>
+ <td width="30%"><h2>Links</h2>
+ <a href="http://www.sumotorrent.com" target="_blank"><strong>SumoTorrent</strong></a><br />
+ <a href="http://www.torrent-finder.info" target="_blank"><strong>Torrent Finder</strong></a><br />
+ <a href="http://www.torrentpond.com" target="_blank"><strong>TorrentPond</strong></a><br />
+ <a href="https://www.limetorrents.cc" target="_blank">LimeTorrents.cc</a><br />
+ <a href="http://www.torrents.to/" target="_blank">Torrents.to</a><br />
+ <a href="http://www.torrentfunk.com" target="_blank">TorrentFunk</a><br />
+ <a href="https://monova.org" target="_blank">Monova</a><br />
+ <a href="http://www.torrentroom.com" target="_blank">TorrentRoom</a><br />
+ <a href="http://www.katcr.co/" target="_blank">Kickass Torrents Community</a><br />
+ </td>
+ <td width="10%"><div id="bottomlogo"></div></td>
+ </tr>
+ </table>
+ <br />
+ <br />
+ </div>
+ </div>
+ </body>
+ </html> \ No newline at end of file
diff --git a/tests/unit/engines/test_bing.py b/tests/unit/engines/test_bing.py
index bce221440..886584229 100644
--- a/tests/unit/engines/test_bing.py
+++ b/tests/unit/engines/test_bing.py
@@ -14,14 +14,12 @@ class TestBingEngine(SearxTestCase):
params = bing.request(query, dicto)
self.assertTrue('url' in params)
self.assertTrue(query in params['url'])
+ self.assertTrue('language%3AFR' in params['url'])
self.assertTrue('bing.com' in params['url'])
- self.assertTrue('SRCHHPGUSR' in params['cookies'])
- self.assertTrue('fr' in params['cookies']['SRCHHPGUSR'])
dicto['language'] = 'all'
params = bing.request(query, dicto)
- self.assertTrue('SRCHHPGUSR' in params['cookies'])
- self.assertTrue('en' in params['cookies']['SRCHHPGUSR'])
+ self.assertTrue('language' not in params['url'])
def test_response(self):
self.assertRaises(AttributeError, bing.response, None)
diff --git a/tests/unit/engines/test_bing_images.py b/tests/unit/engines/test_bing_images.py
index 9d8ec18af..cc256f51e 100644
--- a/tests/unit/engines/test_bing_images.py
+++ b/tests/unit/engines/test_bing_images.py
@@ -13,6 +13,7 @@ class TestBingImagesEngine(SearxTestCase):
dicto['pageno'] = 1
dicto['language'] = 'fr_FR'
dicto['safesearch'] = 1
+ dicto['time_range'] = ''
params = bing_images.request(query, dicto)
self.assertTrue('url' in params)
self.assertTrue(query in params['url'])
diff --git a/tests/unit/engines/test_bing_news.py b/tests/unit/engines/test_bing_news.py
index a64d59b7b..b6793f7be 100644
--- a/tests/unit/engines/test_bing_news.py
+++ b/tests/unit/engines/test_bing_news.py
@@ -12,6 +12,7 @@ class TestBingNewsEngine(SearxTestCase):
dicto = defaultdict(dict)
dicto['pageno'] = 1
dicto['language'] = 'fr_FR'
+ dicto['time_range'] = ''
params = bing_news.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
@@ -22,6 +23,13 @@ class TestBingNewsEngine(SearxTestCase):
params = bing_news.request(query, dicto)
self.assertIn('en', params['url'])
+ def test_no_url_in_request_year_time_range(self):
+ dicto = defaultdict(dict)
+ query = 'test_query'
+ dicto['time_range'] = 'year'
+ params = bing_news.request(query, dicto)
+ self.assertEqual({}, params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, bing_news.response, None)
self.assertRaises(AttributeError, bing_news.response, [])
diff --git a/tests/unit/engines/test_deezer.py b/tests/unit/engines/test_deezer.py
index cfef852af..5b9f55c33 100644
--- a/tests/unit/engines/test_deezer.py
+++ b/tests/unit/engines/test_deezer.py
@@ -42,7 +42,7 @@ class TestDeezerEngine(SearxTestCase):
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['title'], 'Title of track')
self.assertEqual(results[0]['url'], 'https://www.deezer.com/track/1094042')
- self.assertEqual(results[0]['content'], 'Artist Name &bull; Album Title &bull; Title of track')
+ self.assertEqual(results[0]['content'], 'Artist Name - Album Title - Title of track')
self.assertTrue('100' in results[0]['embedded'])
json = r"""
diff --git a/tests/unit/engines/test_deviantart.py b/tests/unit/engines/test_deviantart.py
index 75c59f760..bd2cf182f 100644
--- a/tests/unit/engines/test_deviantart.py
+++ b/tests/unit/engines/test_deviantart.py
@@ -7,8 +7,8 @@ from searx.testing import SearxTestCase
class TestDeviantartEngine(SearxTestCase):
def test_request(self):
- query = 'test_query'
dicto = defaultdict(dict)
+ query = 'test_query'
dicto['pageno'] = 0
dicto['time_range'] = ''
params = deviantart.request(query, dicto)
@@ -16,6 +16,13 @@ class TestDeviantartEngine(SearxTestCase):
self.assertTrue(query in params['url'])
self.assertTrue('deviantart.com' in params['url'])
+ def test_no_url_in_request_year_time_range(self):
+ dicto = defaultdict(dict)
+ query = 'test_query'
+ dicto['time_range'] = 'year'
+ params = deviantart.request(query, dicto)
+ self.assertEqual({}, params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, deviantart.response, None)
self.assertRaises(AttributeError, deviantart.response, [])
diff --git a/tests/unit/engines/test_digbt.py b/tests/unit/engines/test_digbt.py
new file mode 100644
index 000000000..31a1b03a4
--- /dev/null
+++ b/tests/unit/engines/test_digbt.py
@@ -0,0 +1,61 @@
+from collections import defaultdict
+import mock
+from searx.engines import digbt
+from searx.testing import SearxTestCase
+
+
+class TestDigBTEngine(SearxTestCase):
+
+ def test_request(self):
+ query = 'test_query'
+ dicto = defaultdict(dict)
+ dicto['pageno'] = 0
+ params = digbt.request(query, dicto)
+ self.assertIn('url', params)
+ self.assertIn(query, params['url'])
+ self.assertIn('digbt.org', params['url'])
+
+ def test_response(self):
+ self.assertRaises(AttributeError, digbt.response, None)
+ self.assertRaises(AttributeError, digbt.response, [])
+ self.assertRaises(AttributeError, digbt.response, '')
+ self.assertRaises(AttributeError, digbt.response, '[]')
+
+ response = mock.Mock(content='<html></html>')
+ self.assertEqual(digbt.response(response), [])
+
+ html = """
+ <table class="table">
+ <tr><td class="x-item">
+ <div>
+ <a title="The Big Bang Theory" class="title" href="/The-Big-Bang-Theory-d2.html">
+ The Big <span class="highlight">Bang</span> Theory
+ </a>
+ <span class="ctime"><span style="color:red;">4 hours ago</span></span>
+ </div>
+ <div class="files">
+ <ul>
+ <li>The Big Bang Theory 2.9 GB</li>
+ <li>....</li>
+ </ul>
+ </div>
+ <div class="tail">
+ Files: 1 Size: 2.9 GB Downloads: 1 Updated: <span style="color:red;">4 hours ago</span>
+ &nbsp; &nbsp;
+ <a class="title" href="magnet:?xt=urn:btih:a&amp;dn=The+Big+Bang+Theory">
+ <span class="glyphicon glyphicon-magnet"></span> magnet-link
+ </a>
+ &nbsp; &nbsp;
+ </div>
+ </td></tr>
+ </table>
+ """
+ response = mock.Mock(content=html)
+ results = digbt.response(response)
+ self.assertEqual(type(results), list)
+ self.assertEqual(len(results), 1)
+ self.assertEqual(results[0]['title'], 'The Big Bang Theory')
+ self.assertEqual(results[0]['url'], 'https://digbt.org/The-Big-Bang-Theory-d2.html')
+ self.assertEqual(results[0]['content'], 'The Big Bang Theory 2.9 GB ....')
+ self.assertEqual(results[0]['filesize'], 3113851289)
+ self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:a&dn=The+Big+Bang+Theory')
diff --git a/tests/unit/engines/test_duckduckgo.py b/tests/unit/engines/test_duckduckgo.py
index cb866d396..734f2c39e 100644
--- a/tests/unit/engines/test_duckduckgo.py
+++ b/tests/unit/engines/test_duckduckgo.py
@@ -19,6 +19,13 @@ class TestDuckduckgoEngine(SearxTestCase):
self.assertIn('duckduckgo.com', params['url'])
self.assertIn('ch-de', params['url'])
+ def test_no_url_in_request_year_time_range(self):
+ dicto = defaultdict(dict)
+ query = 'test_query'
+ dicto['time_range'] = 'year'
+ params = duckduckgo.request(query, dicto)
+ self.assertEqual({}, params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, duckduckgo.response, None)
self.assertRaises(AttributeError, duckduckgo.response, [])
diff --git a/tests/unit/engines/test_flickr.py b/tests/unit/engines/test_flickr.py
index 2d7472a92..be97647ce 100644
--- a/tests/unit/engines/test_flickr.py
+++ b/tests/unit/engines/test_flickr.py
@@ -52,7 +52,7 @@ class TestFlickrEngine(SearxTestCase):
self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054')
self.assertTrue('o.jpg' in results[0]['img_src'])
self.assertTrue('n.jpg' in results[0]['thumbnail_src'])
- self.assertTrue('Owner' in results[0]['content'])
+ self.assertTrue('Owner' in results[0]['author'])
self.assertTrue('Description' in results[0]['content'])
json = r"""
@@ -76,7 +76,7 @@ class TestFlickrEngine(SearxTestCase):
self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054')
self.assertTrue('z.jpg' in results[0]['img_src'])
self.assertTrue('z.jpg' in results[0]['thumbnail_src'])
- self.assertTrue('Owner' in results[0]['content'])
+ self.assertTrue('Owner' in results[0]['author'])
self.assertTrue('Description' in results[0]['content'])
json = r"""
@@ -100,7 +100,7 @@ class TestFlickrEngine(SearxTestCase):
self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054')
self.assertTrue('o.jpg' in results[0]['img_src'])
self.assertTrue('o.jpg' in results[0]['thumbnail_src'])
- self.assertTrue('Owner' in results[0]['content'])
+ self.assertTrue('Owner' in results[0]['author'])
self.assertTrue('Description' in results[0]['content'])
json = r"""
diff --git a/tests/unit/engines/test_flickr_noapi.py b/tests/unit/engines/test_flickr_noapi.py
index 42f38f90b..5f8b069e3 100644
--- a/tests/unit/engines/test_flickr_noapi.py
+++ b/tests/unit/engines/test_flickr_noapi.py
@@ -15,6 +15,7 @@ class TestFlickrNoapiEngine(SearxTestCase):
query = 'test_query'
dicto = defaultdict(dict)
dicto['pageno'] = 1
+ dicto['time_range'] = ''
params = flickr_noapi.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
@@ -144,7 +145,7 @@ class TestFlickrNoapiEngine(SearxTestCase):
self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434')
self.assertIn('k.jpg', results[0]['img_src'])
self.assertIn('n.jpg', results[0]['thumbnail_src'])
- self.assertIn('Owner', results[0]['content'])
+ self.assertIn('Owner', results[0]['author'])
# no n size, only the z size
json = """
@@ -187,7 +188,7 @@ class TestFlickrNoapiEngine(SearxTestCase):
self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434')
self.assertIn('z.jpg', results[0]['img_src'])
self.assertIn('z.jpg', results[0]['thumbnail_src'])
- self.assertIn('Owner', results[0]['content'])
+ self.assertIn('Owner', results[0]['author'])
# no z or n size
json = """
@@ -230,7 +231,7 @@ class TestFlickrNoapiEngine(SearxTestCase):
self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434')
self.assertIn('o.jpg', results[0]['img_src'])
self.assertIn('o.jpg', results[0]['thumbnail_src'])
- self.assertIn('Owner', results[0]['content'])
+ self.assertIn('Owner', results[0]['author'])
# no image test
json = """
diff --git a/tests/unit/engines/test_google_news.py b/tests/unit/engines/test_google_news.py
index 31d674121..6454dde47 100644
--- a/tests/unit/engines/test_google_news.py
+++ b/tests/unit/engines/test_google_news.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
from collections import defaultdict
import mock
from searx.engines import google_news
@@ -11,16 +13,16 @@ class TestGoogleNewsEngine(SearxTestCase):
dicto = defaultdict(dict)
dicto['pageno'] = 1
dicto['language'] = 'fr_FR'
+ dicto['time_range'] = 'w'
params = google_news.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
- self.assertIn('googleapis.com', params['url'])
self.assertIn('fr', params['url'])
dicto['language'] = 'all'
params = google_news.request(query, dicto)
self.assertIn('url', params)
- self.assertIn('en', params['url'])
+ self.assertNotIn('fr', params['url'])
def test_response(self):
self.assertRaises(AttributeError, google_news.response, None)
@@ -34,103 +36,15 @@ class TestGoogleNewsEngine(SearxTestCase):
response = mock.Mock(text='{"data": []}')
self.assertEqual(google_news.response(response), [])
- json = """
- {
- "responseData": {
- "results": [
- {
- "GsearchResultClass": "GnewsSearch",
- "clusterUrl": "http://news.google.com/news/story?ncl=d2d3t1LMDpNIj2MPPhdTT0ycN4sWM&hl=fr&ned=fr",
- "content": "This is the content",
- "unescapedUrl": "http://this.is.the.url",
- "url": "http://this.is.the.url",
- "title": "This is the title",
- "titleNoFormatting": "This is the title",
- "location": "",
- "publisher": "Jeux Actu",
- "publishedDate": "Fri, 30 Jan 2015 11:00:25 -0800",
- "signedRedirectUrl": "http://news.google.com/",
- "language": "fr",
- "image": {
- "url": "http://i.jeuxactus.com/datas/jeux/d/y/dying-light/vu/dying-light-54cc080b568fb.jpg",
- "tbUrl": "http://t1.gstatic.com/images?q=tbn:ANd9GcSF4yYrs9Ycw23DGiOSAZ-5SEPXYwG3LNs",
- "originalContextUrl": "http://www.jeuxactu.com/test-dying-light-sur-ps4-97208.htm",
- "publisher": "Jeux Actu",
- "tbWidth": 80,
- "tbHeight": 30
- },
- "relatedStories": [
- {
- "unescapedUrl": "http://www.jeuxvideo.com/test/415823/dying-light.htm",
- "url": "http%3A%2F%2Fwww.jeuxvideo.com%2Ftest%2F415823%2Fdying-light.htm",
- "title": "<b>Test</b> du jeu Dying Light - jeuxvideo.com",
- "titleNoFormatting": "Test du jeu Dying Light - jeuxvideo.com",
- "location": "",
- "publisher": "JeuxVideo.com",
- "publishedDate": "Fri, 30 Jan 2015 08:52:30 -0800",
- "signedRedirectUrl": "http://news.google.com/news/url?sa=T&",
- "language": "fr"
- }
- ]
- }
- ]
- },
- "responseDetails": null,
- "responseStatus": 200
- }
- """
- response = mock.Mock(text=json)
+ html = u"""
+<div class="g">
+<div class="ts _V6c _Zmc _XO _knc _d7c"><a class="top _vQb _mnc" href="http://this.is.the.url" onmousedown="return rwt(this,'','','','5','AFQjCNGixEtJGC3qTB9pYFLXlRj8XXwdiA','','0ahUKEwiG7O_M5-rQAhWDtRoKHd0RD5QQvIgBCCwwBA','','',event)"><img class="th _lub" id="news-thumbnail-image-52779299683347" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAGQAZAMBIgACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAFBgADBAIBB//EADsQAAIBAwIEAwUGBAUFAAAAAAECAwAEEQUhBhIxURNBYRQiMnGBFSORobHBB1Ji4UKS0fDxFiQzNYL/xAAYAQEBAQEBAAAAAAAAAAAAAAACAwEEAP/EACERAAMBAAICAgMBAAAAAAAAAAABAhEhMQMSE2EEQVEi/9oADAMBAAIRAxEAPwDSkKr8JFWIzwnMTlSepFdiBgMiuxEdid6B7QbrEr8qE4L4wGNCIT7u/WifE0eIosHBz0oWnugCjQ4BfEipJHbpK/JG0gDP/KO9XT6Lw7BGDHrofIBIJQ4NXalAs8IDJnFLepS21pmOOFXl679FoY66ZTcNwWxtGzaaqwOf8JFcXupSSr4cupSOp6gnGaDQahJESQwU/wBIxXbX0l0jl+VgduYjJrfj/ofc9MluueV1z3xV2jlX1AlDkY61TY3MAk5LuJSnm4G4+nnTFb2ltEweFRvuCO1ebw8uTYNnQ9iDTtDKJYY8DflFJgXLp8xT5FbJHBGx/lFFM9a4MrQFjnFSilvPGiYaItv1zUrTnwHljgLViqwUDyNFEskKlmIDCs08JMWHfl32INZ8hnIscWII4oWPmdqCg9KLccsUtLZM596g6HmVT6Um9WlvGeXk/gWruCObGFz3pb0/R59Y1D2WDYk5lmfpGP3PpW7iK4aIxY3CqWA7t5UxcG3SQWxsZI2VI0MxM6hedj1Oeo9Kc5M6PPagQ3DdjpcpWeHx2U7s+9LuvPCsr+yoETIwAOgpq1DV59RmuJIpbS2hhOG5zvmlLVXE4OCpcnBKdDRW7ptZgMEuCCPrTJwteGYS2z78vvpnt5j/AH3pWIxRbhZ+XV4h5Orj8s/tTtcE5fI6xKWmjVepYfrX0trQrbxLICDyDavm0EvgXEU2M8jhsfI033fHiyxxSfZkwj+EtjP6VzpPR0E8ICQR0qUuT8Y2DSExxtj69alVwOINy3Esye7zKfnXdpZzzMjSfAO1KGm8UX99qNvbm1SNZZApYnoPOimr6rf2crBLmQoTsFIwo8htUHDRk+N0Zv4nQi2itMHALUAiP3SH0oxJrUtyqJcKk4GDiZeb9a0LqkOADY2nz8FaSeLCkxgsWUVrecWQRXwDQW8DzMpGckdNvPr0orxZfpa2if8AYywPIfDkY4YDYHbHbcVgucf9YWd3CqR+MxUgDC5C7bDy2FecRzXQsxJd3lmJN8wCPCvgkZBBOc1Vr2kccaA7PkuBOm6qzD3+XZh1/UflWG+isoGAgMjPzb8x2Jz2r37Sm8AouynqKFyOQxkk8unqa9KYKawolI529CRRLhr/ANxb46AOT/lNBgSTTPwTL7PqMlwpHOkXKuR3IzTvonPY2WqCa6hiPR3VT9TTfx3pzaRb2IskUJICpBPUgUvDXphjLR5HQ8oq6bii9uOUXExmC/CJBzY/GoTWFXOiKV1BZpvEjJYyEkgbb1Kdvt19j9zk9fuk/wBKlL5foz0Zk0vTWa0N/hyVYqiKcZ26/jSvdX81pqET+0PJCX8Nw3l6H5b19H0pccPWpxu2WO/9R3pQ4s0yzi1K4gcFGuW8WN+b3STny8t6xr9lU+MRe2AQVPukZGKq9qTxzCGJcLzbHIqm2uILSCO2uiyvF7pdh1HUNjtQO0uootbLSmQ25kIfwyOYrnyztmvT/oL4C91M3NHIh96GRZB9D+/T61xxNf6XqbBrC2LSbkhVyfypk1Cew1SP7F0exNjbW8LXeovKwMx5VJCs3/0vToT6EUhcHTqOIEfConIyLy+QNX9MWElYOmkYHDKVx5EYrFIrSNk7imriCFrm7kt+TM8R5ie696y6Do41G5naUlLa2TnkxjJ7L9TR3BOdeCzgbg82fntRvR1mtbpGYe5IvUdiP7isrWDSTuIwFIyewA+tbraC7js4J7WVpYz92VUZMTdeUr28wenX1rXyg+rTC7TkHrXonPeiGk6TFeWeNQuWsLot7kkihoXHrj3l+e4oZJbSxzTxY5mgcrJyHmAx57eXrXOVc1Pawt8dq8rPv5VKww+jWUgbhGymTO8QIPod6y8cadHfaQsgws8GWUjrjO4/erXxa8M2cETZCW6bEdNq513UlsbSO6mh9oRXXmh5+UPkk4Jx54NdUrQ08Qj2cQ1ezMDkpexA7k/EBQ+C3ubOVXliICts3l1rXqEr3+qPeWASK7n55vZ7bHhxDGeQf1coJP4dc13Y8SMiPDeRBiRjp19DUaiofBs3NLkKahcwcNaLJaQMtzquspz3jhuYRRE5EYPc9W/4oDDYGyvLO4upLdB4YzFFJmRQq5HMvcj9qtvI7SPXpGguxqFvFysZSvKHON167gdM1a/EUb6fLYz2FvI01yJZrphmVlyCVHYfLue9dTWyRisotfVpLm8D272suB0mURtjtkV3p2qwWF5P7VbmETAK6ZyrD0odrtq+nTiy1PT47Oc4mWWPBflYbA4OMenWsdnd3FusqxOkyMpVkYdR9a5nLXBer2tQyxRWcjznT5CpfDBMbtjoPl6VlN+sCLNbwMZjIysoAGPQj8OtBre5dJeaPKN5ods0aGoW2o2rQ3i/eHYSpsw+dTc4dng/L9J9WjSsK3Og3V/JeQWvhL4cUcr5Zj5j0JGw9aG6Jpst3NDFLcmzNzA8ts2ATIyZ265Xz/vtWbVbOzgQCW4eJ4oT4I8MkSHyUYHmepJAHY0PWGSbT11CFFSGKQwM6EhmYjOTv2OM7darCyeDl/J8r8nk1sIwXDSRK7jDHrnY586lNuh6Pouu6Xb3ZvE06ZV8KaFCFUuvVgD0zsa8oNE9CmpA/YtoRkhrdPptWPidZ5dGuIraETSye6V64jQB3IH82QD8gcb1gvuIDJp9vaW8JVkRYyZN8kDyArBbXx1XXLO2vb2SKI8yyGBSFRSu+MZJzhc/6V1QsYLeo1R3Oh3dnby6RYvDcWcQE1wUVRM3KASQCd/n39aUkhN7rltFJ1muI0OP6mA/ejeqX1jYaxLpOmzmfT4IQgmOMu5PMzbAdwPpS+l37Pq8NzGvM0Myui9yrAgfpXrfIZ6CkmjXWpa9qcPD9s3hQvIyoGGBGrcvmfP96OcI8YaTpelw2mp6MJkR2cThVkEj9dww28umdsVm0HSotb1O6tbK5v8ATp1R2dmcOo94Aqccp8/yoHxBbrpt39lLMswtCweRVwGdt2/ABR9KbWAX2aNX1231DiCXVru3M5kkLmGR/cIxhV+QAH4UHvbqC5lMsFvFa7Y5Yc4P4k0X1vS7XS9E0znwb+6BmkXkX3E8t8ZzuOpxsawXEa6Td3MKrHLJ4JhdiPgYgc2PUbrn51Nz/WPfoxpOcY8QEjbB3q2KUswzjbzWt+t3Ftcw2Hh28cKwRLCzqP8AydMtjA32rnUtG9jiS4srhJ7OT4JUYZ+TDqDQpCVFpmW/g9llYArvGxHwmrNX0v2HQdKkjcxx3HOZk5jhnGMk9+woRFKUO/Uedbprye8tGiZs28Eikcx+FmBG3ocfkKKWcG1zyPv8PLi2Xh3wpbOSQxTuodFHvA4PbuTUpG07XtW0qA29lMYoy3MVx5kD07AVKxzyZphmvZnWViR/KMeQrvQ4lutQm8bJ8G0lmUZ/xKuRn61KldDACoHYzu7MSx6sepo9pFtE/vMMloyT9cj8sV7UoPsS6G7+HX3Wm6jdLvM0ioWPYLn9SaQFka91NHuTzme4Bkz58zb/AK17Uq1dImg5rcrXPGcUU2GSIxqq+QGA36ml+bMkaXEjM0kw8R89yd6lSpiCfCcEV7fXdpcxq8TWUjjujAggr2NXcJ3k08F9pcpDWslpJNyEfA6gEFe29SpQZqAgbmAY9TvXAY5YZOCRUqV79ifRthucRhXgglxsGkTmIHbNSpUrAn//2Q==" alt="A(z) south témájának képe a következőből: CBC.ca" data-deferred="1" onload="google.aft&amp;&amp;google.aft(this)"></a><div class="_cnc"><h3 class="r _U6c"><a class="l _HId" href="http://this.is.the.url" onmousedown="return rwt(this,'','','','5','AFQjCNGixEtJGC3qTB9pYFLXlRj8XXwdiA','','0ahUKEwiG7O_M5-rQAhWDtRoKHd0RD5QQqQIILSgAMAQ','','',event)">Meet Thuli Madonsela — <em>South</em> Africa's conscience</a></h3><div class="slp"><span class="_tQb _IId">CBC.ca</span><span class="_v5">-</span><span class="f nsa _uQb">9 órával ezelőtt</span></div><div class="st"><em>South</em> African Public Protector</div></div><div class="_Xmc card-section"><a class="_sQb" href="http://www.news24.com/Columnists/Mpumelelo_Mkhabela/who-really-governs-south-africa-20161209" onmousedown="return rwt(this,'','','','5','AFQjCNHhc2MnYSZ5T4COqInzvgoju5k5bA','','0ahUKEwiG7O_M5-rQAhWDtRoKHd0RD5QQuogBCC4oATAE','','',event)">Who really governs <em>South</em> Africa?</a><br><span class="_Wmc _GId">Vélemény</span><span class="_v5">-</span><span class="_tQb _IId">News24</span><span class="_v5">-</span><span class="f nsa _uQb">2016. dec. 8.</span></div><div class="_Vmc"></div></div>
+</div>
+ """ # noqa
+ response = mock.Mock(text=html)
results = google_news.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
+ self.assertEqual(results[0]['title'], u'Meet Thuli Madonsela \u2014 South Africa\'s conscience')
self.assertEqual(results[0]['url'], 'http://this.is.the.url')
- self.assertEqual(results[0]['content'], 'This is the content')
-
- json = """
- {
- "responseData": {
- "results": [
- {
- "GsearchResultClass": "GnewsSearch",
- "clusterUrl": "http://news.google.com/news/story?ncl=d2d3t1LMDpNIj2MPPhdTT0ycN4sWM&hl=fr&ned=fr",
- "content": "This is the content",
- "unescapedUrl": "http://this.is.the.url",
- "title": "This is the title",
- "titleNoFormatting": "This is the title",
- "location": "",
- "publisher": "Jeux Actu",
- "publishedDate": "Fri, 30 Jan 2015 11:00:25 -0800",
- "signedRedirectUrl": "http://news.google.com/news/",
- "language": "fr",
- "image": {
- "url": "http://i.jeuxactus.com/datas/jeux/d/y/dying-light/vu/dying-light-54cc080b568fb.jpg",
- "tbUrl": "http://t1.gstatic.com/images?q=tbn:b_6f-OSAZ-5SEPXYwG3LNs",
- "originalContextUrl": "http://www.jeuxactu.com/test-dying-light-sur-ps4-97208.htm",
- "publisher": "Jeux Actu",
- "tbWidth": 80,
- "tbHeight": 30
- }
- }
- ]
- },
- "responseDetails": null,
- "responseStatus": 200
- }
- """
- response = mock.Mock(text=json)
- results = google_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- {
- "responseData": {},
- "responseDetails": null,
- "responseStatus": 200
- }
- """
- response = mock.Mock(text=json)
- results = google_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
+ self.assertEqual(results[0]['content'], 'South African Public Protector')
diff --git a/tests/unit/engines/test_kickass.py b/tests/unit/engines/test_kickass.py
index 4cfcaa63c..3a75c6697 100644
--- a/tests/unit/engines/test_kickass.py
+++ b/tests/unit/engines/test_kickass.py
@@ -14,7 +14,7 @@ class TestKickassEngine(SearxTestCase):
params = kickass.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
- self.assertIn('kickass.to', params['url'])
+ self.assertIn('kickass.cd', params['url'])
self.assertFalse(params['verify'])
def test_response(self):
@@ -84,7 +84,7 @@ class TestKickassEngine(SearxTestCase):
</span>
</div>
</td>
- <td class="nobr center">449 <span>bytes</span></td>
+ <td class="nobr center">449 bytes</td>
<td class="center">4</td>
<td class="center">2&nbsp;years</td>
<td class="green center">10</td>
@@ -97,8 +97,8 @@ class TestKickassEngine(SearxTestCase):
self.assertEqual(type(results), list)
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'https://kickass.to/url.html')
- self.assertEqual(results[0]['content'], 'Posted by riri in Other &gt; Unsorted')
+ self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
+ self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
self.assertEqual(results[0]['seed'], 10)
self.assertEqual(results[0]['leech'], 1)
self.assertEqual(results[0]['filesize'], 449)
@@ -191,7 +191,7 @@ class TestKickassEngine(SearxTestCase):
</span>
</div>
</td>
- <td class="nobr center">1 <span>KB</span></td>
+ <td class="nobr center">1 KiB</td>
<td class="center">4</td>
<td class="center">2&nbsp;years</td>
<td class="green center">10</td>
@@ -235,7 +235,7 @@ class TestKickassEngine(SearxTestCase):
</span>
</div>
</td>
- <td class="nobr center">1 <span>MB</span></td>
+ <td class="nobr center">1 MiB</td>
<td class="center">4</td>
<td class="center">2&nbsp;years</td>
<td class="green center">9</td>
@@ -279,7 +279,7 @@ class TestKickassEngine(SearxTestCase):
</span>
</div>
</td>
- <td class="nobr center">1 <span>GB</span></td>
+ <td class="nobr center">1 GiB</td>
<td class="center">4</td>
<td class="center">2&nbsp;years</td>
<td class="green center">8</td>
@@ -323,7 +323,7 @@ class TestKickassEngine(SearxTestCase):
</span>
</div>
</td>
- <td class="nobr center">1 <span>TB</span></td>
+ <td class="nobr center">1 TiB</td>
<td class="center">4</td>
<td class="center">2&nbsp;years</td>
<td class="green center">7</td>
@@ -367,7 +367,7 @@ class TestKickassEngine(SearxTestCase):
</span>
</div>
</td>
- <td class="nobr center">z <span>bytes</span></td>
+ <td class="nobr center">z bytes</td>
<td class="center">r</td>
<td class="center">2&nbsp;years</td>
<td class="green center">a</td>
@@ -380,17 +380,17 @@ class TestKickassEngine(SearxTestCase):
self.assertEqual(type(results), list)
self.assertEqual(len(results), 5)
self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'https://kickass.to/url.html')
- self.assertEqual(results[0]['content'], 'Posted by riri in Other &gt; Unsorted')
+ self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
+ self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
self.assertEqual(results[0]['seed'], 10)
self.assertEqual(results[0]['leech'], 1)
self.assertEqual(results[0]['files'], 4)
self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test')
self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test')
- self.assertEqual(results[0]['filesize'], 1024)
- self.assertEqual(results[1]['filesize'], 1048576)
- self.assertEqual(results[2]['filesize'], 1073741824)
- self.assertEqual(results[3]['filesize'], 1099511627776)
+ self.assertEqual(results[0]['filesize'], 1000)
+ self.assertEqual(results[1]['filesize'], 1000000)
+ self.assertEqual(results[2]['filesize'], 1000000000)
+ self.assertEqual(results[3]['filesize'], 1000000000000)
self.assertEqual(results[4]['seed'], 0)
self.assertEqual(results[4]['leech'], 0)
self.assertEqual(results[4]['files'], None)
diff --git a/tests/unit/engines/test_pdbe.py b/tests/unit/engines/test_pdbe.py
new file mode 100644
index 000000000..7aa8e2655
--- /dev/null
+++ b/tests/unit/engines/test_pdbe.py
@@ -0,0 +1,109 @@
+import mock
+from collections import defaultdict
+from searx.engines import pdbe
+from searx.testing import SearxTestCase
+
+
+class TestPdbeEngine(SearxTestCase):
+ def test_request(self):
+ query = 'test_query'
+ dicto = defaultdict(dict)
+ params = pdbe.request(query, dicto)
+ self.assertTrue('url' in params)
+ self.assertTrue('ebi.ac.uk' in params['url'])
+ self.assertTrue('data' in params)
+ self.assertTrue('q' in params['data'])
+ self.assertTrue(query in params['data']['q'])
+ self.assertTrue('wt' in params['data'])
+ self.assertTrue('json' in params['data']['wt'])
+ self.assertTrue('method' in params)
+ self.assertTrue(params['method'] == 'POST')
+
+ def test_response(self):
+ self.assertRaises(AttributeError, pdbe.response, None)
+ self.assertRaises(AttributeError, pdbe.response, [])
+ self.assertRaises(AttributeError, pdbe.response, '')
+ self.assertRaises(AttributeError, pdbe.response, '[]')
+
+ json = """
+{
+ "response": {
+ "docs": [
+ {
+ "citation_title": "X-ray crystal structure of ferric Aplysia limacina myoglobin in different liganded states.",
+ "citation_year": 1993,
+ "entry_author_list": [
+ "Conti E, Moser C, Rizzi M, Mattevi A, Lionetti C, Coda A, Ascenzi P, Brunori M, Bolognesi M"
+ ],
+ "journal": "J. Mol. Biol.",
+ "journal_page": "498-508",
+ "journal_volume": "233",
+ "pdb_id": "2fal",
+ "status": "REL",
+ "title": "X-RAY CRYSTAL STRUCTURE OF FERRIC APLYSIA LIMACINA MYOGLOBIN IN DIFFERENT LIGANDED STATES"
+ }
+ ],
+ "numFound": 1,
+ "start": 0
+ },
+ "responseHeader": {
+ "QTime": 0,
+ "params": {
+ "q": "2fal",
+ "wt": "json"
+ },
+ "status": 0
+ }
+}
+"""
+
+ response = mock.Mock(text=json)
+ results = pdbe.response(response)
+ self.assertEqual(type(results), list)
+ self.assertEqual(len(results), 1)
+ self.assertEqual(results[0]['title'],
+ 'X-RAY CRYSTAL STRUCTURE OF FERRIC APLYSIA LIMACINA MYOGLOBIN IN DIFFERENT LIGANDED STATES')
+ self.assertEqual(results[0]['url'], pdbe.pdbe_entry_url.format(pdb_id='2fal'))
+ self.assertEqual(results[0]['img_src'], pdbe.pdbe_preview_url.format(pdb_id='2fal'))
+ self.assertTrue('Conti E' in results[0]['content'])
+ self.assertTrue('X-ray crystal structure of ferric Aplysia limacina myoglobin in different liganded states.' in
+ results[0]['content'])
+ self.assertTrue('1993' in results[0]['content'])
+
+ # Testing proper handling of PDB entries marked as obsolete
+ json = """
+{
+ "response": {
+ "docs": [
+ {
+ "citation_title": "Obsolete entry test",
+ "citation_year": 2016,
+ "entry_author_list": ["Doe J"],
+ "journal": "J. Obs.",
+ "journal_page": "1-2",
+ "journal_volume": "1",
+ "pdb_id": "xxxx",
+ "status": "OBS",
+ "title": "OBSOLETE ENTRY TEST",
+ "superseded_by": "yyyy"
+ }
+ ],
+ "numFound": 1,
+ "start": 0
+ },
+ "responseHeader": {
+ "QTime": 0,
+ "params": {
+ "q": "xxxx",
+ "wt": "json"
+ },
+ "status": 0
+ }
+}
+"""
+ response = mock.Mock(text=json)
+ results = pdbe.response(response)
+ self.assertEqual(type(results), list)
+ self.assertEqual(len(results), 1)
+ self.assertEqual(results[0]['title'], 'OBSOLETE ENTRY TEST&nbsp;(OBSOLETE)')
+ self.assertTrue(results[0]['content'].startswith('<em>This entry has been superseded by'))
diff --git a/tests/unit/engines/test_searchcode_doc.py b/tests/unit/engines/test_searchcode_doc.py
index 7228613ed..d02bb7a44 100644
--- a/tests/unit/engines/test_searchcode_doc.py
+++ b/tests/unit/engines/test_searchcode_doc.py
@@ -56,9 +56,6 @@ class TestSearchcodeDocEngine(SearxTestCase):
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['title'], '[Type] Namespace test')
self.assertEqual(results[0]['url'], 'http://url')
- self.assertIn('Synopsis', results[0]['content'])
- self.assertIn('Type', results[0]['content'])
- self.assertIn('test', results[0]['content'])
self.assertIn('Description', results[0]['content'])
json = r"""
diff --git a/tests/unit/engines/test_seedpeer.py b/tests/unit/engines/test_seedpeer.py
new file mode 100644
index 000000000..37b2de8e4
--- /dev/null
+++ b/tests/unit/engines/test_seedpeer.py
@@ -0,0 +1,51 @@
+import mock
+from collections import defaultdict
+from searx.engines import seedpeer
+from searx.testing import SearxTestCase
+from datetime import datetime
+
+
+class TestSeedPeerEngine(SearxTestCase):
+
+ html = ''
+ with open('./tests/unit/engines/seedpeer_fixture.html') as fixture:
+ html += fixture.read()
+
+ def test_request(self):
+ query = 'test_query'
+ dicto = defaultdict(dict)
+ dicto['pageno'] = 1
+ params = seedpeer.request(query, dicto)
+ self.assertIn('url', params)
+ self.assertIn(query, params['url'])
+ self.assertIn('seedpeer.eu', params['url'])
+
+ def test_response_raises_attr_error_on_empty_response(self):
+ self.assertRaises(AttributeError, seedpeer.response, None)
+ self.assertRaises(AttributeError, seedpeer.response, [])
+ self.assertRaises(AttributeError, seedpeer.response, '')
+ self.assertRaises(AttributeError, seedpeer.response, '[]')
+
+ def test_response_returns_empty_list(self):
+ response = mock.Mock(text='<html></html>')
+ self.assertEqual(seedpeer.response(response), [])
+
+ def test_response_returns_all_results(self):
+ response = mock.Mock(text=self.html)
+ results = seedpeer.response(response)
+ self.assertTrue(isinstance(results, list))
+ self.assertEqual(len(results), 2)
+
+ def test_response_returns_correct_results(self):
+ response = mock.Mock(text=self.html)
+ results = seedpeer.response(response)
+ self.assertEqual(
+ results[0]['title'], 'Narcos - Season 2 - 720p WEBRiP - x265 HEVC - ShAaNiG '
+ )
+ self.assertEqual(
+ results[0]['url'],
+ 'http://www.seedpeer.eu/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html'
+ )
+ self.assertEqual(results[0]['content'], '2.48 GB, 1 day')
+ self.assertEqual(results[0]['seed'], '861')
+ self.assertEqual(results[0]['leech'], '332')
diff --git a/tests/unit/engines/test_spotify.py b/tests/unit/engines/test_spotify.py
index fd274abbd..e37c344d2 100644
--- a/tests/unit/engines/test_spotify.py
+++ b/tests/unit/engines/test_spotify.py
@@ -90,7 +90,7 @@ class TestSpotifyEngine(SearxTestCase):
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['title'], 'Title of track')
self.assertEqual(results[0]['url'], 'https://open.spotify.com/track/2GzvFiedqW8hgqUpWcASZa')
- self.assertEqual(results[0]['content'], 'Artist Name &bull; Album Title &bull; Title of track')
+ self.assertEqual(results[0]['content'], 'Artist Name - Album Title - Title of track')
self.assertIn('1000', results[0]['embedded'])
json = """
diff --git a/tests/unit/engines/test_vimeo.py b/tests/unit/engines/test_vimeo.py
index 50b1cb563..c86b50a14 100644
--- a/tests/unit/engines/test_vimeo.py
+++ b/tests/unit/engines/test_vimeo.py
@@ -22,80 +22,15 @@ class TestVimeoEngine(SearxTestCase):
self.assertRaises(AttributeError, vimeo.response, '')
self.assertRaises(AttributeError, vimeo.response, '[]')
- response = mock.Mock(text='<html></html>')
- self.assertEqual(vimeo.response(response), [])
+ json = u"""
+{"filtered":{"total":274641,"page":1,"per_page":18,"paging":{"next":"?sizes=590x332&page=2","previous":null,"first":"?sizes=590x332&page=1","last":"?sizes=590x332&page=15258"},"data":[{"is_staffpick":false,"is_featured":true,"type":"clip","clip":{"uri":"\\/videos\\/106557563","name":"Hot Rod Revue: The South","link":"https:\\/\\/vimeo.com\\/106557563","duration":4069,"created_time":"2014-09-19T03:38:04+00:00","privacy":{"view":"ptv"},"pictures":{"sizes":[{"width":"590","height":"332","link":"https:\\/\\/i.vimeocdn.com\\/video\\/489717884_590x332.jpg?r=pad","link_with_play_button":"https:\\/\\/i.vimeocdn.com\\/filter\\/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F489717884_590x332.jpg&src1=http%3A%2F%2Ff.vimeocdn.com%2Fp%2Fimages%2Fcrawler_play.png"}]},"stats":{"plays":null},"metadata":{"connections":{"comments":{"total":0},"likes":{"total":5}},"interactions":[]},"user":{"name":"Cal Thorley","link":"https:\\/\\/vimeo.com\\/calthorley","pictures":{"sizes":[{"width":30,"height":30,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_30x30?r=pad"},{"width":75,"height":75,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_75x75?r=pad"},{"width":100,"height":100,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_100x100?r=pad"},{"width":300,"height":300,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_300x300?r=pad"}]}}}}]}};
- html = """
- <div id="browse_content" class="results_grid" data-search-id="696d5f8366914ec4ffec33cf7652de384976d4f4">
- <ul class="js-browse_list clearfix browse browse_videos browse_videos_thumbnails kane"
- data-stream="c2VhcmNoOjo6ZGVzYzp7InF1ZXJ5IjoidGVzdCJ9">
- <li data-position="7" data-result-id="clip_79600943">
- <div class="clip_thumbnail">
- <a href="/videoid" class="js-result_url">
- <div class="thumbnail_wrapper">
- <img src="http://image.url.webp" class="js-clip_thumbnail_image">
- <div class="overlay overlay_clip_meta">
- <div class="meta_data_footer">
- <span class="clip_upload_date">
- <time datetime="2013-11-17T08:49:09-05:00"
- title="dimanche 17 novembre 2013 08:49">Il y a 1 an</time>
- </span>
- <span class="clip_likes">
- <img src="https://f.vimeocdn.com/images_v6/svg/heart-icon.svg">2 215
- </span>
- <span class="clip_comments">
- <img src="https://f.vimeocdn.com/images_v6/svg/comment-icon.svg">75
- </span>
- <span class="overlay meta_data_footer clip_duration">01:12</span>
- </div>
- </div>
- </div>
- <span class="title">This is the title</span>
- </a>
- </div>
- <div class="clip_thumbnail_attribution">
- <a href="/fedorshmidt">
- <img src="https://i.vimeocdn.com/portrait/6628061_100x100.jpg" class="avatar">
- <span class="display_name">Fedor Shmidt</span>
- </a>
- <span class="plays">2,1M lectures</span>
- </div>
- </li>
- </ul>
- </div>
- """
- response = mock.Mock(text=html)
+""" # noqa
+ response = mock.Mock(text=json)
results = vimeo.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://vimeo.com/videoid')
+ self.assertEqual(results[0]['title'], u'Hot Rod Revue: The South')
+ self.assertEqual(results[0]['url'], 'https://vimeo.com/106557563')
self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['thumbnail'], 'http://image.url.webp')
- self.assertIn('/videoid', results[0]['embedded'])
-
- html = """
- <ol class="js-browse_list clearfix browse browse_videos browse_videos_thumbnails kane"
- data-stream="c2VhcmNoOjo6ZGVzYzp7InF1ZXJ5IjoidGVzdCJ9">
- <li id="clip_100785455" data-start-page="/search/page:1/sort:relevant/" data-position="1">
- <a href="/videoid" title="Futurama 3d (test shot)">
- <img src="http://image.url.webp"
- srcset="http://i.vimeocdn.com/video/482375085_590x332.webp 2x" alt=""
- class="thumbnail thumbnail_lg_wide">
- <div class="data">
- <p class="title">
- This is the title
- </p>
- <p class="meta">
- <time datetime="2014-07-15T04:16:27-04:00"
- title="mardi 15 juillet 2014 04:16">Il y a 6 mois</time>
- </p>
- </div>
- </a>
- </li>
- </ol>
- """
- response = mock.Mock(text=html)
- results = vimeo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
+ self.assertEqual(results[0]['thumbnail'], 'https://i.vimeocdn.com/video/489717884_590x332.jpg?r=pad')
diff --git a/tests/unit/engines/test_wolframalpha_api.py b/tests/unit/engines/test_wolframalpha_api.py
index 76404e192..64a64ceb3 100644
--- a/tests/unit/engines/test_wolframalpha_api.py
+++ b/tests/unit/engines/test_wolframalpha_api.py
@@ -103,7 +103,8 @@ class TestWolframAlphaAPIEngine(SearxTestCase):
self.assertEqual(referer_url, results[0]['urls'][0]['url'])
self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha', results[1]['title'])
+ self.assertEqual('Wolfram|Alpha (input_plaintext)', results[1]['title'])
+ self.assertIn('result_plaintext', results[1]['content'])
# test calc
xml = """<?xml version='1.0' encoding='UTF-8'?>
@@ -161,4 +162,5 @@ class TestWolframAlphaAPIEngine(SearxTestCase):
self.assertEqual(referer_url, results[0]['urls'][0]['url'])
self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha', results[1]['title'])
+ self.assertEqual('Wolfram|Alpha (integral_plaintext)', results[1]['title'])
+ self.assertIn('integral_plaintext', results[1]['content'])
diff --git a/tests/unit/engines/test_wolframalpha_noapi.py b/tests/unit/engines/test_wolframalpha_noapi.py
index a8f73470e..982edd9f2 100644
--- a/tests/unit/engines/test_wolframalpha_noapi.py
+++ b/tests/unit/engines/test_wolframalpha_noapi.py
@@ -140,7 +140,8 @@ class TestWolframAlphaNoAPIEngine(SearxTestCase):
self.assertEqual(referer_url, results[0]['urls'][0]['url'])
self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha', results[1]['title'])
+ self.assertEqual('Wolfram|Alpha (input_plaintext)', results[1]['title'])
+ self.assertIn('result_plaintext', results[1]['content'])
# test calc
json = r"""
@@ -219,4 +220,5 @@ class TestWolframAlphaNoAPIEngine(SearxTestCase):
self.assertEqual(referer_url, results[0]['urls'][0]['url'])
self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha', results[1]['title'])
+ self.assertEqual('Wolfram|Alpha (integral_plaintext)', results[1]['title'])
+ self.assertIn('integral_plaintext', results[1]['content'])
diff --git a/tests/unit/engines/test_www500px.py b/tests/unit/engines/test_www500px.py
index 8df15b945..e50601da0 100644
--- a/tests/unit/engines/test_www500px.py
+++ b/tests/unit/engines/test_www500px.py
@@ -22,62 +22,13 @@ class TestWww500pxImagesEngine(SearxTestCase):
self.assertRaises(AttributeError, www500px.response, '')
self.assertRaises(AttributeError, www500px.response, '[]')
- response = mock.Mock(text='<html></html>')
- self.assertEqual(www500px.response(response), [])
-
- html = """
- <div class="photo">
- <a href="/this.should.be.the.url" data-ga-category="Photo Thumbnail" data-ga-action="Title">
- <img src="https://image.url/3.jpg?v=0" />
- </a>
- <div class="details">
- <div class="inside">
- <div class="title">
- <a href="/photo/64312705/branch-out-by-oliver-turpin?feature=">
- This is the title
- </a>
- </div>
- <div class="info">
- <a href="/ChronicleUK" data-ga-action="Image" data-ga-category="Photo Thumbnail">
- This is the content
- </a>
- </div>
- <div class="rating">44.8</div>
- </div>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
+ json = """
+{"current_page":1,"total_pages":1000,"total_items":862178,"photos":[{"id":64531569,"user_id":111147,"name":"Grand Canyon Afternoon","description":"Looking west on a very windy winter afternoon.","camera":"Canon EOS 5D Mark II","lens":"EF24-105mm f/4L IS USM","focal_length":"28","iso":"200","shutter_speed":"1/1250","aperture":"6.3","times_viewed":4809,"rating":48.5,"status":1,"created_at":"2014-03-22T03:44:46-04:00","category":8,"location":null,"latitude":36.0323916666667,"longitude":-111.85273,"taken_at":"2014-02-27T14:10:43-05:00","hi_res_uploaded":2,"for_sale":true,"width":5476,"height":3651,"votes_count":108,"favorites_count":35,"comments_count":5,"nsfw":false,"sales_count":0,"for_sale_date":null,"highest_rating":91.9,"highest_rating_date":"2014-03-22T22:34:54-04:00","license_type":0,"converted":31,"collections_count":10,"crop_version":0,"privacy":false,"profile":true,"image_url":["https://drscdn.500px.org/photo/64531569/w%3D70_h%3D70/449d50817f28d85395e23bbb415b3cdb?v=0","https://drscdn.500px.org/photo/64531569/q%3D50_w%3D140_h%3D140/3e3e123734a596644ede78105268bdb2?v=0","https://drscdn.500px.org/photo/64531569/q%3D80_h%3D300/2ce2f61714aebdca710967dfdc3efb04","https://drscdn.500px.org/photo/64531569/q%3D80_h%3D450/c8ec030441f2c68b9bd40a114903348a","https://drscdn.500px.org/photo/64531569/q%3D80_h%3D600/ab6562d0581b359679ecc8ef2e939396","https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1000/bd7dbc54a505e041a8c9a70dfa434272","https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1500/eb4d7f8f6a32d3e5c168c2cb55d29c12","https://drscdn.500px.org/photo/64531569/q%3D80_m%3D2000/d519f91b8a568e7357a8a7fa1aabbe74","https://drscdn.500px.org/photo/64531569/m%3D2048/4c52fb18cc2b2b6f91a0d04609786507","https://drscdn.500px.org/photo/64531569/m%3D900/fb620ae39569ab4a421e9170a94b1a0f","https://drscdn.500px.org/photo/64531569/m%3D900_s%3D1_k%3D1_a%3D1/02b95ce64db090c1f94f890960974612?v=0"],"images":[{"size":1,"url":"https://drscdn.500px.org/photo/64531569/w%3D70_h%3D70/449d50817f28d85395e23bbb415b3cdb?v=0","https_url":"https://drscdn.500px.org/photo/64531569/w%3D70_h%3D70/449d50817f28d85395e23bbb415b3cdb?v=0","format":"jpeg"},{"size":2,"url":"https://drscdn.500px.org/photo/64531569/q%3D50_w%3D140_h%3D140/3e3e123734a596644ede78105268bdb2?v=0","https_url":"https://drscdn.500px.org/photo/64531569/q%3D50_w%3D140_h%3D140/3e3e123734a596644ede78105268bdb2?v=0","format":"jpeg"},{"size":4,"url":"https://drscdn.500px.org/photo/64531569/m%3D900/fb620ae39569ab4a421e9170a94b1a0f","https_url":"https://drscdn.500px.org/photo/64531569/m%3D900/fb620ae39569ab4a421e9170a94b1a0f","format":"jpeg"},{"size":14,"url":"https://drscdn.500px.org/photo/64531569/m%3D900_s%3D1_k%3D1_a%3D1/02b95ce64db090c1f94f890960974612?v=0","https_url":"https://drscdn.500px.org/photo/64531569/m%3D900_s%3D1_k%3D1_a%3D1/02b95ce64db090c1f94f890960974612?v=0","format":"jpeg"},{"size":31,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D450/c8ec030441f2c68b9bd40a114903348a","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D450/c8ec030441f2c68b9bd40a114903348a","format":"jpeg"},{"size":32,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D300/2ce2f61714aebdca710967dfdc3efb04","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D300/2ce2f61714aebdca710967dfdc3efb04","format":"jpeg"},{"size":33,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D600/ab6562d0581b359679ecc8ef2e939396","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D600/ab6562d0581b359679ecc8ef2e939396","format":"jpeg"},{"size":34,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1000/bd7dbc54a505e041a8c9a70dfa434272","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1000/bd7dbc54a505e041a8c9a70dfa434272","format":"jpeg"},{"size":35,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1500/eb4d7f8f6a32d3e5c168c2cb55d29c12","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1500/eb4d7f8f6a32d3e5c168c2cb55d29c12","format":"jpeg"},{"size":36,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D2000/d519f91b8a568e7357a8a7fa1aabbe74","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D2000/d519f91b8a568e7357a8a7fa1aabbe74","format":"jpeg"},{"size":2048,"url":"https://drscdn.500px.org/photo/64531569/m%3D2048/4c52fb18cc2b2b6f91a0d04609786507","https_url":"https://drscdn.500px.org/photo/64531569/m%3D2048/4c52fb18cc2b2b6f91a0d04609786507","format":"jpeg"}],"url":"/photo/64531569/grand-canyon-afternoon-by-todd-hakala","positive_votes_count":108,"converted_bits":31,"tags":["landscape","river","arizona","canyon","grand","colorado","south","southwest","az","west","rim","CanonGetaway"],"watermark":false,"image_format":"jpeg","licensing_requested":false,"licensing_suggested":false,"is_free_photo":false,"user":{"id":111147,"username":"ToddHakala","firstname":"Todd","lastname":"Hakala","city":"Albuquerque","country":"US","usertype":0,"fullname":"Todd Hakala","userpic_url":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/1.jpg?2","userpic_https_url":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/1.jpg?2","cover_url":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/cover_2048.jpg?8","upgrade_status":1,"store_on":true,"affection":5217,"avatars":{"default":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/1.jpg?2"},"large":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/2.jpg?2"},"small":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/3.jpg?2"},"tiny":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/4.jpg?2"}},"followers_count":171}}]}
+ """ # noqa
+ response = mock.Mock(text=json)
results = www500px.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://500px.com/this.should.be.the.url')
- self.assertEqual(results[0]['content'], 'This is the content')
- self.assertEqual(results[0]['thumbnail_src'], 'https://image.url/3.jpg?v=0')
- self.assertEqual(results[0]['img_src'], 'https://image.url/2048.jpg')
-
- html = """
- <a href="/this.should.be.the.url" data-ga-category="Photo Thumbnail" data-ga-action="Title">
- <img src="https://image.url/3.jpg?v=0" />
- </a>
- <div class="details">
- <div class="inside">
- <div class="title">
- <a href="/photo/64312705/branch-out-by-oliver-turpin?feature=">
- This is the title
- </a>
- </div>
- <div class="info">
- <a href="/ChronicleUK" data-ga-action="Image" data-ga-category="Photo Thumbnail">
- Oliver Turpin
- </a>
- </div>
- <div class="rating">44.8</div>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = www500px.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
+ self.assertEqual(results[0]['title'], u'Grand Canyon Afternoon')
+ self.assertEqual(results[0]['url'], 'https://500px.com/photo/64531569/grand-canyon-afternoon-by-todd-hakala')
+ self.assertEqual(results[0]['content'], u'Looking west on a very windy winter afternoon.')
diff --git a/tests/unit/engines/test_yahoo.py b/tests/unit/engines/test_yahoo.py
index 1226f92ab..303295e2f 100644
--- a/tests/unit/engines/test_yahoo.py
+++ b/tests/unit/engines/test_yahoo.py
@@ -46,6 +46,13 @@ class TestYahooEngine(SearxTestCase):
self.assertIn('en', params['cookies']['sB'])
self.assertIn('en', params['url'])
+ def test_no_url_in_request_year_time_range(self):
+ dicto = defaultdict(dict)
+ query = 'test_query'
+ dicto['time_range'] = 'year'
+ params = yahoo.request(query, dicto)
+ self.assertEqual({}, params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, yahoo.response, None)
self.assertRaises(AttributeError, yahoo.response, [])
diff --git a/tests/unit/engines/test_youtube_noapi.py b/tests/unit/engines/test_youtube_noapi.py
index 9fa8fd20e..41dcbb749 100644
--- a/tests/unit/engines/test_youtube_noapi.py
+++ b/tests/unit/engines/test_youtube_noapi.py
@@ -11,11 +11,31 @@ class TestYoutubeNoAPIEngine(SearxTestCase):
query = 'test_query'
dicto = defaultdict(dict)
dicto['pageno'] = 0
+ dicto['time_range'] = ''
params = youtube_noapi.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
self.assertIn('youtube.com', params['url'])
+ def test_time_range_search(self):
+ dicto = defaultdict(dict)
+ query = 'test_query'
+ dicto['time_range'] = 'year'
+ params = youtube_noapi.request(query, dicto)
+ self.assertIn('&sp=EgIIBQ%253D%253D', params['url'])
+
+ dicto['time_range'] = 'month'
+ params = youtube_noapi.request(query, dicto)
+ self.assertIn('&sp=EgIIBA%253D%253D', params['url'])
+
+ dicto['time_range'] = 'week'
+ params = youtube_noapi.request(query, dicto)
+ self.assertIn('&sp=EgIIAw%253D%253D', params['url'])
+
+ dicto['time_range'] = 'day'
+ params = youtube_noapi.request(query, dicto)
+ self.assertIn('&sp=EgIIAg%253D%253D', params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, youtube_noapi.response, None)
self.assertRaises(AttributeError, youtube_noapi.response, [])
diff --git a/tests/unit/test_answerers.py b/tests/unit/test_answerers.py
new file mode 100644
index 000000000..bd8789a7e
--- /dev/null
+++ b/tests/unit/test_answerers.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from mock import Mock
+
+from searx.answerers import answerers
+from searx.testing import SearxTestCase
+
+
+class AnswererTest(SearxTestCase):
+
+ def test_unicode_input(self):
+ query = Mock()
+ unicode_payload = u'árvíztűrő tükörfúrógép'
+ for answerer in answerers:
+ query.query = u'{} {}'.format(answerer.keywords[0], unicode_payload)
+ self.assertTrue(isinstance(answerer.answer(query), list))
diff --git a/tests/unit/test_plugins.py b/tests/unit/test_plugins.py
index 98d39ec14..c9e65dfcb 100644
--- a/tests/unit/test_plugins.py
+++ b/tests/unit/test_plugins.py
@@ -6,9 +6,8 @@ from mock import Mock
def get_search_mock(query, **kwargs):
- return {'search': Mock(query=query,
- result_container=Mock(answers=set()),
- **kwargs)}
+ return Mock(search_query=Mock(query=query, **kwargs),
+ result_container=Mock(answers=set()))
class PluginStoreTest(SearxTestCase):
@@ -52,23 +51,39 @@ class SelfIPTest(SearxTestCase):
request = Mock(user_plugins=store.plugins,
remote_addr='127.0.0.1')
request.headers.getlist.return_value = []
- ctx = get_search_mock(query='ip')
- store.call('post_search', request, ctx)
- self.assertTrue('127.0.0.1' in ctx['search'].result_container.answers)
+ search = get_search_mock(query='ip', pageno=1)
+ store.call('post_search', request, search)
+ self.assertTrue('127.0.0.1' in search.result_container.answers)
+
+ search = get_search_mock(query='ip', pageno=2)
+ store.call('post_search', request, search)
+ self.assertFalse('127.0.0.1' in search.result_container.answers)
# User agent test
request = Mock(user_plugins=store.plugins,
user_agent='Mock')
request.headers.getlist.return_value = []
- ctx = get_search_mock(query='user-agent')
- store.call('post_search', request, ctx)
- self.assertTrue('Mock' in ctx['search'].result_container.answers)
+ search = get_search_mock(query='user-agent', pageno=1)
+ store.call('post_search', request, search)
+ self.assertTrue('Mock' in search.result_container.answers)
+
+ search = get_search_mock(query='user-agent', pageno=2)
+ store.call('post_search', request, search)
+ self.assertFalse('Mock' in search.result_container.answers)
+
+ search = get_search_mock(query='user-agent', pageno=1)
+ store.call('post_search', request, search)
+ self.assertTrue('Mock' in search.result_container.answers)
+
+ search = get_search_mock(query='user-agent', pageno=2)
+ store.call('post_search', request, search)
+ self.assertFalse('Mock' in search.result_container.answers)
- ctx = get_search_mock(query='user-agent')
- store.call('post_search', request, ctx)
- self.assertTrue('Mock' in ctx['search'].result_container.answers)
+ search = get_search_mock(query='What is my User-Agent?', pageno=1)
+ store.call('post_search', request, search)
+ self.assertTrue('Mock' in search.result_container.answers)
- ctx = get_search_mock(query='What is my User-Agent?')
- store.call('post_search', request, ctx)
- self.assertTrue('Mock' in ctx['search'].result_container.answers)
+ search = get_search_mock(query='What is my User-Agent?', pageno=2)
+ store.call('post_search', request, search)
+ self.assertFalse('Mock' in search.result_container.answers)
diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py
index 1762d66b6..1ef1f56c3 100644
--- a/tests/unit/test_webapp.py
+++ b/tests/unit/test_webapp.py
@@ -5,6 +5,7 @@ from mock import Mock
from urlparse import ParseResult
from searx import webapp
from searx.testing import SearxTestCase
+from searx.search import Search
class ViewsTestCase(SearxTestCase):
@@ -41,10 +42,10 @@ class ViewsTestCase(SearxTestCase):
results_number=lambda: 3,
results_length=lambda: len(self.test_results))
- webapp.Search.search = search_mock
+ Search.search = search_mock
def get_current_theme_name_mock(override=None):
- return 'default'
+ return 'legacy'
webapp.get_current_theme_name = get_current_theme_name_mock
@@ -58,7 +59,7 @@ class ViewsTestCase(SearxTestCase):
def test_index_html(self):
result = self.app.post('/', data={'q': 'test'})
self.assertIn(
- '<h3 class="result_title"><img width="14" height="14" class="favicon" src="/static/themes/default/img/icons/icon_youtube.ico" alt="youtube" /><a href="http://second.test.xyz" rel="noreferrer">Second <span class="highlight">Test</span></a></h3>', # noqa
+ '<h3 class="result_title"><img width="14" height="14" class="favicon" src="/static/themes/legacy/img/icons/icon_youtube.ico" alt="youtube" /><a href="http://second.test.xyz" rel="noreferrer">Second <span class="highlight">Test</span></a></h3>', # noqa
result.data
)
self.assertIn(