mirror of
https://github.com/searxng/searxng.git
synced 2026-07-20 15:01:24 +00:00
Compare commits
31 Commits
update_dat
...
80c9806de1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80c9806de1 | ||
|
|
9d7ca4febc | ||
|
|
c5cd510d82 | ||
|
|
73a0219ab8 | ||
|
|
7ed7adfb05 | ||
|
|
d7367e0897 | ||
|
|
21773bbb2d | ||
|
|
67973783de | ||
|
|
0f9e30e3f9 | ||
|
|
640f88c9bd | ||
|
|
c5d8d05f03 | ||
|
|
d115c61a70 | ||
|
|
c5b1d066e5 | ||
|
|
774616ada6 | ||
|
|
6b2ec018e2 | ||
|
|
bfeaad6c37 | ||
|
|
28d3885764 | ||
|
|
b084194c09 | ||
|
|
8c4df4cf3f | ||
|
|
a0e594e16e | ||
|
|
cb4bfbe129 | ||
|
|
a5660bcc4f | ||
|
|
1396265774 | ||
|
|
0fd40d5f29 | ||
|
|
13a5ace8b5 | ||
|
|
a6831797ba | ||
|
|
0e990f78a3 | ||
|
|
990c63b709 | ||
|
|
e535e4c61a | ||
|
|
79506441c5 | ||
|
|
6cb1c077e9 |
16
.github/workflows/container.yml
vendored
16
.github/workflows/container.yml
vendored
@@ -84,7 +84,7 @@ jobs:
|
|||||||
fetch-depth: "0"
|
fetch-depth: "0"
|
||||||
|
|
||||||
- name: Setup cache Python
|
- name: Setup cache Python
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
@@ -96,7 +96,7 @@ jobs:
|
|||||||
run: echo "date=$(date +'%Y%m%d')" >>$GITHUB_OUTPUT
|
run: echo "date=$(date +'%Y%m%d')" >>$GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Setup cache container
|
- name: Setup cache container
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "container-${{ matrix.arch }}-${{ steps.date.outputs.date }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "container-${{ matrix.arch }}-${{ steps.date.outputs.date }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
@@ -106,10 +106,10 @@ jobs:
|
|||||||
|
|
||||||
- if: ${{ matrix.emulation }}
|
- if: ${{ matrix.emulation }}
|
||||||
name: Setup QEMU
|
name: Setup QEMU
|
||||||
uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0
|
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
|
||||||
|
|
||||||
- name: Login to GHCR
|
- name: Login to GHCR
|
||||||
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
|
uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0
|
||||||
with:
|
with:
|
||||||
registry: "ghcr.io"
|
registry: "ghcr.io"
|
||||||
username: "${{ github.repository_owner }}"
|
username: "${{ github.repository_owner }}"
|
||||||
@@ -147,10 +147,10 @@ jobs:
|
|||||||
|
|
||||||
- if: ${{ matrix.emulation }}
|
- if: ${{ matrix.emulation }}
|
||||||
name: Setup QEMU
|
name: Setup QEMU
|
||||||
uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0
|
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
|
||||||
|
|
||||||
- name: Login to GHCR
|
- name: Login to GHCR
|
||||||
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
|
uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0
|
||||||
with:
|
with:
|
||||||
registry: "ghcr.io"
|
registry: "ghcr.io"
|
||||||
username: "${{ github.repository_owner }}"
|
username: "${{ github.repository_owner }}"
|
||||||
@@ -180,14 +180,14 @@ jobs:
|
|||||||
persist-credentials: "false"
|
persist-credentials: "false"
|
||||||
|
|
||||||
- name: Login to GHCR
|
- name: Login to GHCR
|
||||||
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
|
uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0
|
||||||
with:
|
with:
|
||||||
registry: "ghcr.io"
|
registry: "ghcr.io"
|
||||||
username: "${{ github.repository_owner }}"
|
username: "${{ github.repository_owner }}"
|
||||||
password: "${{ secrets.GITHUB_TOKEN }}"
|
password: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
|
uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0
|
||||||
with:
|
with:
|
||||||
registry: "docker.io"
|
registry: "docker.io"
|
||||||
username: "${{ secrets.DOCKER_USER }}"
|
username: "${{ secrets.DOCKER_USER }}"
|
||||||
|
|||||||
2
.github/workflows/data-update.yml
vendored
2
.github/workflows/data-update.yml
vendored
@@ -51,7 +51,7 @@ jobs:
|
|||||||
persist-credentials: "false"
|
persist-credentials: "false"
|
||||||
|
|
||||||
- name: Setup cache Python
|
- name: Setup cache Python
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
|
|||||||
2
.github/workflows/documentation.yml
vendored
2
.github/workflows/documentation.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
|||||||
fetch-depth: "0"
|
fetch-depth: "0"
|
||||||
|
|
||||||
- name: Setup cache Python
|
- name: Setup cache Python
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
|
|||||||
6
.github/workflows/integration.yml
vendored
6
.github/workflows/integration.yml
vendored
@@ -44,7 +44,7 @@ jobs:
|
|||||||
persist-credentials: "false"
|
persist-credentials: "false"
|
||||||
|
|
||||||
- name: Setup cache Python
|
- name: Setup cache Python
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "python-${{ matrix.python-version }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "python-${{ matrix.python-version }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
@@ -77,13 +77,13 @@ jobs:
|
|||||||
node-version-file: "./.nvmrc"
|
node-version-file: "./.nvmrc"
|
||||||
|
|
||||||
- name: Setup cache Node.js
|
- name: Setup cache Node.js
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "nodejs-${{ runner.arch }}-${{ hashFiles('./.nvmrc', './package.json') }}"
|
key: "nodejs-${{ runner.arch }}-${{ hashFiles('./.nvmrc', './package.json') }}"
|
||||||
path: "./client/simple/node_modules/"
|
path: "./client/simple/node_modules/"
|
||||||
|
|
||||||
- name: Setup cache Python
|
- name: Setup cache Python
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
|
|||||||
4
.github/workflows/l10n.yml
vendored
4
.github/workflows/l10n.yml
vendored
@@ -46,7 +46,7 @@ jobs:
|
|||||||
fetch-depth: "0"
|
fetch-depth: "0"
|
||||||
|
|
||||||
- name: Setup cache Python
|
- name: Setup cache Python
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
@@ -94,7 +94,7 @@ jobs:
|
|||||||
fetch-depth: "0"
|
fetch-depth: "0"
|
||||||
|
|
||||||
- name: Setup cache Python
|
- name: Setup cache Python
|
||||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
|
|||||||
4
.github/workflows/security.yml
vendored
4
.github/workflows/security.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
|||||||
persist-credentials: "false"
|
persist-credentials: "false"
|
||||||
|
|
||||||
- name: Sync GHCS from Docker Scout
|
- name: Sync GHCS from Docker Scout
|
||||||
uses: docker/scout-action@7520205ff60037fdc436b40b6a1d1e55a839ec2d # v1.22.0
|
uses: docker/scout-action@ce97ec1bb85613e8eb35d086fad0c77a6cedf983 # v1.23.0
|
||||||
with:
|
with:
|
||||||
organization: "searxng"
|
organization: "searxng"
|
||||||
dockerhub-user: "${{ secrets.DOCKER_USER }}"
|
dockerhub-user: "${{ secrets.DOCKER_USER }}"
|
||||||
@@ -41,6 +41,6 @@ jobs:
|
|||||||
write-comment: "false"
|
write-comment: "false"
|
||||||
|
|
||||||
- name: Upload SARIFs
|
- name: Upload SARIFs
|
||||||
uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
|
uses: github/codeql-action/upload-sarif@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3
|
||||||
with:
|
with:
|
||||||
sarif_file: "./scout.sarif"
|
sarif_file: "./scout.sarif"
|
||||||
|
|||||||
@@ -4,31 +4,32 @@
|
|||||||
Search API
|
Search API
|
||||||
==========
|
==========
|
||||||
|
|
||||||
SearXNG supports querying via a simple HTTP API.
|
SearXNG supports querying via a simple HTTP API. Two endpoints, ``/`` and
|
||||||
Two endpoints, ``/`` and ``/search``, are supported for both GET and POST methods.
|
``/search``, are supported for both GET and POST methods. The ``GET`` method
|
||||||
The GET method expects parameters as URL query parameters, while the POST method expects parameters as form data.
|
expects parameters as URL query parameters, while the POST method expects
|
||||||
|
parameters as form data (``application/x-www-form-urlencoded``).
|
||||||
|
|
||||||
If you want to consume the results as JSON, CSV, or RSS, you need to set the
|
If you want to consume the results as JSON, CSV, or RSS, you need to set the
|
||||||
``format`` parameter accordingly. Supported formats are defined in ``settings.yml``, under the ``search`` section.
|
``format`` parameter accordingly. Supported formats are defined in
|
||||||
Requesting an unset format will return a 403 Forbidden error. Be aware that many public instances have these formats disabled.
|
``settings.yml``, under the :ref:`settings search` section. Requesting an
|
||||||
|
unset format will return a 403 Forbidden error. Be aware that many public
|
||||||
|
instances have these formats disabled.
|
||||||
|
|
||||||
Endpoints:
|
Endpoints:
|
||||||
|
|
||||||
``GET /``
|
.. code::
|
||||||
``GET /search``
|
|
||||||
|
|
||||||
``POST /``
|
GET /
|
||||||
``POST /search``
|
GET /search
|
||||||
|
POST /
|
||||||
|
POST /search
|
||||||
|
|
||||||
example cURL calls:
|
example cURL calls:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code:: bash
|
||||||
|
|
||||||
curl 'https://searx.example.org/search?q=searxng&format=json'
|
curl 'https://searx.example.org/search?q=searxng&format=json'
|
||||||
|
|
||||||
curl -X POST 'https://searx.example.org/search' -d 'q=searxng&format=csv'
|
curl -X POST 'https://searx.example.org/search' -d 'q=searxng&format=csv'
|
||||||
|
|
||||||
curl -L -X POST -d 'q=searxng&format=json' 'https://searx.example.org/'
|
curl -L -X POST -d 'q=searxng&format=json' 'https://searx.example.org/'
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
@@ -53,90 +54,27 @@ Parameters
|
|||||||
Comma separated list, specifies the active search categories (see
|
Comma separated list, specifies the active search categories (see
|
||||||
:ref:`configured engines`)
|
:ref:`configured engines`)
|
||||||
|
|
||||||
``engines`` : optional
|
|
||||||
Comma separated list, specifies the active search engines (see
|
|
||||||
:ref:`configured engines`).
|
|
||||||
|
|
||||||
``language`` : default from :ref:`settings search`
|
``language`` : default from :ref:`settings search`
|
||||||
Code of the language.
|
Code of the language.
|
||||||
|
|
||||||
``pageno`` : default ``1``
|
``pageno`` : default ``1``
|
||||||
Search page number.
|
Search page number.
|
||||||
|
|
||||||
``time_range`` : optional
|
``time_range`` : optional : [ ``day``, ``month``, ``year`` ]
|
||||||
[ ``day``, ``month``, ``year`` ]
|
|
||||||
|
|
||||||
Time range of search for engines which support it. See if an engine supports
|
Time range of search for engines which support it. See if an engine supports
|
||||||
time range search in the preferences page of an instance.
|
time range search in the preferences page of an instance.
|
||||||
|
|
||||||
``format`` : optional
|
``format`` : optional : [ ``json``, ``csv``, ``rss`` ]
|
||||||
[ ``json``, ``csv``, ``rss`` ]
|
|
||||||
|
|
||||||
Output format of results. Format needs to be activated in :ref:`settings
|
Output format of results. Format needs to be activated in :ref:`settings
|
||||||
search`.
|
search`.
|
||||||
|
|
||||||
``results_on_new_tab`` : default ``0``
|
``safesearch`` : default from :ref:`settings search` : [ ``0``, ``1``, ``2`` ]
|
||||||
[ ``0``, ``1`` ]
|
|
||||||
|
|
||||||
Open search results on new tab.
|
|
||||||
|
|
||||||
``image_proxy`` : default from :ref:`settings server`
|
|
||||||
[ ``True``, ``False`` ]
|
|
||||||
|
|
||||||
Proxy image results through SearXNG.
|
|
||||||
|
|
||||||
``autocomplete`` : default from :ref:`settings search`
|
|
||||||
[ ``google``, ``dbpedia``, ``duckduckgo``, ``mwmbl``, ``startpage``,
|
|
||||||
``privacywall``, ``wikipedia``, ``swisscows``, ``qwant`` ]
|
|
||||||
|
|
||||||
Service which completes words as you type.
|
|
||||||
|
|
||||||
``safesearch`` : default from :ref:`settings search`
|
|
||||||
[ ``0``, ``1``, ``2`` ]
|
|
||||||
|
|
||||||
Filter search results of engines which support safe search. See if an engine
|
Filter search results of engines which support safe search. See if an engine
|
||||||
supports safe search in the preferences page of an instance.
|
supports safe search in the preferences page of an instance.
|
||||||
|
|
||||||
``theme`` : default ``simple``
|
``theme`` : default ``simple`` : [ ``simple`` ]
|
||||||
[ ``simple`` ]
|
|
||||||
|
|
||||||
Theme of instance.
|
Theme of instance.
|
||||||
|
|
||||||
Please note, available themes depend on an instance. It is possible that an
|
Please note, available themes depend on an instance. It is possible that an
|
||||||
instance administrator deleted, created or renamed themes on their instance.
|
instance administrator deleted, created or renamed themes on their instance.
|
||||||
See the available options in the preferences page of the instance.
|
See the available options in the preferences page of the instance.
|
||||||
|
|
||||||
``enabled_plugins`` : optional
|
|
||||||
List of enabled plugins.
|
|
||||||
|
|
||||||
:default:
|
|
||||||
``Hash_plugin``, ``Self_Information``,
|
|
||||||
``Tracker_URL_remover``, ``Ahmia_blacklist``
|
|
||||||
|
|
||||||
:values:
|
|
||||||
.. enabled by default
|
|
||||||
|
|
||||||
``Hash_plugin``, ``Self_Information``,
|
|
||||||
``Tracker_URL_remover``, ``Ahmia_blacklist``,
|
|
||||||
|
|
||||||
.. disabled by default
|
|
||||||
|
|
||||||
``Hostnames_plugin``, ``Open_Access_DOI_rewrite``,
|
|
||||||
``Vim-like_hotkeys``, ``Tor_check_plugin``
|
|
||||||
|
|
||||||
``disabled_plugins``: optional
|
|
||||||
List of disabled plugins.
|
|
||||||
|
|
||||||
:default:
|
|
||||||
``Hostnames_plugin``, ``Open_Access_DOI_rewrite``,
|
|
||||||
``Vim-like_hotkeys``, ``Tor_check_plugin``
|
|
||||||
|
|
||||||
:values:
|
|
||||||
see values from ``enabled_plugins``
|
|
||||||
|
|
||||||
``enabled_engines`` : optional : *all* :origin:`engines <searx/engines>`
|
|
||||||
List of enabled engines.
|
|
||||||
|
|
||||||
``disabled_engines`` : optional : *all* :origin:`engines <searx/engines>`
|
|
||||||
List of disabled engines.
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ myst-parser==5.0.0
|
|||||||
linuxdoc==20260504
|
linuxdoc==20260504
|
||||||
aiounittest==1.5.0
|
aiounittest==1.5.0
|
||||||
yamllint==1.38.0
|
yamllint==1.38.0
|
||||||
wlc==2.0.0
|
wlc==2.1.0
|
||||||
coloredlogs==15.0.1
|
coloredlogs==15.0.1
|
||||||
docutils>=0.21.2;python_version <= "3.11"
|
docutils>=0.21.2;python_version <= "3.11"
|
||||||
docutils>=0.22.4; python_version > "3.11"
|
docutils>=0.22.4; python_version > "3.11"
|
||||||
parameterized==0.9.0
|
parameterized==0.9.0
|
||||||
granian[reload]==2.7.6
|
granian[reload]==2.7.8
|
||||||
basedpyright==1.39.8
|
basedpyright==1.39.9
|
||||||
types-lxml==2026.2.16
|
types-lxml==2026.2.16
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
granian==2.7.6
|
granian==2.7.8
|
||||||
granian[pname]==2.7.6
|
granian[pname]==2.7.8
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ sniffio==1.3.1
|
|||||||
valkey==6.1.1
|
valkey==6.1.1
|
||||||
markdown-it-py==4.2.0
|
markdown-it-py==4.2.0
|
||||||
msgspec==0.21.1
|
msgspec==0.21.1
|
||||||
typer==0.26.7
|
typer==0.26.8
|
||||||
isodate==0.7.2
|
isodate==0.7.2
|
||||||
whitenoise==6.12.0
|
whitenoise==6.12.0
|
||||||
typing-extensions==4.15.0
|
typing-extensions==4.16.0
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -773,7 +773,7 @@
|
|||||||
"nl": "Boliviaanse boliviano",
|
"nl": "Boliviaanse boliviano",
|
||||||
"oc": "Boliviano",
|
"oc": "Boliviano",
|
||||||
"pa": "ਬੋਲੀਵੀਆਨੋ",
|
"pa": "ਬੋਲੀਵੀਆਨੋ",
|
||||||
"pl": "boliviano",
|
"pl": "boliwiano",
|
||||||
"pt": "Boliviano",
|
"pt": "Boliviano",
|
||||||
"ro": "boliviano",
|
"ro": "boliviano",
|
||||||
"ru": "боливиано",
|
"ru": "боливиано",
|
||||||
@@ -1107,7 +1107,7 @@
|
|||||||
"fi": "Kongon frangi",
|
"fi": "Kongon frangi",
|
||||||
"fr": "franc congolais",
|
"fr": "franc congolais",
|
||||||
"ga": "franc an Chongó",
|
"ga": "franc an Chongó",
|
||||||
"gl": "Franco congolés",
|
"gl": "franco congolés",
|
||||||
"he": "פרנק קונגולזי",
|
"he": "פרנק קונגולזי",
|
||||||
"hr": "Kongoanski franak",
|
"hr": "Kongoanski franak",
|
||||||
"hu": "kongói frank",
|
"hu": "kongói frank",
|
||||||
@@ -1636,7 +1636,7 @@
|
|||||||
"fi": "Algerian dinaari",
|
"fi": "Algerian dinaari",
|
||||||
"fr": "dinar algérien",
|
"fr": "dinar algérien",
|
||||||
"ga": "dinar na hAilgéire",
|
"ga": "dinar na hAilgéire",
|
||||||
"gl": "Dinar alxeriano",
|
"gl": "dinar alxeriano",
|
||||||
"he": "דינר אלג'ירי",
|
"he": "דינר אלג'ירי",
|
||||||
"hr": "Alžirski dinar",
|
"hr": "Alžirski dinar",
|
||||||
"hu": "algériai dinár",
|
"hu": "algériai dinár",
|
||||||
@@ -1651,7 +1651,7 @@
|
|||||||
"pap": "dinar argelino",
|
"pap": "dinar argelino",
|
||||||
"pl": "dinar algierski",
|
"pl": "dinar algierski",
|
||||||
"pt": "dinar argelino",
|
"pt": "dinar argelino",
|
||||||
"ro": "Dinar algerian",
|
"ro": "dinar algerian",
|
||||||
"ru": "алжирский динар",
|
"ru": "алжирский динар",
|
||||||
"sk": "Alžírský dinár",
|
"sk": "Alžírský dinár",
|
||||||
"sl": "alžirski dinar",
|
"sl": "alžirski dinar",
|
||||||
@@ -1786,7 +1786,7 @@
|
|||||||
"cy": "Ewro",
|
"cy": "Ewro",
|
||||||
"da": "Euro",
|
"da": "Euro",
|
||||||
"de": "Euro",
|
"de": "Euro",
|
||||||
"en": "Euro",
|
"en": "euro",
|
||||||
"eo": "eŭro",
|
"eo": "eŭro",
|
||||||
"es": "Euro",
|
"es": "Euro",
|
||||||
"et": "Euro",
|
"et": "Euro",
|
||||||
@@ -1803,7 +1803,7 @@
|
|||||||
"it": "Euro",
|
"it": "Euro",
|
||||||
"ja": "ユーロ",
|
"ja": "ユーロ",
|
||||||
"ko": "유로",
|
"ko": "유로",
|
||||||
"lt": "Euras",
|
"lt": "euras",
|
||||||
"lv": "eiro",
|
"lv": "eiro",
|
||||||
"ml": "യൂറോ",
|
"ml": "യൂറോ",
|
||||||
"ms": "Euro",
|
"ms": "Euro",
|
||||||
@@ -2759,7 +2759,7 @@
|
|||||||
"pa": "ਜਪਾਨੀ ਯੈੱਨ",
|
"pa": "ਜਪਾਨੀ ਯੈੱਨ",
|
||||||
"pl": "jen",
|
"pl": "jen",
|
||||||
"pt": "iene",
|
"pt": "iene",
|
||||||
"ro": "yeni",
|
"ro": "yen",
|
||||||
"ru": "японская иена",
|
"ru": "японская иена",
|
||||||
"sk": "jen",
|
"sk": "jen",
|
||||||
"sl": "japonski jen",
|
"sl": "japonski jen",
|
||||||
@@ -3337,6 +3337,7 @@
|
|||||||
"fi": "Libyan dinaari",
|
"fi": "Libyan dinaari",
|
||||||
"fr": "dinar libyen",
|
"fr": "dinar libyen",
|
||||||
"ga": "dinar na Libia",
|
"ga": "dinar na Libia",
|
||||||
|
"gl": "dinar libio",
|
||||||
"he": "דינר לובי ",
|
"he": "דינר לובי ",
|
||||||
"hr": "Libijski dinar",
|
"hr": "Libijski dinar",
|
||||||
"hu": "líbiai dinár",
|
"hu": "líbiai dinár",
|
||||||
@@ -3539,6 +3540,7 @@
|
|||||||
"ja": "チャット",
|
"ja": "チャット",
|
||||||
"ko": "미얀마 짯",
|
"ko": "미얀마 짯",
|
||||||
"lt": "Kijatas",
|
"lt": "Kijatas",
|
||||||
|
"lv": "Kjats",
|
||||||
"ml": "ബർമ്മീസ് ക്യാറ്റ്",
|
"ml": "ബർമ്മീസ് ക്യാറ്റ്",
|
||||||
"nl": "Myanmarese kyat",
|
"nl": "Myanmarese kyat",
|
||||||
"oc": "Kyat",
|
"oc": "Kyat",
|
||||||
@@ -4310,7 +4312,7 @@
|
|||||||
"ar": "بيسو فلبيني",
|
"ar": "بيسو فلبيني",
|
||||||
"bg": "Филипинско песо",
|
"bg": "Филипинско песо",
|
||||||
"ca": "peso filipí",
|
"ca": "peso filipí",
|
||||||
"cs": "Filipínské peso",
|
"cs": "filipínské peso",
|
||||||
"de": "philippinischer Peso",
|
"de": "philippinischer Peso",
|
||||||
"en": "Philippine peso",
|
"en": "Philippine peso",
|
||||||
"eo": "filipina peso",
|
"eo": "filipina peso",
|
||||||
@@ -4614,7 +4616,7 @@
|
|||||||
"fi": "Serbian dinaari",
|
"fi": "Serbian dinaari",
|
||||||
"fr": "dinar serbe",
|
"fr": "dinar serbe",
|
||||||
"ga": "Dinar na Seirbia",
|
"ga": "Dinar na Seirbia",
|
||||||
"gl": "Dinar serbio",
|
"gl": "dinar serbio",
|
||||||
"he": "דינר סרבי",
|
"he": "דינר סרבי",
|
||||||
"hr": "srpski dinar",
|
"hr": "srpski dinar",
|
||||||
"hu": "szerb dinár",
|
"hu": "szerb dinár",
|
||||||
@@ -5331,7 +5333,7 @@
|
|||||||
"pa": "ਤਾਜਿਕਿਸਤਾਨੀ ਸੋਮੋਨੀ",
|
"pa": "ਤਾਜਿਕਿਸਤਾਨੀ ਸੋਮੋਨੀ",
|
||||||
"pl": "Somoni",
|
"pl": "Somoni",
|
||||||
"pt": "Somoni",
|
"pt": "Somoni",
|
||||||
"ro": "Somoni tadjic",
|
"ro": "somoni tadjic",
|
||||||
"ru": "таджикский сомони",
|
"ru": "таджикский сомони",
|
||||||
"sk": "tadžický som",
|
"sk": "tadžický som",
|
||||||
"sl": "tadžikistanski somoni",
|
"sl": "tadžikistanski somoni",
|
||||||
@@ -5394,6 +5396,7 @@
|
|||||||
"fi": "Tunisian dinaari",
|
"fi": "Tunisian dinaari",
|
||||||
"fr": "dinar tunisien",
|
"fr": "dinar tunisien",
|
||||||
"ga": "dinar na Túinéise",
|
"ga": "dinar na Túinéise",
|
||||||
|
"gl": "dinar tunisiano",
|
||||||
"he": "דינר תוניסאי",
|
"he": "דינר תוניסאי",
|
||||||
"hr": "tuniski dinar",
|
"hr": "tuniski dinar",
|
||||||
"hu": "tunéziai dinár",
|
"hu": "tunéziai dinár",
|
||||||
@@ -5766,7 +5769,7 @@
|
|||||||
"fi": "Uruguayn peso",
|
"fi": "Uruguayn peso",
|
||||||
"fr": "peso uruguayen",
|
"fr": "peso uruguayen",
|
||||||
"ga": "peso Uragua",
|
"ga": "peso Uragua",
|
||||||
"gl": "Peso uruguaio",
|
"gl": "peso uruguaio",
|
||||||
"he": "פסו של אורוגוואי",
|
"he": "פסו של אורוגוואי",
|
||||||
"hr": "Urugvajski pezo",
|
"hr": "Urugvajski pezo",
|
||||||
"hu": "uruguayi peso",
|
"hu": "uruguayi peso",
|
||||||
@@ -6147,7 +6150,7 @@
|
|||||||
"oc": "Drechs de tiratge Especials",
|
"oc": "Drechs de tiratge Especials",
|
||||||
"pl": "specjalne prawa ciągnienia",
|
"pl": "specjalne prawa ciągnienia",
|
||||||
"pt": "direitos especiais de saque",
|
"pt": "direitos especiais de saque",
|
||||||
"ro": "Drepturi speciale de tragere",
|
"ro": "drepturi speciale de tragere",
|
||||||
"ru": "специальные права заимствования",
|
"ru": "специальные права заимствования",
|
||||||
"sk": "Zvláštne práva čerpania",
|
"sk": "Zvláštne práva čerpania",
|
||||||
"sl": "posebne pravice črpanja",
|
"sl": "posebne pravice črpanja",
|
||||||
@@ -6225,6 +6228,7 @@
|
|||||||
"ja": "CFPフラン",
|
"ja": "CFPフラン",
|
||||||
"ko": "CFP 프랑",
|
"ko": "CFP 프랑",
|
||||||
"lt": "CFP frankas",
|
"lt": "CFP frankas",
|
||||||
|
"lv": "Klusā okeāna franks",
|
||||||
"ms": "Franc CFP",
|
"ms": "Franc CFP",
|
||||||
"nl": "CFP-frank",
|
"nl": "CFP-frank",
|
||||||
"oc": "Franc CFP",
|
"oc": "Franc CFP",
|
||||||
@@ -7055,6 +7059,7 @@
|
|||||||
"bolivjano": "BOB",
|
"bolivjano": "BOB",
|
||||||
"bolivya bolivianosu": "BOB",
|
"bolivya bolivianosu": "BOB",
|
||||||
"bolivya bolivyanosu": "BOB",
|
"bolivya bolivyanosu": "BOB",
|
||||||
|
"boliwiano": "BOB",
|
||||||
"bolívar digital": "VED",
|
"bolívar digital": "VED",
|
||||||
"bolívar soberano": "VES",
|
"bolívar soberano": "VES",
|
||||||
"bolívar sobirà": "VES",
|
"bolívar sobirà": "VES",
|
||||||
@@ -8425,6 +8430,7 @@
|
|||||||
"drame arménio": "AMD",
|
"drame arménio": "AMD",
|
||||||
"dramm": "AMD",
|
"dramm": "AMD",
|
||||||
"drechs de tiratge especials": "XDR",
|
"drechs de tiratge especials": "XDR",
|
||||||
|
"drept special de tragere": "XDR",
|
||||||
"drepturi speciale de tragere": "XDR",
|
"drepturi speciale de tragere": "XDR",
|
||||||
"drets especials de gir": "XDR",
|
"drets especials de gir": "XDR",
|
||||||
"droits de tirage speciaux": "XDR",
|
"droits de tirage speciaux": "XDR",
|
||||||
@@ -9518,6 +9524,8 @@
|
|||||||
"kíp lào": "LAK",
|
"kíp lào": "LAK",
|
||||||
"kīp": "LAK",
|
"kīp": "LAK",
|
||||||
"kjat": "MMK",
|
"kjat": "MMK",
|
||||||
|
"kjats": "MMK",
|
||||||
|
"klusā okeāna franks": "XPF",
|
||||||
"km": "BAM",
|
"km": "BAM",
|
||||||
"kmf": "KMF",
|
"kmf": "KMF",
|
||||||
"koeweitse dinar": "KWD",
|
"koeweitse dinar": "KWD",
|
||||||
@@ -10023,6 +10031,7 @@
|
|||||||
"lire sterline": "GBP",
|
"lire sterline": "GBP",
|
||||||
"lire turque": "TRY",
|
"lire turque": "TRY",
|
||||||
"lisente": "LSL",
|
"lisente": "LSL",
|
||||||
|
"list of syrian coins": "SYP",
|
||||||
"liura de gibartar": "GIP",
|
"liura de gibartar": "GIP",
|
||||||
"liura egipciana": "EGP",
|
"liura egipciana": "EGP",
|
||||||
"liura esterlina": "GBP",
|
"liura esterlina": "GBP",
|
||||||
@@ -11313,7 +11322,6 @@
|
|||||||
"riel camboxano": "KHR",
|
"riel camboxano": "KHR",
|
||||||
"riel camboyano": "KHR",
|
"riel camboyano": "KHR",
|
||||||
"riel campuchia": "KHR",
|
"riel campuchia": "KHR",
|
||||||
"riel kambodżański": "KHR",
|
|
||||||
"riel kamboja": "KHR",
|
"riel kamboja": "KHR",
|
||||||
"riel na cambóide": "KHR",
|
"riel na cambóide": "KHR",
|
||||||
"rietumāfrikas franks": "XOF",
|
"rietumāfrikas franks": "XOF",
|
||||||
@@ -12257,6 +12265,7 @@
|
|||||||
"thaise baht": "THB",
|
"thaise baht": "THB",
|
||||||
"thajský baht": "THB",
|
"thajský baht": "THB",
|
||||||
"thb": "THB",
|
"thb": "THB",
|
||||||
|
"the australian dollar": "AUD",
|
||||||
"thebe": "BWP",
|
"thebe": "BWP",
|
||||||
"third belarusian ruble": "BYN",
|
"third belarusian ruble": "BYN",
|
||||||
"tical": "THB",
|
"tical": "THB",
|
||||||
@@ -12740,6 +12749,7 @@
|
|||||||
"yen": "JPY",
|
"yen": "JPY",
|
||||||
"yen giapponese": "JPY",
|
"yen giapponese": "JPY",
|
||||||
"yen japones": "JPY",
|
"yen japones": "JPY",
|
||||||
|
"yen japonez": "JPY",
|
||||||
"yen japonés": "JPY",
|
"yen japonés": "JPY",
|
||||||
"yeni": "JPY",
|
"yeni": "JPY",
|
||||||
"yeni i̇srail şekeli": "ILS",
|
"yeni i̇srail şekeli": "ILS",
|
||||||
@@ -12806,7 +12816,6 @@
|
|||||||
"zimbabwe zig": "ZWG",
|
"zimbabwe zig": "ZWG",
|
||||||
"zimbabwean dollar": "ZWL",
|
"zimbabwean dollar": "ZWL",
|
||||||
"zimbabwean gold": "ZWG",
|
"zimbabwean gold": "ZWG",
|
||||||
"zimbabwean zig": "ZWG",
|
|
||||||
"zimbabwen kulta": "ZWG",
|
"zimbabwen kulta": "ZWG",
|
||||||
"zimbabwiansky zlatý": "ZWG",
|
"zimbabwiansky zlatý": "ZWG",
|
||||||
"zimbabwský dolar": "ZWL",
|
"zimbabwský dolar": "ZWL",
|
||||||
@@ -12965,6 +12974,7 @@
|
|||||||
"FKP",
|
"FKP",
|
||||||
"EGP"
|
"EGP"
|
||||||
],
|
],
|
||||||
|
"£S": "SYP",
|
||||||
"£e": "EGP",
|
"£e": "EGP",
|
||||||
"£s": "SYP",
|
"£s": "SYP",
|
||||||
"¥": [
|
"¥": [
|
||||||
@@ -14959,6 +14969,8 @@
|
|||||||
"فورنت مجري": "HUF",
|
"فورنت مجري": "HUF",
|
||||||
"فورينت مجري": "HUF",
|
"فورينت مجري": "HUF",
|
||||||
"فِرَنْكٌ رُوَنْدِيٌّ": "RWF",
|
"فِرَنْكٌ رُوَنْدِيٌّ": "RWF",
|
||||||
|
"قائمة النقود المعدنية السورية": "SYP",
|
||||||
|
"قائمة عملات سوريا المعدنية": "SYP",
|
||||||
"ك": "KWD",
|
"ك": "KWD",
|
||||||
"كتزال غواتيمالي": "GTQ",
|
"كتزال غواتيمالي": "GTQ",
|
||||||
"كرونة آيسلندية": "ISK",
|
"كرونة آيسلندية": "ISK",
|
||||||
|
|||||||
@@ -6544,6 +6544,103 @@
|
|||||||
"to-TO": "to"
|
"to-TO": "to"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"neosearch": {
|
||||||
|
"all_locale": null,
|
||||||
|
"custom": {
|
||||||
|
"countrycodes": [
|
||||||
|
"AE",
|
||||||
|
"AM",
|
||||||
|
"AR",
|
||||||
|
"AT",
|
||||||
|
"AU",
|
||||||
|
"AZ",
|
||||||
|
"BE",
|
||||||
|
"BG",
|
||||||
|
"BH",
|
||||||
|
"BO",
|
||||||
|
"BR",
|
||||||
|
"BY",
|
||||||
|
"CA",
|
||||||
|
"CH",
|
||||||
|
"CL",
|
||||||
|
"CN",
|
||||||
|
"CO",
|
||||||
|
"CY",
|
||||||
|
"CZ",
|
||||||
|
"DE",
|
||||||
|
"DK",
|
||||||
|
"DZ",
|
||||||
|
"EC",
|
||||||
|
"EE",
|
||||||
|
"EG",
|
||||||
|
"ES",
|
||||||
|
"FI",
|
||||||
|
"FR",
|
||||||
|
"GB",
|
||||||
|
"GE",
|
||||||
|
"GH",
|
||||||
|
"GR",
|
||||||
|
"HK",
|
||||||
|
"HR",
|
||||||
|
"HU",
|
||||||
|
"ID",
|
||||||
|
"IE",
|
||||||
|
"IL",
|
||||||
|
"IN",
|
||||||
|
"IT",
|
||||||
|
"JO",
|
||||||
|
"JP",
|
||||||
|
"KE",
|
||||||
|
"KG",
|
||||||
|
"KR",
|
||||||
|
"KW",
|
||||||
|
"KZ",
|
||||||
|
"LB",
|
||||||
|
"LT",
|
||||||
|
"LU",
|
||||||
|
"LV",
|
||||||
|
"MA",
|
||||||
|
"MD",
|
||||||
|
"MT",
|
||||||
|
"MX",
|
||||||
|
"MY",
|
||||||
|
"NG",
|
||||||
|
"NL",
|
||||||
|
"NO",
|
||||||
|
"NZ",
|
||||||
|
"OM",
|
||||||
|
"PE",
|
||||||
|
"PH",
|
||||||
|
"PL",
|
||||||
|
"PT",
|
||||||
|
"PY",
|
||||||
|
"QA",
|
||||||
|
"RO",
|
||||||
|
"RU",
|
||||||
|
"SA",
|
||||||
|
"SE",
|
||||||
|
"SG",
|
||||||
|
"SI",
|
||||||
|
"SK",
|
||||||
|
"TH",
|
||||||
|
"TJ",
|
||||||
|
"TM",
|
||||||
|
"TN",
|
||||||
|
"TR",
|
||||||
|
"TW",
|
||||||
|
"UA",
|
||||||
|
"US",
|
||||||
|
"UY",
|
||||||
|
"UZ",
|
||||||
|
"VE",
|
||||||
|
"VN",
|
||||||
|
"ZA"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data_type": "traits_v1",
|
||||||
|
"languages": {},
|
||||||
|
"regions": {}
|
||||||
|
},
|
||||||
"odysee": {
|
"odysee": {
|
||||||
"all_locale": null,
|
"all_locale": null,
|
||||||
"custom": {},
|
"custom": {},
|
||||||
@@ -7165,7 +7262,6 @@
|
|||||||
"IR",
|
"IR",
|
||||||
"IS",
|
"IS",
|
||||||
"IT",
|
"IT",
|
||||||
"JE",
|
|
||||||
"JM",
|
"JM",
|
||||||
"JO",
|
"JO",
|
||||||
"JP",
|
"JP",
|
||||||
@@ -7195,7 +7291,6 @@
|
|||||||
"MC",
|
"MC",
|
||||||
"MD",
|
"MD",
|
||||||
"ME",
|
"ME",
|
||||||
"MF",
|
|
||||||
"MG",
|
"MG",
|
||||||
"MH",
|
"MH",
|
||||||
"MK",
|
"MK",
|
||||||
@@ -7262,7 +7357,6 @@
|
|||||||
"SS",
|
"SS",
|
||||||
"ST",
|
"ST",
|
||||||
"SV",
|
"SV",
|
||||||
"SX",
|
|
||||||
"SY",
|
"SY",
|
||||||
"SZ",
|
"SZ",
|
||||||
"TC",
|
"TC",
|
||||||
@@ -7410,7 +7504,6 @@
|
|||||||
"th": "thai",
|
"th": "thai",
|
||||||
"ti": "tigrinya",
|
"ti": "tigrinya",
|
||||||
"tk": "turkmen",
|
"tk": "turkmen",
|
||||||
"to": "tonga",
|
|
||||||
"tr": "turkish",
|
"tr": "turkish",
|
||||||
"tt": "tatar",
|
"tt": "tatar",
|
||||||
"uk": "ukrainian",
|
"uk": "ukrainian",
|
||||||
@@ -7691,22 +7784,460 @@
|
|||||||
"all_locale": null,
|
"all_locale": null,
|
||||||
"custom": {},
|
"custom": {},
|
||||||
"data_type": "traits_v1",
|
"data_type": "traits_v1",
|
||||||
"languages": {},
|
"languages": {
|
||||||
"regions": {}
|
"af": "afrikaans",
|
||||||
|
"am": "amharic",
|
||||||
|
"ar": "arabic",
|
||||||
|
"az": "azerbaijani",
|
||||||
|
"be": "belarusian",
|
||||||
|
"bg": "bulgarian",
|
||||||
|
"bn": "bengali",
|
||||||
|
"bs": "bosnian",
|
||||||
|
"ca": "catalan",
|
||||||
|
"cs": "czech",
|
||||||
|
"cy": "welsh",
|
||||||
|
"da": "dansk",
|
||||||
|
"de": "deutsch",
|
||||||
|
"el": "greek",
|
||||||
|
"en": "english",
|
||||||
|
"eo": "esperanto",
|
||||||
|
"es": "espanol",
|
||||||
|
"et": "estonian",
|
||||||
|
"eu": "basque",
|
||||||
|
"fa": "persian",
|
||||||
|
"fi": "suomi",
|
||||||
|
"fo": "faroese",
|
||||||
|
"fr": "francais",
|
||||||
|
"fy": "frisian",
|
||||||
|
"ga": "irish",
|
||||||
|
"gd": "gaelic",
|
||||||
|
"gl": "galician",
|
||||||
|
"gu": "gujarati",
|
||||||
|
"he": "hebrew",
|
||||||
|
"hi": "hindi",
|
||||||
|
"hr": "croatian",
|
||||||
|
"hu": "hungarian",
|
||||||
|
"ia": "interlingua",
|
||||||
|
"id": "indonesian",
|
||||||
|
"is": "icelandic",
|
||||||
|
"it": "italiano",
|
||||||
|
"ja": "nihongo",
|
||||||
|
"jv": "javanese",
|
||||||
|
"ka": "georgian",
|
||||||
|
"kn": "kannada",
|
||||||
|
"ko": "hangul",
|
||||||
|
"la": "latin",
|
||||||
|
"lt": "lithuanian",
|
||||||
|
"lv": "latvian",
|
||||||
|
"mai": "bihari",
|
||||||
|
"mk": "macedonian",
|
||||||
|
"ml": "malayalam",
|
||||||
|
"mr": "marathi",
|
||||||
|
"ms": "malay",
|
||||||
|
"mt": "maltese",
|
||||||
|
"nb": "norsk",
|
||||||
|
"ne": "nepali",
|
||||||
|
"nl": "nederlands",
|
||||||
|
"oc": "occitan",
|
||||||
|
"pa": "punjabi",
|
||||||
|
"pl": "polski",
|
||||||
|
"pt": "portugues",
|
||||||
|
"pt_BR": "brazilian",
|
||||||
|
"ro": "romanian",
|
||||||
|
"ru": "russian",
|
||||||
|
"si": "sinhalese",
|
||||||
|
"sk": "slovak",
|
||||||
|
"sl": "slovenian",
|
||||||
|
"sq": "albanian",
|
||||||
|
"sr": "serbian",
|
||||||
|
"su": "sudanese",
|
||||||
|
"sv": "svenska",
|
||||||
|
"sw": "swahili",
|
||||||
|
"ta": "tamil",
|
||||||
|
"te": "telugu",
|
||||||
|
"th": "thai",
|
||||||
|
"ti": "tigrinya",
|
||||||
|
"tl": "tagalog",
|
||||||
|
"tr": "turkce",
|
||||||
|
"uk": "ukrainian",
|
||||||
|
"ur": "urdu",
|
||||||
|
"uz": "uzbek",
|
||||||
|
"vi": "vietnamese",
|
||||||
|
"xh": "xhosa",
|
||||||
|
"zh": "jiantizhongwen",
|
||||||
|
"zh_Hant": "fantizhengwen",
|
||||||
|
"zu": "zulu"
|
||||||
|
},
|
||||||
|
"regions": {
|
||||||
|
"ar-EG": "ar_EG",
|
||||||
|
"bg-BG": "bg_BG",
|
||||||
|
"ca-ES": "ca_ES",
|
||||||
|
"cs-CZ": "cs_CZ",
|
||||||
|
"da-DK": "da_DK",
|
||||||
|
"de-AT": "de_AT",
|
||||||
|
"de-CH": "de_CH",
|
||||||
|
"de-DE": "de_DE",
|
||||||
|
"el-GR": "el_GR",
|
||||||
|
"en-AU": "en_AU",
|
||||||
|
"en-CA": "en_CA",
|
||||||
|
"en-GB": "en-GB_GB",
|
||||||
|
"en-ID": "en_ID",
|
||||||
|
"en-IE": "en_IE",
|
||||||
|
"en-IN": "en_IN",
|
||||||
|
"en-MY": "en_MY",
|
||||||
|
"en-NZ": "en_NZ",
|
||||||
|
"en-PH": "en_PH",
|
||||||
|
"en-SG": "en_SG",
|
||||||
|
"en-US": "en_US",
|
||||||
|
"en-ZA": "en_ZA",
|
||||||
|
"es-AR": "es_AR",
|
||||||
|
"es-CL": "es_CL",
|
||||||
|
"es-CO": "es_CO",
|
||||||
|
"es-ES": "es_ES",
|
||||||
|
"es-MX": "es_MX",
|
||||||
|
"es-PE": "es_PE",
|
||||||
|
"es-US": "es_US",
|
||||||
|
"es-UY": "es_UY",
|
||||||
|
"es-VE": "es_VE",
|
||||||
|
"et-EE": "et_EE",
|
||||||
|
"fi-FI": "fi_FI",
|
||||||
|
"fil-PH": "fil_PH",
|
||||||
|
"fr-BE": "fr_BE",
|
||||||
|
"fr-CA": "fr_CA",
|
||||||
|
"fr-CH": "fr_CH",
|
||||||
|
"fr-FR": "fr_FR",
|
||||||
|
"hi-IN": "hi_IN",
|
||||||
|
"hu-HU": "hu_HU",
|
||||||
|
"id-ID": "id_ID",
|
||||||
|
"it-CH": "it_CH",
|
||||||
|
"it-IT": "it_IT",
|
||||||
|
"ja-JP": "ja_JP",
|
||||||
|
"ko-KR": "ko_KR",
|
||||||
|
"ms-MY": "ms_MY",
|
||||||
|
"ms-SG": "ms_SG",
|
||||||
|
"nb-NO": "no_NO",
|
||||||
|
"nl-BE": "nl_BE",
|
||||||
|
"nl-NL": "nl_NL",
|
||||||
|
"pl-PL": "pl_PL",
|
||||||
|
"pt-BR": "pt-BR_BR",
|
||||||
|
"pt-PT": "pt_PT",
|
||||||
|
"ro-RO": "ro_RO",
|
||||||
|
"ru-BY": "ru_BY",
|
||||||
|
"ru-RU": "ru_RU",
|
||||||
|
"sv-SE": "sv_SE",
|
||||||
|
"tr-TR": "tr_TR",
|
||||||
|
"uk-UA": "uk_UA",
|
||||||
|
"vi-VN": "vi_VN",
|
||||||
|
"zh-CN": "zh-CN_CN",
|
||||||
|
"zh-HK": "zh-TW_HK",
|
||||||
|
"zh-TW": "zh-TW_TW"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"startpage images": {
|
"startpage images": {
|
||||||
"all_locale": null,
|
"all_locale": null,
|
||||||
"custom": {},
|
"custom": {},
|
||||||
"data_type": "traits_v1",
|
"data_type": "traits_v1",
|
||||||
"languages": {},
|
"languages": {
|
||||||
"regions": {}
|
"af": "afrikaans",
|
||||||
|
"am": "amharic",
|
||||||
|
"ar": "arabic",
|
||||||
|
"az": "azerbaijani",
|
||||||
|
"be": "belarusian",
|
||||||
|
"bg": "bulgarian",
|
||||||
|
"bn": "bengali",
|
||||||
|
"bs": "bosnian",
|
||||||
|
"ca": "catalan",
|
||||||
|
"cs": "czech",
|
||||||
|
"cy": "welsh",
|
||||||
|
"da": "dansk",
|
||||||
|
"de": "deutsch",
|
||||||
|
"el": "greek",
|
||||||
|
"en": "english",
|
||||||
|
"eo": "esperanto",
|
||||||
|
"es": "espanol",
|
||||||
|
"et": "estonian",
|
||||||
|
"eu": "basque",
|
||||||
|
"fa": "persian",
|
||||||
|
"fi": "suomi",
|
||||||
|
"fo": "faroese",
|
||||||
|
"fr": "francais",
|
||||||
|
"fy": "frisian",
|
||||||
|
"ga": "irish",
|
||||||
|
"gd": "gaelic",
|
||||||
|
"gl": "galician",
|
||||||
|
"gu": "gujarati",
|
||||||
|
"he": "hebrew",
|
||||||
|
"hi": "hindi",
|
||||||
|
"hr": "croatian",
|
||||||
|
"hu": "hungarian",
|
||||||
|
"ia": "interlingua",
|
||||||
|
"id": "indonesian",
|
||||||
|
"is": "icelandic",
|
||||||
|
"it": "italiano",
|
||||||
|
"ja": "nihongo",
|
||||||
|
"jv": "javanese",
|
||||||
|
"ka": "georgian",
|
||||||
|
"kn": "kannada",
|
||||||
|
"ko": "hangul",
|
||||||
|
"la": "latin",
|
||||||
|
"lt": "lithuanian",
|
||||||
|
"lv": "latvian",
|
||||||
|
"mai": "bihari",
|
||||||
|
"mk": "macedonian",
|
||||||
|
"ml": "malayalam",
|
||||||
|
"mr": "marathi",
|
||||||
|
"ms": "malay",
|
||||||
|
"mt": "maltese",
|
||||||
|
"nb": "norsk",
|
||||||
|
"ne": "nepali",
|
||||||
|
"nl": "nederlands",
|
||||||
|
"oc": "occitan",
|
||||||
|
"pa": "punjabi",
|
||||||
|
"pl": "polski",
|
||||||
|
"pt": "portugues",
|
||||||
|
"pt_BR": "brazilian",
|
||||||
|
"ro": "romanian",
|
||||||
|
"ru": "russian",
|
||||||
|
"si": "sinhalese",
|
||||||
|
"sk": "slovak",
|
||||||
|
"sl": "slovenian",
|
||||||
|
"sq": "albanian",
|
||||||
|
"sr": "serbian",
|
||||||
|
"su": "sudanese",
|
||||||
|
"sv": "svenska",
|
||||||
|
"sw": "swahili",
|
||||||
|
"ta": "tamil",
|
||||||
|
"te": "telugu",
|
||||||
|
"th": "thai",
|
||||||
|
"ti": "tigrinya",
|
||||||
|
"tl": "tagalog",
|
||||||
|
"tr": "turkce",
|
||||||
|
"uk": "ukrainian",
|
||||||
|
"ur": "urdu",
|
||||||
|
"uz": "uzbek",
|
||||||
|
"vi": "vietnamese",
|
||||||
|
"xh": "xhosa",
|
||||||
|
"zh": "jiantizhongwen",
|
||||||
|
"zh_Hant": "fantizhengwen",
|
||||||
|
"zu": "zulu"
|
||||||
|
},
|
||||||
|
"regions": {
|
||||||
|
"ar-EG": "ar_EG",
|
||||||
|
"bg-BG": "bg_BG",
|
||||||
|
"ca-ES": "ca_ES",
|
||||||
|
"cs-CZ": "cs_CZ",
|
||||||
|
"da-DK": "da_DK",
|
||||||
|
"de-AT": "de_AT",
|
||||||
|
"de-CH": "de_CH",
|
||||||
|
"de-DE": "de_DE",
|
||||||
|
"el-GR": "el_GR",
|
||||||
|
"en-AU": "en_AU",
|
||||||
|
"en-CA": "en_CA",
|
||||||
|
"en-GB": "en-GB_GB",
|
||||||
|
"en-ID": "en_ID",
|
||||||
|
"en-IE": "en_IE",
|
||||||
|
"en-IN": "en_IN",
|
||||||
|
"en-MY": "en_MY",
|
||||||
|
"en-NZ": "en_NZ",
|
||||||
|
"en-PH": "en_PH",
|
||||||
|
"en-SG": "en_SG",
|
||||||
|
"en-US": "en_US",
|
||||||
|
"en-ZA": "en_ZA",
|
||||||
|
"es-AR": "es_AR",
|
||||||
|
"es-CL": "es_CL",
|
||||||
|
"es-CO": "es_CO",
|
||||||
|
"es-ES": "es_ES",
|
||||||
|
"es-MX": "es_MX",
|
||||||
|
"es-PE": "es_PE",
|
||||||
|
"es-US": "es_US",
|
||||||
|
"es-UY": "es_UY",
|
||||||
|
"es-VE": "es_VE",
|
||||||
|
"et-EE": "et_EE",
|
||||||
|
"fi-FI": "fi_FI",
|
||||||
|
"fil-PH": "fil_PH",
|
||||||
|
"fr-BE": "fr_BE",
|
||||||
|
"fr-CA": "fr_CA",
|
||||||
|
"fr-CH": "fr_CH",
|
||||||
|
"fr-FR": "fr_FR",
|
||||||
|
"hi-IN": "hi_IN",
|
||||||
|
"hu-HU": "hu_HU",
|
||||||
|
"id-ID": "id_ID",
|
||||||
|
"it-CH": "it_CH",
|
||||||
|
"it-IT": "it_IT",
|
||||||
|
"ja-JP": "ja_JP",
|
||||||
|
"ko-KR": "ko_KR",
|
||||||
|
"ms-MY": "ms_MY",
|
||||||
|
"ms-SG": "ms_SG",
|
||||||
|
"nb-NO": "no_NO",
|
||||||
|
"nl-BE": "nl_BE",
|
||||||
|
"nl-NL": "nl_NL",
|
||||||
|
"pl-PL": "pl_PL",
|
||||||
|
"pt-BR": "pt-BR_BR",
|
||||||
|
"pt-PT": "pt_PT",
|
||||||
|
"ro-RO": "ro_RO",
|
||||||
|
"ru-BY": "ru_BY",
|
||||||
|
"ru-RU": "ru_RU",
|
||||||
|
"sv-SE": "sv_SE",
|
||||||
|
"tr-TR": "tr_TR",
|
||||||
|
"uk-UA": "uk_UA",
|
||||||
|
"vi-VN": "vi_VN",
|
||||||
|
"zh-CN": "zh-CN_CN",
|
||||||
|
"zh-HK": "zh-TW_HK",
|
||||||
|
"zh-TW": "zh-TW_TW"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"startpage news": {
|
"startpage news": {
|
||||||
"all_locale": null,
|
"all_locale": null,
|
||||||
"custom": {},
|
"custom": {},
|
||||||
"data_type": "traits_v1",
|
"data_type": "traits_v1",
|
||||||
"languages": {},
|
"languages": {
|
||||||
"regions": {}
|
"af": "afrikaans",
|
||||||
|
"am": "amharic",
|
||||||
|
"ar": "arabic",
|
||||||
|
"az": "azerbaijani",
|
||||||
|
"be": "belarusian",
|
||||||
|
"bg": "bulgarian",
|
||||||
|
"bn": "bengali",
|
||||||
|
"bs": "bosnian",
|
||||||
|
"ca": "catalan",
|
||||||
|
"cs": "czech",
|
||||||
|
"cy": "welsh",
|
||||||
|
"da": "dansk",
|
||||||
|
"de": "deutsch",
|
||||||
|
"el": "greek",
|
||||||
|
"en": "english",
|
||||||
|
"eo": "esperanto",
|
||||||
|
"es": "espanol",
|
||||||
|
"et": "estonian",
|
||||||
|
"eu": "basque",
|
||||||
|
"fa": "persian",
|
||||||
|
"fi": "suomi",
|
||||||
|
"fo": "faroese",
|
||||||
|
"fr": "francais",
|
||||||
|
"fy": "frisian",
|
||||||
|
"ga": "irish",
|
||||||
|
"gd": "gaelic",
|
||||||
|
"gl": "galician",
|
||||||
|
"gu": "gujarati",
|
||||||
|
"he": "hebrew",
|
||||||
|
"hi": "hindi",
|
||||||
|
"hr": "croatian",
|
||||||
|
"hu": "hungarian",
|
||||||
|
"ia": "interlingua",
|
||||||
|
"id": "indonesian",
|
||||||
|
"is": "icelandic",
|
||||||
|
"it": "italiano",
|
||||||
|
"ja": "nihongo",
|
||||||
|
"jv": "javanese",
|
||||||
|
"ka": "georgian",
|
||||||
|
"kn": "kannada",
|
||||||
|
"ko": "hangul",
|
||||||
|
"la": "latin",
|
||||||
|
"lt": "lithuanian",
|
||||||
|
"lv": "latvian",
|
||||||
|
"mai": "bihari",
|
||||||
|
"mk": "macedonian",
|
||||||
|
"ml": "malayalam",
|
||||||
|
"mr": "marathi",
|
||||||
|
"ms": "malay",
|
||||||
|
"mt": "maltese",
|
||||||
|
"nb": "norsk",
|
||||||
|
"ne": "nepali",
|
||||||
|
"nl": "nederlands",
|
||||||
|
"oc": "occitan",
|
||||||
|
"pa": "punjabi",
|
||||||
|
"pl": "polski",
|
||||||
|
"pt": "portugues",
|
||||||
|
"pt_BR": "brazilian",
|
||||||
|
"ro": "romanian",
|
||||||
|
"ru": "russian",
|
||||||
|
"si": "sinhalese",
|
||||||
|
"sk": "slovak",
|
||||||
|
"sl": "slovenian",
|
||||||
|
"sq": "albanian",
|
||||||
|
"sr": "serbian",
|
||||||
|
"su": "sudanese",
|
||||||
|
"sv": "svenska",
|
||||||
|
"sw": "swahili",
|
||||||
|
"ta": "tamil",
|
||||||
|
"te": "telugu",
|
||||||
|
"th": "thai",
|
||||||
|
"ti": "tigrinya",
|
||||||
|
"tl": "tagalog",
|
||||||
|
"tr": "turkce",
|
||||||
|
"uk": "ukrainian",
|
||||||
|
"ur": "urdu",
|
||||||
|
"uz": "uzbek",
|
||||||
|
"vi": "vietnamese",
|
||||||
|
"xh": "xhosa",
|
||||||
|
"zh": "jiantizhongwen",
|
||||||
|
"zh_Hant": "fantizhengwen",
|
||||||
|
"zu": "zulu"
|
||||||
|
},
|
||||||
|
"regions": {
|
||||||
|
"ar-EG": "ar_EG",
|
||||||
|
"bg-BG": "bg_BG",
|
||||||
|
"ca-ES": "ca_ES",
|
||||||
|
"cs-CZ": "cs_CZ",
|
||||||
|
"da-DK": "da_DK",
|
||||||
|
"de-AT": "de_AT",
|
||||||
|
"de-CH": "de_CH",
|
||||||
|
"de-DE": "de_DE",
|
||||||
|
"el-GR": "el_GR",
|
||||||
|
"en-AU": "en_AU",
|
||||||
|
"en-CA": "en_CA",
|
||||||
|
"en-GB": "en-GB_GB",
|
||||||
|
"en-ID": "en_ID",
|
||||||
|
"en-IE": "en_IE",
|
||||||
|
"en-IN": "en_IN",
|
||||||
|
"en-MY": "en_MY",
|
||||||
|
"en-NZ": "en_NZ",
|
||||||
|
"en-PH": "en_PH",
|
||||||
|
"en-SG": "en_SG",
|
||||||
|
"en-US": "en_US",
|
||||||
|
"en-ZA": "en_ZA",
|
||||||
|
"es-AR": "es_AR",
|
||||||
|
"es-CL": "es_CL",
|
||||||
|
"es-CO": "es_CO",
|
||||||
|
"es-ES": "es_ES",
|
||||||
|
"es-MX": "es_MX",
|
||||||
|
"es-PE": "es_PE",
|
||||||
|
"es-US": "es_US",
|
||||||
|
"es-UY": "es_UY",
|
||||||
|
"es-VE": "es_VE",
|
||||||
|
"et-EE": "et_EE",
|
||||||
|
"fi-FI": "fi_FI",
|
||||||
|
"fil-PH": "fil_PH",
|
||||||
|
"fr-BE": "fr_BE",
|
||||||
|
"fr-CA": "fr_CA",
|
||||||
|
"fr-CH": "fr_CH",
|
||||||
|
"fr-FR": "fr_FR",
|
||||||
|
"hi-IN": "hi_IN",
|
||||||
|
"hu-HU": "hu_HU",
|
||||||
|
"id-ID": "id_ID",
|
||||||
|
"it-CH": "it_CH",
|
||||||
|
"it-IT": "it_IT",
|
||||||
|
"ja-JP": "ja_JP",
|
||||||
|
"ko-KR": "ko_KR",
|
||||||
|
"ms-MY": "ms_MY",
|
||||||
|
"ms-SG": "ms_SG",
|
||||||
|
"nb-NO": "no_NO",
|
||||||
|
"nl-BE": "nl_BE",
|
||||||
|
"nl-NL": "nl_NL",
|
||||||
|
"pl-PL": "pl_PL",
|
||||||
|
"pt-BR": "pt-BR_BR",
|
||||||
|
"pt-PT": "pt_PT",
|
||||||
|
"ro-RO": "ro_RO",
|
||||||
|
"ru-BY": "ru_BY",
|
||||||
|
"ru-RU": "ru_RU",
|
||||||
|
"sv-SE": "sv_SE",
|
||||||
|
"tr-TR": "tr_TR",
|
||||||
|
"uk-UA": "uk_UA",
|
||||||
|
"vi-VN": "vi_VN",
|
||||||
|
"zh-CN": "zh-CN_CN",
|
||||||
|
"zh-HK": "zh-TW_HK",
|
||||||
|
"zh-TW": "zh-TW_TW"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"wikidata": {
|
"wikidata": {
|
||||||
"all_locale": null,
|
"all_locale": null,
|
||||||
@@ -7960,7 +8491,6 @@
|
|||||||
"inh",
|
"inh",
|
||||||
"io",
|
"io",
|
||||||
"is",
|
"is",
|
||||||
"isv",
|
|
||||||
"it",
|
"it",
|
||||||
"iu",
|
"iu",
|
||||||
"ja",
|
"ja",
|
||||||
@@ -8009,7 +8539,6 @@
|
|||||||
"ltg",
|
"ltg",
|
||||||
"lv",
|
"lv",
|
||||||
"mad",
|
"mad",
|
||||||
"mag",
|
|
||||||
"mai",
|
"mai",
|
||||||
"map-bms",
|
"map-bms",
|
||||||
"mdf",
|
"mdf",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
|||||||
],
|
],
|
||||||
"ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}",
|
"ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}",
|
||||||
"versions": [
|
"versions": [
|
||||||
"151.0",
|
"152.0",
|
||||||
"150.0"
|
"151.0"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -3272,7 +3272,7 @@
|
|||||||
"Q128822": {
|
"Q128822": {
|
||||||
"si_name": "Q182429",
|
"si_name": "Q182429",
|
||||||
"symbol": "kn",
|
"symbol": "kn",
|
||||||
"to_si_factor": 0.5144444444444445
|
"to_si_factor": 0.514
|
||||||
},
|
},
|
||||||
"Q12912288": {
|
"Q12912288": {
|
||||||
"si_name": null,
|
"si_name": null,
|
||||||
|
|||||||
@@ -361,37 +361,43 @@ class Engine(abc.ABC): # pylint: disable=too-few-public-methods
|
|||||||
https: socks5://proxy:port
|
https: socks5://proxy:port
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def setup(self, engine_settings: dict[str, t.Any]) -> bool: # pylint: disable=unused-argument
|
def setup(self, engine_settings: dict[str, t.Any]) -> bool | None: # pylint: disable=unused-argument
|
||||||
"""Dynamic setup of the engine settings.
|
"""Dynamic setup of the engine settings.
|
||||||
|
|
||||||
With this method, the engine's setup is carried out. For example, to
|
With this method, the engine's setup is carried out. For example, to
|
||||||
check or dynamically adapt the values handed over in the parameter
|
check or dynamically adapt the values handed over in the parameter
|
||||||
``engine_settings``. The return value (True/False) indicates whether
|
``engine_settings``.
|
||||||
the setup was successful and the engine can be built or rejected.
|
|
||||||
|
|
||||||
The method is optional and is called synchronously as part of the
|
Whether the initialization was successful can be indicated by the return
|
||||||
|
value ``True`` or even ``False``.
|
||||||
|
|
||||||
|
- If no return value (``None`` ) is given from this method , this is
|
||||||
|
equivalent to ``True``.
|
||||||
|
|
||||||
|
- If an exception is thrown as part of the initialization, this is
|
||||||
|
equivalent to ``False``.
|
||||||
|
|
||||||
|
The method is optional and is called **synchronously** as part of the
|
||||||
initialization of the service and is therefore only suitable for simple
|
initialization of the service and is therefore only suitable for simple
|
||||||
(local) exams/changes at the engine setting. The :py:obj:`Engine.init`
|
(local) exams/changes at the engine setting.
|
||||||
method must be used for longer tasks in which values of a remote must be
|
|
||||||
determined, for example.
|
The :py:obj:`Engine.init` method must be used for longer tasks in which
|
||||||
|
values of a remote must be determined, for example.
|
||||||
"""
|
"""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def init(self, engine_settings: dict[str, t.Any]) -> bool | None: # pylint: disable=unused-argument
|
def init(self, engine_settings: dict[str, t.Any]) -> bool | None: # pylint: disable=unused-argument
|
||||||
"""Initialization of the engine.
|
"""Initialization of the engine.
|
||||||
|
|
||||||
The method is optional and asynchronous (in a thread). It is suitable,
|
The method is optional and called **asynchronous** (in a thread). The
|
||||||
for example, for setting up a cache (for the engine) or for querying
|
method is comparable to :py:obj:`Engine.setup`, it is suitable, for
|
||||||
values (required by the engine) from a remote.
|
caching data that first needs to be requested from a remote.
|
||||||
|
|
||||||
Whether the initialization was successful can be indicated by the return
|
The method is optional and runs **asynchronously** (in a thread), it is
|
||||||
value ``True`` or even ``False``.
|
comparable to :py:obj:`Engine.setup`. For instance, it is suitable for
|
||||||
|
caching data that first needs to be requested from a remote source.
|
||||||
|
|
||||||
- If no return value is given from this init method (``None``), this is
|
The evaluation of the return value is analogous to :py:obj:`Engine.setup`.
|
||||||
equivalent to ``True``.
|
|
||||||
|
|
||||||
- If an exception is thrown as part of the initialization, this is
|
|
||||||
equivalent to ``False``.
|
|
||||||
"""
|
"""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -269,21 +269,27 @@ def is_engine_active(engine: "Engine | types.ModuleType"):
|
|||||||
|
|
||||||
|
|
||||||
def call_engine_setup(engine: "Engine | types.ModuleType", engine_data: dict[str, t.Any]) -> bool:
|
def call_engine_setup(engine: "Engine | types.ModuleType", engine_data: dict[str, t.Any]) -> bool:
|
||||||
setup_ok = False
|
|
||||||
|
setup_ok: bool | None = False
|
||||||
setup_func = getattr(engine, "setup", None)
|
setup_func = getattr(engine, "setup", None)
|
||||||
|
|
||||||
if setup_func is None:
|
if setup_func is None:
|
||||||
setup_ok = True
|
setup_ok = True
|
||||||
elif not callable(setup_func):
|
elif not callable(setup_func):
|
||||||
logger.error("engine's setup method isn't a callable (is of type: %s)", type(setup_func))
|
logger.error(f"engine's setup method isn't a callable (is of type: {type(setup_func)})")
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
setup_ok = engine.setup(engine_data)
|
setup_ok = engine.setup(engine_data)
|
||||||
except Exception as e: # pylint: disable=broad-except
|
except Exception as e: # pylint: disable=broad-except
|
||||||
logger.exception('exception : {0}'.format(e))
|
logger.exception(f"(PID {os.getpid()}) {engine.name}: engine SETUP failed, exception: {e}")
|
||||||
|
setup_ok = False
|
||||||
|
|
||||||
|
# The evaluation of the return value is analogous to Engine.init
|
||||||
|
if setup_ok is None:
|
||||||
|
setup_ok = True
|
||||||
|
|
||||||
if not setup_ok:
|
if not setup_ok:
|
||||||
logger.error("%s: Engine setup was not successful, engine is set to inactive.", engine.name)
|
logger.error(f"(PID {os.getpid()}) {engine.name}: engine setup was not successful")
|
||||||
return setup_ok
|
return setup_ok
|
||||||
|
|
||||||
|
|
||||||
@@ -311,14 +317,16 @@ def load_engines(engine_list: list[dict[str, t.Any]]):
|
|||||||
for engine_data in engine_list:
|
for engine_data in engine_list:
|
||||||
if engine_data.get("inactive") is True:
|
if engine_data.get("inactive") is True:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
engine = load_engine(engine_data)
|
engine = load_engine(engine_data)
|
||||||
|
|
||||||
if engine:
|
if engine:
|
||||||
register_engine(engine)
|
register_engine(engine)
|
||||||
else:
|
else:
|
||||||
# if an engine can't be loaded (if for example the engine is missing
|
# if an engine can't be loaded (if for example the engine is missing
|
||||||
# tor or some other requirements) its set to inactive!
|
# tor or some other requirements) its set to inactive!
|
||||||
logger.error(
|
logger.error(
|
||||||
f"(PID {os.getpid()}) loading engine %s failed: set engine to inactive!", engine_data.get("name", "???")
|
f"(PID {os.getpid()}) {engine_data.get('name', '???')}: can't register engine (loading engine failed)"
|
||||||
)
|
)
|
||||||
engine_data["inactive"] = True
|
engine_data["inactive"] = True
|
||||||
return engines
|
return engines
|
||||||
|
|||||||
@@ -7,13 +7,17 @@
|
|||||||
# There exits a https://github.com/ohblue/baidu-serp-api/
|
# There exits a https://github.com/ohblue/baidu-serp-api/
|
||||||
# but we don't use it here (may we can learn from).
|
# but we don't use it here (may we can learn from).
|
||||||
|
|
||||||
|
import typing as t
|
||||||
|
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from html import unescape
|
from html import unescape
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from searx.exceptions import SearxEngineAPIException, SearxEngineCaptchaException
|
from searx.exceptions import SearxEngineAPIException, SearxEngineCaptchaException, SearxEngineAccessDeniedException
|
||||||
|
from searx.enginelib import EngineCache
|
||||||
|
from searx.network import get as http_get
|
||||||
from searx.utils import html_to_text
|
from searx.utils import html_to_text
|
||||||
|
|
||||||
about = {
|
about = {
|
||||||
@@ -35,6 +39,31 @@ baidu_category = 'general'
|
|||||||
time_range_support = True
|
time_range_support = True
|
||||||
time_range_dict = {"day": 86400, "week": 604800, "month": 2592000, "year": 31536000}
|
time_range_dict = {"day": 86400, "week": 604800, "month": 2592000, "year": 31536000}
|
||||||
|
|
||||||
|
image_base_url = "https://image.baidu.com/"
|
||||||
|
|
||||||
|
COOKIE_CACHE_KEY = "cookie"
|
||||||
|
COOKIE_CACHE_EXPIRATION_SECONDS = 3600
|
||||||
|
|
||||||
|
CACHE: EngineCache
|
||||||
|
"""Stores cookies from Baidu image search warmup."""
|
||||||
|
|
||||||
|
|
||||||
|
def setup(engine_settings: dict[str, t.Any]) -> bool:
|
||||||
|
global CACHE # pylint: disable=global-statement
|
||||||
|
CACHE = EngineCache(engine_settings["name"])
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def get_image_cookies(headers: dict[str, str]) -> dict[str, str]:
|
||||||
|
cookies: dict[str, str] | None = CACHE.get(COOKIE_CACHE_KEY)
|
||||||
|
if cookies:
|
||||||
|
return cookies
|
||||||
|
|
||||||
|
warmup = http_get(image_base_url, headers=headers, timeout=10)
|
||||||
|
cookies = dict(warmup.cookies.items())
|
||||||
|
CACHE.set(key=COOKIE_CACHE_KEY, value=cookies, expire=COOKIE_CACHE_EXPIRATION_SECONDS)
|
||||||
|
return cookies
|
||||||
|
|
||||||
|
|
||||||
def init(_):
|
def init(_):
|
||||||
if baidu_category not in ('general', 'images', 'it'):
|
if baidu_category not in ('general', 'images', 'it'):
|
||||||
@@ -88,6 +117,9 @@ def request(query, params):
|
|||||||
if baidu_category == 'it':
|
if baidu_category == 'it':
|
||||||
query_params["paramList"] += f",timestamp_range={past}-{now}"
|
query_params["paramList"] += f",timestamp_range={past}-{now}"
|
||||||
|
|
||||||
|
if baidu_category == 'images':
|
||||||
|
params["cookies"] = get_image_cookies(params["headers"])
|
||||||
|
|
||||||
params["url"] = f"{query_url}?{urlencode(query_params)}"
|
params["url"] = f"{query_url}?{urlencode(query_params)}"
|
||||||
params["allow_redirects"] = False
|
params["allow_redirects"] = False
|
||||||
return params
|
return params
|
||||||
@@ -103,6 +135,8 @@ def response(resp):
|
|||||||
# baidu's JSON encoder wrongly quotes / and ' characters by \\ and \'
|
# baidu's JSON encoder wrongly quotes / and ' characters by \\ and \'
|
||||||
text = text.replace(r"\/", "/").replace(r"\'", "'")
|
text = text.replace(r"\/", "/").replace(r"\'", "'")
|
||||||
data = json.loads(text, strict=False)
|
data = json.loads(text, strict=False)
|
||||||
|
if data.get("antiFlag") == 1:
|
||||||
|
raise SearxEngineAccessDeniedException(data.get("message", "Forbid spider access"))
|
||||||
parsers = {'general': parse_general, 'images': parse_images, 'it': parse_it}
|
parsers = {'general': parse_general, 'images': parse_images, 'it': parse_it}
|
||||||
|
|
||||||
return parsers[baidu_category](data)
|
return parsers[baidu_category](data)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import random
|
|||||||
import string
|
import string
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
from zoneinfo import ZoneInfo
|
||||||
|
|
||||||
from searx import utils
|
from searx import utils
|
||||||
|
|
||||||
@@ -39,6 +40,32 @@ cookie = {
|
|||||||
"home_feed_column": "4",
|
"home_feed_column": "4",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_CN_TZ = ZoneInfo("Asia/Shanghai")
|
||||||
|
|
||||||
|
# Calendar-day time filter (Asia/Shanghai); dict values are days to subtract from today.
|
||||||
|
time_range_support = True
|
||||||
|
time_range_dict = {"day": 0, "week": 6, "month": 29, "year": 364}
|
||||||
|
|
||||||
|
|
||||||
|
def _pubtime_range(time_range: str) -> tuple[int, int]:
|
||||||
|
"""Return ``(pubtime_begin_s, pubtime_end_s)`` for Bilibili's search API.
|
||||||
|
|
||||||
|
Time ranges follow Bilibili's website semantics: they are counted in
|
||||||
|
**calendar days** in China Standard Time (``Asia/Shanghai``), not as
|
||||||
|
sliding 24-hour windows. For example, ``day`` means from 00:00:00 to
|
||||||
|
23:59:59 of the current local day; ``week`` spans from 00:00:00 on the
|
||||||
|
calendar day six days ago through the end of today, and so on.
|
||||||
|
|
||||||
|
The returned Unix timestamps (seconds) map to Bilibili's
|
||||||
|
``pubtime_begin_s`` and ``pubtime_end_s`` query parameters.
|
||||||
|
"""
|
||||||
|
now = datetime.now(_CN_TZ)
|
||||||
|
pubtime_end_s = int(now.replace(hour=23, minute=59, second=59, microsecond=0).timestamp())
|
||||||
|
begin_day = now - timedelta(days=time_range_dict[time_range])
|
||||||
|
pubtime_begin_s = int(begin_day.replace(hour=0, minute=0, second=0, microsecond=0).timestamp())
|
||||||
|
|
||||||
|
return pubtime_begin_s, pubtime_end_s
|
||||||
|
|
||||||
|
|
||||||
def request(query, params):
|
def request(query, params):
|
||||||
query_params = {
|
query_params = {
|
||||||
@@ -50,6 +77,11 @@ def request(query, params):
|
|||||||
"search_type": "video",
|
"search_type": "video",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if params.get("time_range") in time_range_dict:
|
||||||
|
pubtime_begin_s, pubtime_end_s = _pubtime_range(params["time_range"])
|
||||||
|
query_params["pubtime_begin_s"] = pubtime_begin_s
|
||||||
|
query_params["pubtime_end_s"] = pubtime_end_s
|
||||||
|
|
||||||
params["url"] = f"{base_url}?{urlencode(query_params)}"
|
params["url"] = f"{base_url}?{urlencode(query_params)}"
|
||||||
params["headers"]["Referer"] = "https://www.bilibili.com/"
|
params["headers"]["Referer"] = "https://www.bilibili.com/"
|
||||||
params["headers"]["Accept"] = "application/json, text/javascript, */*; q=0.01"
|
params["headers"]["Accept"] = "application/json, text/javascript, */*; q=0.01"
|
||||||
|
|||||||
@@ -13,9 +13,13 @@ It seems to use Bing internally, as the image thumbnails are loaded from Bing.
|
|||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
import typing as t
|
import typing as t
|
||||||
|
from lxml import html
|
||||||
|
|
||||||
from searx.exceptions import SearxEngineAccessDeniedException
|
from searx.enginelib import EngineCache
|
||||||
|
from searx.network import get
|
||||||
|
from searx.exceptions import SearxEngineAPIException, SearxEngineAccessDeniedException
|
||||||
from searx.result_types import EngineResults
|
from searx.result_types import EngineResults
|
||||||
|
from searx.utils import eval_xpath, extract_text, gen_useragent
|
||||||
|
|
||||||
if t.TYPE_CHECKING:
|
if t.TYPE_CHECKING:
|
||||||
from searx.extended_types import SXNG_Response
|
from searx.extended_types import SXNG_Response
|
||||||
@@ -38,14 +42,45 @@ heexy_categ = "web"
|
|||||||
"""Category to search in. Can be either "web" or "image"."""
|
"""Category to search in. Can be either "web" or "image"."""
|
||||||
|
|
||||||
|
|
||||||
base_url = "https://seapi.heexy.org"
|
base_url = "https://heexy.org"
|
||||||
|
api_url = "https://seapi.heexy.org"
|
||||||
safe_search_map = {0: "off", 1: "on", 2: "on"}
|
safe_search_map = {0: "off", 1: "on", 2: "on"}
|
||||||
|
|
||||||
|
CACHE: EngineCache
|
||||||
|
"""Cache for storing the ``X-Data-Cacheft`` token (acts like an API key)."""
|
||||||
|
|
||||||
|
|
||||||
|
def setup(engine_settings: dict[str, t.Any]) -> bool:
|
||||||
|
global CACHE # pylint: disable=global-statement
|
||||||
|
|
||||||
def init(_):
|
|
||||||
if heexy_categ not in ("web", "image"):
|
if heexy_categ not in ("web", "image"):
|
||||||
raise ValueError("invalid search category: %s" % heexy_categ)
|
raise ValueError("invalid search category: %s" % heexy_categ)
|
||||||
|
|
||||||
|
CACHE = EngineCache(engine_settings["name"])
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _get_api_token(query: str) -> str:
|
||||||
|
"""The API token is independent of the search query. We just need any query
|
||||||
|
to obtain it initially, and don't hardcode it here to decrease chances of
|
||||||
|
getting blocked. The token must be passed as ``X-Data-Cacheft`` header."""
|
||||||
|
|
||||||
|
cached_token: str = CACHE.get("token")
|
||||||
|
if cached_token:
|
||||||
|
return cached_token
|
||||||
|
|
||||||
|
resp = get(f"{base_url}/search?q={query}", headers={"User-Agent": gen_useragent()})
|
||||||
|
if not resp.ok:
|
||||||
|
raise SearxEngineAPIException("failed to obtain request token: invalid response code")
|
||||||
|
|
||||||
|
doc = html.fromstring(resp.text)
|
||||||
|
token = extract_text(eval_xpath(doc, "//html/@data-cacheft"))
|
||||||
|
if not token:
|
||||||
|
raise SearxEngineAPIException("failed to obtain request token: no token found")
|
||||||
|
|
||||||
|
CACHE.set("token", token)
|
||||||
|
return token
|
||||||
|
|
||||||
|
|
||||||
def request(query: str, params: "OnlineParams") -> None:
|
def request(query: str, params: "OnlineParams") -> None:
|
||||||
args = {
|
args = {
|
||||||
@@ -56,8 +91,9 @@ def request(query: str, params: "OnlineParams") -> None:
|
|||||||
if params["searxng_locale"] != "all":
|
if params["searxng_locale"] != "all":
|
||||||
args["lang"] = params["searxng_locale"].split("-")[0]
|
args["lang"] = params["searxng_locale"].split("-")[0]
|
||||||
|
|
||||||
params["url"] = f"{base_url}/search/{heexy_categ}?{urlencode(args)}"
|
params["url"] = f"{api_url}/search/{heexy_categ}?{urlencode(args)}"
|
||||||
params["headers"]["Origin"] = base_url
|
params["headers"]["X-Data-Cacheft"] = _get_api_token(query)
|
||||||
|
params["headers"]["Origin"] = api_url
|
||||||
|
|
||||||
|
|
||||||
def response(resp: "SXNG_Response"):
|
def response(resp: "SXNG_Response"):
|
||||||
|
|||||||
62
searx/engines/magnific.py
Normal file
62
searx/engines/magnific.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""Magnific_ is a database for images.
|
||||||
|
|
||||||
|
.. _Magnific: https://www.magnific.com
|
||||||
|
"""
|
||||||
|
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
import typing as t
|
||||||
|
|
||||||
|
from searx.result_types import EngineResults
|
||||||
|
|
||||||
|
if t.TYPE_CHECKING:
|
||||||
|
from searx.extended_types import SXNG_Response
|
||||||
|
from searx.search.processors import OnlineParams
|
||||||
|
|
||||||
|
|
||||||
|
about = {
|
||||||
|
"website": "https://www.magnific.com",
|
||||||
|
"wikidata_id": "Q104211654",
|
||||||
|
"official_api_documentation": None,
|
||||||
|
"use_official_api": False,
|
||||||
|
"require_api_key": False,
|
||||||
|
"results": "JSON",
|
||||||
|
}
|
||||||
|
|
||||||
|
base_url = "https://www.magnific.com"
|
||||||
|
|
||||||
|
categories = ["images"]
|
||||||
|
paging = True
|
||||||
|
|
||||||
|
free_images_only = True
|
||||||
|
"""
|
||||||
|
Whether to only load images that may be used for free, without a Magnific account.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def request(query: str, params: "OnlineParams") -> None:
|
||||||
|
args = {"term": query, "filters[ai-generated][excluded]": 1, "page": params["pageno"], "locale": "en"}
|
||||||
|
if free_images_only:
|
||||||
|
args["filters[license]"] = "free"
|
||||||
|
|
||||||
|
params["headers"]["Referer"] = f"{base_url}/search"
|
||||||
|
params["url"] = f"{base_url}/api/regular/search?{urlencode(args)}"
|
||||||
|
|
||||||
|
|
||||||
|
def response(resp: "SXNG_Response"):
|
||||||
|
res = EngineResults()
|
||||||
|
|
||||||
|
result: dict[str, t.Any] # TBH: dict[str, t.Any]
|
||||||
|
for result in resp.json()["items"]:
|
||||||
|
res.add(
|
||||||
|
res.types.Image(
|
||||||
|
title=result["name"],
|
||||||
|
url=result["url"],
|
||||||
|
thumbnail_src=result["preview"]["url"],
|
||||||
|
img_src=result["preview"]["url"],
|
||||||
|
resolution=f"{result['preview']['width']}x{result['preview']['height']}",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return res
|
||||||
@@ -99,23 +99,35 @@ def parse_general(data):
|
|||||||
|
|
||||||
dom = html.fromstring(data)
|
dom = html.fromstring(data)
|
||||||
|
|
||||||
for item in eval_xpath_list(dom, "//ul[contains(@class, 'lst_total')]/li[contains(@class, 'bx')]"):
|
for item in eval_xpath_list(dom, "//div[contains(@class, 'fds-web-normal-doc-root')]"):
|
||||||
thumbnail = None
|
thumbnail = extract_text(
|
||||||
|
eval_xpath(
|
||||||
|
item,
|
||||||
|
".//div[contains(@class, 'sds-comps-image') and not(contains(@class, 'sds-comps-image-circle'))]/img/@src",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
title = extract_text(eval_xpath(item, ".//span[contains(@class, 'sds-comps-text-type-headline1')]"))
|
||||||
|
|
||||||
|
url = None
|
||||||
try:
|
try:
|
||||||
thumbnail = eval_xpath_getindex(item, ".//div[contains(@class, 'thumb_single')]//img/@data-lazysrc", 0)
|
url = eval_xpath_getindex(
|
||||||
|
item, ".//a[starts-with(@href, 'http') and not(contains(@href, 'keep.naver.com'))]/@href", 0
|
||||||
|
)
|
||||||
except (ValueError, TypeError, SearxEngineXPathException):
|
except (ValueError, TypeError, SearxEngineXPathException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
results.add(
|
content = extract_text(eval_xpath(item, ".//span[contains(@class, 'sds-comps-text-type-body1')]"))
|
||||||
MainResult(
|
|
||||||
title=extract_text(eval_xpath(item, ".//a[contains(@class, 'link_tit')]")),
|
if title and url:
|
||||||
url=eval_xpath_getindex(item, ".//a[contains(@class, 'link_tit')]/@href", 0),
|
results.add(
|
||||||
content=extract_text(
|
MainResult(
|
||||||
eval_xpath(item, ".//div[contains(@class, 'total_dsc_wrap')]//a[contains(@class, 'api_txt_lines')]")
|
title=title,
|
||||||
),
|
url=url,
|
||||||
thumbnail=thumbnail,
|
content=content or "",
|
||||||
|
thumbnail=thumbnail or "",
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
@@ -173,7 +185,7 @@ def parse_news(data):
|
|||||||
title=title,
|
title=title,
|
||||||
url=url,
|
url=url,
|
||||||
content=content,
|
content=content,
|
||||||
thumbnail=thumbnail,
|
thumbnail=thumbnail or "",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -196,7 +208,7 @@ def parse_videos(data):
|
|||||||
|
|
||||||
length = None
|
length = None
|
||||||
try:
|
try:
|
||||||
length = parse_duration_string(extract_text(eval_xpath(item, ".//span[contains(@class, 'time')]")))
|
length = parse_duration_string(extract_text(eval_xpath(item, ".//span[contains(@class, 'time')]")) or "")
|
||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
92
searx/engines/neosearch.py
Normal file
92
searx/engines/neosearch.py
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""Neosearch_ aims to be a privacy-first alternative to Google.
|
||||||
|
|
||||||
|
.. _Neosearch: https://neosearch.org/About
|
||||||
|
"""
|
||||||
|
|
||||||
|
from json import loads
|
||||||
|
import typing as t
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
from searx.extended_types import SXNG_Response
|
||||||
|
from searx.result_types import EngineResults
|
||||||
|
|
||||||
|
if t.TYPE_CHECKING:
|
||||||
|
from searx.enginelib.traits import EngineTraits
|
||||||
|
from searx.search.processors import OnlineParams
|
||||||
|
|
||||||
|
traits: EngineTraits
|
||||||
|
|
||||||
|
about = {
|
||||||
|
"website": "https://neosearch.org",
|
||||||
|
"official_api_documentation": None,
|
||||||
|
"use_official_api": False,
|
||||||
|
"require_api_key": False,
|
||||||
|
"results": "JSON",
|
||||||
|
}
|
||||||
|
|
||||||
|
base_url = "https://neosearch.org"
|
||||||
|
categories = ["general"]
|
||||||
|
|
||||||
|
paging = False
|
||||||
|
|
||||||
|
|
||||||
|
def request(query: str, params: "OnlineParams"):
|
||||||
|
args = {"q": query, "generate": "auto"}
|
||||||
|
countrycode = params["searxng_locale"].split("-")[-1].upper()
|
||||||
|
if countrycode in traits.custom["countrycodes"]:
|
||||||
|
args["loc"] = countrycode
|
||||||
|
params["url"] = f"{base_url}/search?{urlencode(args)}"
|
||||||
|
|
||||||
|
|
||||||
|
def response(resp: "SXNG_Response") -> EngineResults:
|
||||||
|
res = EngineResults()
|
||||||
|
|
||||||
|
# first line contains something like `{"location": "de"}`
|
||||||
|
# second line contains the actual results
|
||||||
|
json_resp = loads(resp.text.splitlines()[-1])
|
||||||
|
for lens in json_resp["lenses"]:
|
||||||
|
for category in lens["categories"]:
|
||||||
|
for result in category["links"]:
|
||||||
|
if not result["url"]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
res.add(
|
||||||
|
res.types.MainResult(
|
||||||
|
url=result["url"],
|
||||||
|
title=result["title"],
|
||||||
|
content=result["snippet"] or result["description"],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for suggestion in json_resp.get("suggestions", []):
|
||||||
|
res.add(res.types.LegacyResult(suggestion=suggestion))
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_traits(engine_traits: "EngineTraits") -> None:
|
||||||
|
# pylint: disable=import-outside-toplevel
|
||||||
|
from searx.network import get
|
||||||
|
from searx.utils import extr, js_obj_str_to_python
|
||||||
|
from babel.core import get_global
|
||||||
|
|
||||||
|
resp = get(base_url)
|
||||||
|
|
||||||
|
locations_js_raw = extr(resp.text, "const LOCATIONS = ", ";")
|
||||||
|
if not locations_js_raw:
|
||||||
|
raise RuntimeError("failed to find locations in neosearch HTML response")
|
||||||
|
locations: list[dict[str, str]] = js_obj_str_to_python(locations_js_raw)
|
||||||
|
|
||||||
|
babel_reg_list = get_global("territory_languages").keys()
|
||||||
|
|
||||||
|
countrycodes: list[str] = []
|
||||||
|
for loc in locations:
|
||||||
|
_reg = loc["code"].upper()
|
||||||
|
if _reg not in babel_reg_list:
|
||||||
|
print(f"ERROR: region tag {_reg} is unknown by babel")
|
||||||
|
continue
|
||||||
|
countrycodes.append(_reg)
|
||||||
|
|
||||||
|
countrycodes.sort()
|
||||||
|
engine_traits.custom["countrycodes"] = countrycodes
|
||||||
63
searx/engines/picjumbo.py
Normal file
63
searx/engines/picjumbo.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""Picjumbo_ provides free stock photos.
|
||||||
|
|
||||||
|
.. _Picjumbo: https://picjumbo.com
|
||||||
|
"""
|
||||||
|
|
||||||
|
from urllib.parse import urlparse, urlunparse
|
||||||
|
import typing as t
|
||||||
|
|
||||||
|
from lxml import html
|
||||||
|
|
||||||
|
from searx.result_types import EngineResults
|
||||||
|
from searx.utils import eval_xpath, eval_xpath_list, extract_text
|
||||||
|
|
||||||
|
if t.TYPE_CHECKING:
|
||||||
|
from searx.extended_types import SXNG_Response
|
||||||
|
from searx.search.processors import OnlineParams
|
||||||
|
|
||||||
|
|
||||||
|
about = {
|
||||||
|
"website": "https://picjumbo.com",
|
||||||
|
"wikidata_id": None,
|
||||||
|
"official_api_documentation": None,
|
||||||
|
"use_official_api": False,
|
||||||
|
"require_api_key": False,
|
||||||
|
"results": "HTML",
|
||||||
|
}
|
||||||
|
|
||||||
|
base_url = "https://picjumbo.com"
|
||||||
|
|
||||||
|
categories = ["images"]
|
||||||
|
paging = True
|
||||||
|
|
||||||
|
|
||||||
|
def request(query: str, params: "OnlineParams") -> None:
|
||||||
|
params["url"] = f"{base_url}/search/{query}/page/{params['pageno']}"
|
||||||
|
|
||||||
|
|
||||||
|
def _get_max_res_url(url: str) -> str:
|
||||||
|
"""Get the maximum resolution of the image based on the thumbnail URL."""
|
||||||
|
parsed_url = urlparse(url)
|
||||||
|
max_res_url = parsed_url._replace(query="w=10000&quality=100")
|
||||||
|
return urlunparse(max_res_url)
|
||||||
|
|
||||||
|
|
||||||
|
def response(resp: "SXNG_Response"):
|
||||||
|
res = EngineResults()
|
||||||
|
|
||||||
|
doc = html.fromstring(resp.text)
|
||||||
|
|
||||||
|
for result in eval_xpath_list(doc, "//div[contains(@class, 'photo_query')]/div[contains(@class, 'photo_item')]"):
|
||||||
|
thumbnail = extract_text(eval_xpath(result, ".//img[contains(@class, 'image')]/@src")) or ""
|
||||||
|
res.add(
|
||||||
|
res.types.Image(
|
||||||
|
url=extract_text(eval_xpath(result, ".//a[contains(@class, 'image')]/@href")) or "",
|
||||||
|
title=extract_text(eval_xpath(result, ".//h3")) or "",
|
||||||
|
content=extract_text(eval_xpath(result, ".//meta[@itemprop='keywords']/@content")) or "",
|
||||||
|
thumbnail_src=thumbnail,
|
||||||
|
img_src=_get_max_res_url(thumbnail),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return res
|
||||||
@@ -38,6 +38,7 @@ Implementations
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import random
|
||||||
import typing as t
|
import typing as t
|
||||||
|
|
||||||
from datetime import (
|
from datetime import (
|
||||||
@@ -89,6 +90,11 @@ qwant_categ: str = None # pyright: ignore[reportAssignmentType]
|
|||||||
|
|
||||||
safesearch = True
|
safesearch = True
|
||||||
|
|
||||||
|
# tgp seems to be short for "test group" - its actual value doesn't matter, as
|
||||||
|
# long as it's sent and at the correct position in the query params and doesn't
|
||||||
|
# change too frequently
|
||||||
|
test_group_value = random.randint(1, 3)
|
||||||
|
|
||||||
# fmt: off
|
# fmt: off
|
||||||
qwant_news_locales = [
|
qwant_news_locales = [
|
||||||
"ca_ad", "ca_es", "ca_fr", "co_fr", "de_at", "de_ch", "de_de", "en_au",
|
"ca_ad", "ca_es", "ca_fr", "co_fr", "de_at", "de_ch", "de_de", "en_au",
|
||||||
@@ -114,17 +120,24 @@ def request(query: str, params: "OnlineParams") -> None:
|
|||||||
results_per_page = 10
|
results_per_page = 10
|
||||||
if qwant_categ == "images":
|
if qwant_categ == "images":
|
||||||
results_per_page = 50
|
results_per_page = 50
|
||||||
|
|
||||||
args = {
|
args = {
|
||||||
"q": query,
|
"q": query,
|
||||||
"count": results_per_page,
|
"count": results_per_page,
|
||||||
"locale": q_locale,
|
"locale": q_locale,
|
||||||
"offset": (params["pageno"] - 1) * results_per_page,
|
"offset": (params["pageno"] - 1) * results_per_page,
|
||||||
|
"tgp": test_group_value,
|
||||||
"device": "desktop",
|
"device": "desktop",
|
||||||
"safesearch": params["safesearch"],
|
"safesearch": params["safesearch"],
|
||||||
"tgp": 1,
|
|
||||||
"display": True,
|
"display": True,
|
||||||
"llm": True,
|
"llm": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# shuffle query parameters to be harder to fingerprint
|
||||||
|
args = list(args.items())
|
||||||
|
random.shuffle(args)
|
||||||
|
args = dict(args)
|
||||||
|
|
||||||
params["raise_for_httperror"] = False
|
params["raise_for_httperror"] = False
|
||||||
|
|
||||||
params["url"] = f"{api_url}{qwant_categ}?{urlencode(args)}"
|
params["url"] = f"{api_url}{qwant_categ}?{urlencode(args)}"
|
||||||
@@ -190,7 +203,6 @@ def response(resp: "SXNG_Response") -> EngineResults:
|
|||||||
|
|
||||||
mainline_items: list[dict[str, t.Any]] = row.get("items", [])
|
mainline_items: list[dict[str, t.Any]] = row.get("items", [])
|
||||||
for item in mainline_items:
|
for item in mainline_items:
|
||||||
|
|
||||||
title: str = item.get("title", "")
|
title: str = item.get("title", "")
|
||||||
res_url: str = item.get("url", "")
|
res_url: str = item.get("url", "")
|
||||||
pub_date: datetime | None = None
|
pub_date: datetime | None = None
|
||||||
|
|||||||
96
searx/engines/searchzee.py
Normal file
96
searx/engines/searchzee.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""SearchZee is a small, indie project, web and news results pulled from
|
||||||
|
independent search infrastructure."""
|
||||||
|
|
||||||
|
import typing as t
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
from searx.exceptions import SearxEngineAPIException
|
||||||
|
from searx.extended_types import SXNG_Response
|
||||||
|
from searx.network import get
|
||||||
|
from searx.result_types import EngineResults
|
||||||
|
from searx.utils import extr, html_to_text
|
||||||
|
from searx.enginelib import EngineCache
|
||||||
|
|
||||||
|
if t.TYPE_CHECKING:
|
||||||
|
from searx.search.processors import OnlineParams
|
||||||
|
|
||||||
|
about = {
|
||||||
|
"website": "https://searchzee.com",
|
||||||
|
"official_api_documentation": None,
|
||||||
|
"use_official_api": False,
|
||||||
|
"require_api_key": False,
|
||||||
|
"results": "JSON",
|
||||||
|
"description": (
|
||||||
|
"SearchZee is a small, indie project, the web and news results"
|
||||||
|
" are pulled from an independent search infrastructure."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
categories: list[str] = None # type: ignore[reportAssignmentType]
|
||||||
|
|
||||||
|
paging = True
|
||||||
|
|
||||||
|
SearchzeeCategType = t.Literal["web", "news"]
|
||||||
|
searchzee_categ: SearchzeeCategType = None # type: ignore[reportAssignmentType]
|
||||||
|
|
||||||
|
|
||||||
|
CACHE: EngineCache
|
||||||
|
"""Cache for storing the scraped API Token."""
|
||||||
|
|
||||||
|
base_url = "https://searchzee.com"
|
||||||
|
|
||||||
|
# only supports for news
|
||||||
|
time_range_map = {"day": "pd", "week": "pw", "month": "pm", "year": "py"}
|
||||||
|
|
||||||
|
|
||||||
|
def setup(engine_settings: dict[str, t.Any]) -> bool:
|
||||||
|
if searchzee_categ not in t.get_args(SearchzeeCategType):
|
||||||
|
raise ValueError("invalid category: %s" % searchzee_categ)
|
||||||
|
|
||||||
|
global CACHE # pylint: disable=global-statement
|
||||||
|
CACHE = EngineCache(engine_settings["name"]) # type: ignore[reportAny]
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _obtain_api_token() -> str:
|
||||||
|
token: str | None = CACHE.get("token") # type: ignore[reportAny]
|
||||||
|
if token:
|
||||||
|
return token
|
||||||
|
|
||||||
|
token_resp = get(
|
||||||
|
f"{base_url}/app.js",
|
||||||
|
)
|
||||||
|
if not token_resp.ok:
|
||||||
|
raise SearxEngineAPIException("failed to obtain api key")
|
||||||
|
|
||||||
|
token = extr(token_resp.text, "const SEARCHZEE_API_TOKEN = \"", "\";")
|
||||||
|
CACHE.set("token", token, expire=3600)
|
||||||
|
|
||||||
|
return token
|
||||||
|
|
||||||
|
|
||||||
|
def request(query: str, params: "OnlineParams"):
|
||||||
|
params["headers"]["X-SearchZee-Token"] = _obtain_api_token()
|
||||||
|
|
||||||
|
args = {"q": query, "type": searchzee_categ, "offset": params["pageno"] - 1}
|
||||||
|
if params["time_range"]:
|
||||||
|
args["freshness"] = time_range_map[params["time_range"]]
|
||||||
|
params["url"] = f"{base_url}/api/search?{urlencode(args)}"
|
||||||
|
|
||||||
|
|
||||||
|
def response(resp: "SXNG_Response") -> EngineResults:
|
||||||
|
res = EngineResults()
|
||||||
|
|
||||||
|
results: list[dict[str, str]] = resp.json()["results"] # type: ignore[reportAny]
|
||||||
|
|
||||||
|
for result in results:
|
||||||
|
res.add(
|
||||||
|
res.types.MainResult(
|
||||||
|
url=result["url"],
|
||||||
|
title=html_to_text(result["title"]),
|
||||||
|
content=html_to_text(result["summary"]),
|
||||||
|
thumbnail=result.get("thumbnail") or "",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return res
|
||||||
62
searx/engines/shopify_stock.py
Normal file
62
searx/engines/shopify_stock.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""Shopify stock photos provides royalty-free images, intended for use with
|
||||||
|
Shopify.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import typing as t
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
from lxml import html
|
||||||
|
|
||||||
|
from searx.result_types import EngineResults
|
||||||
|
from searx.utils import eval_xpath, eval_xpath_list, extract_text
|
||||||
|
|
||||||
|
if t.TYPE_CHECKING:
|
||||||
|
from searx.extended_types import SXNG_Response
|
||||||
|
from searx.search.processors import OnlineParams
|
||||||
|
|
||||||
|
|
||||||
|
about = {
|
||||||
|
"website": "https://www.shopify.com/stock-photos",
|
||||||
|
"wikidata_id": None,
|
||||||
|
"official_api_documentation": None,
|
||||||
|
"use_official_api": False,
|
||||||
|
"require_api_key": False,
|
||||||
|
"results": "HTML",
|
||||||
|
}
|
||||||
|
|
||||||
|
base_url = "https://www.shopify.com"
|
||||||
|
|
||||||
|
categories = ["images"]
|
||||||
|
paging = True
|
||||||
|
|
||||||
|
|
||||||
|
def request(query: str, params: "OnlineParams") -> None:
|
||||||
|
args = {"q": query, "page": params["pageno"]}
|
||||||
|
params["url"] = f"{base_url}/stock-photos/photos/search?{urlencode(args)}"
|
||||||
|
|
||||||
|
|
||||||
|
def _get_download_url(url: str) -> str:
|
||||||
|
"""Get the link to the full quality image."""
|
||||||
|
query_start = url.find("?")
|
||||||
|
return url[:query_start] + "/download?quality=premium"
|
||||||
|
|
||||||
|
|
||||||
|
def response(resp: "SXNG_Response"):
|
||||||
|
res = EngineResults()
|
||||||
|
|
||||||
|
doc = html.fromstring(resp.text)
|
||||||
|
|
||||||
|
for result in eval_xpath_list(doc, "//div[contains(@class, 'js-masonry-grid')]/div"):
|
||||||
|
url = base_url + (extract_text(eval_xpath(result, ".//a[contains(@class, 'photo-tile')]/@href")) or "")
|
||||||
|
res.add(
|
||||||
|
res.types.Image(
|
||||||
|
url=url,
|
||||||
|
title=extract_text(eval_xpath(result, ".//p[contains(@class, 'photo-tile__title')]")) or "",
|
||||||
|
thumbnail_src=extract_text(eval_xpath(result, ".//img[contains(@class, 'photo-card__image')]/@src"))
|
||||||
|
or "",
|
||||||
|
img_src=_get_download_url(url),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return res
|
||||||
55
searx/engines/stocksnap.py
Normal file
55
searx/engines/stocksnap.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""Stocksnap_ is a search engine for CC0-licensed images.
|
||||||
|
|
||||||
|
.. _Stocksnap: https://stocksnap.io
|
||||||
|
"""
|
||||||
|
|
||||||
|
import typing as t
|
||||||
|
|
||||||
|
from searx.result_types import EngineResults
|
||||||
|
|
||||||
|
if t.TYPE_CHECKING:
|
||||||
|
from searx.extended_types import SXNG_Response
|
||||||
|
from searx.search.processors import OnlineParams
|
||||||
|
|
||||||
|
|
||||||
|
about = {
|
||||||
|
"website": "https://stocksnap.io",
|
||||||
|
"wikidata_id": None,
|
||||||
|
"official_api_documentation": None,
|
||||||
|
"use_official_api": False,
|
||||||
|
"require_api_key": False,
|
||||||
|
"results": "JSON",
|
||||||
|
}
|
||||||
|
# otherwise all requests get blocked, probably HTTP2 fingerprinting
|
||||||
|
enable_http2 = False
|
||||||
|
|
||||||
|
base_url = "https://stocksnap.io"
|
||||||
|
cdn_url = "https://cdn.stocksnap.io"
|
||||||
|
|
||||||
|
categories = ["images"]
|
||||||
|
paging = True
|
||||||
|
|
||||||
|
|
||||||
|
def request(query: str, params: "OnlineParams") -> None:
|
||||||
|
params["url"] = f"{base_url}/api/search-photos/{query}/relevance/desc/{params['pageno']}"
|
||||||
|
|
||||||
|
|
||||||
|
def response(resp: "SXNG_Response"):
|
||||||
|
res = EngineResults()
|
||||||
|
|
||||||
|
result: dict[str, str] # TBH: dict[str, t.Any]
|
||||||
|
for result in resp.json()["results"]:
|
||||||
|
slug = "-".join(result['keywords'][:1]) + "-" + result["img_id"]
|
||||||
|
res.add(
|
||||||
|
res.types.Image(
|
||||||
|
title=result["tags"],
|
||||||
|
url=f"{base_url}/photo/{slug}",
|
||||||
|
thumbnail_src=f"{cdn_url}/img-thumbs/280h/{result['img_id']}.jpg",
|
||||||
|
img_src=f"{cdn_url}/img-thumbs/960w/{result['img_id']}.jpg",
|
||||||
|
img_format="JPEG",
|
||||||
|
resolution=f"{result['img_width']}x{result['img_height']}",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return res
|
||||||
@@ -16,6 +16,7 @@ __all__ = [
|
|||||||
|
|
||||||
import typing as t
|
import typing as t
|
||||||
|
|
||||||
|
import os
|
||||||
from searx import logger
|
from searx import logger
|
||||||
from searx import engines
|
from searx import engines
|
||||||
|
|
||||||
@@ -92,7 +93,9 @@ class ProcessorMap(dict[str, EngineProcessor]):
|
|||||||
self[eng_proc.engine.name] = eng_proc
|
self[eng_proc.engine.name] = eng_proc
|
||||||
# logger.debug("registered engine processor: %s", eng_proc.engine.name)
|
# logger.debug("registered engine processor: %s", eng_proc.engine.name)
|
||||||
else:
|
else:
|
||||||
logger.error("can't register engine processor: %s (init failed)", eng_proc.engine.name)
|
logger.error(
|
||||||
|
f"(PID {os.getpid()}) {eng_proc.engine.name}: can't register engines processor (init engine failed)"
|
||||||
|
)
|
||||||
|
|
||||||
return eng_proc_ok
|
return eng_proc_ok
|
||||||
|
|
||||||
|
|||||||
@@ -150,19 +150,26 @@ class EngineProcessor(ABC):
|
|||||||
threading.Thread(target=__init_processor_thread, daemon=True).start()
|
threading.Thread(target=__init_processor_thread, daemon=True).start()
|
||||||
|
|
||||||
def init_engine(self) -> bool:
|
def init_engine(self) -> bool:
|
||||||
|
|
||||||
eng_setting = get_engine_from_settings(self.engine.name)
|
eng_setting = get_engine_from_settings(self.engine.name)
|
||||||
init_ok: bool | None = False
|
init_ok: bool | None = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
init_ok = self.engine.init(eng_setting)
|
init_ok = self.engine.init(eng_setting)
|
||||||
except Exception: # pylint: disable=broad-except
|
except Exception as e: # pylint: disable=broad-except
|
||||||
logger.exception(
|
logger.exception(f"(PID {os.getpid()}) {self.engine.name}: engine INIT failed, exception: {e}")
|
||||||
f"(PID {os.getpid()}) Init method of engine %s failed due to an exception.", self.engine.name
|
|
||||||
)
|
|
||||||
init_ok = False
|
init_ok = False
|
||||||
|
|
||||||
# In older engines, None is returned from the init method, which is
|
# In older engines, None is returned from the init method, which is
|
||||||
# equivalent to indicating that the initialization was successful.
|
# equivalent to indicating that the initialization was successful
|
||||||
|
# (compare: Engine.setup).
|
||||||
|
|
||||||
if init_ok is None:
|
if init_ok is None:
|
||||||
init_ok = True
|
init_ok = True
|
||||||
|
|
||||||
|
if not init_ok:
|
||||||
|
logger.error(f"(PID {os.getpid()}) {self.engine.name}: engine init was not successful")
|
||||||
|
|
||||||
return init_ok
|
return init_ok
|
||||||
|
|
||||||
def handle_exception(
|
def handle_exception(
|
||||||
|
|||||||
@@ -1585,6 +1585,11 @@ engines:
|
|||||||
disabled: true
|
disabled: true
|
||||||
inactive: true
|
inactive: true
|
||||||
|
|
||||||
|
- name: magnific
|
||||||
|
engine: magnific
|
||||||
|
shortcut: mag
|
||||||
|
disabled: true
|
||||||
|
|
||||||
- name: marginalia
|
- name: marginalia
|
||||||
engine: marginalia
|
engine: marginalia
|
||||||
shortcut: mar
|
shortcut: mar
|
||||||
@@ -1857,6 +1862,11 @@ engines:
|
|||||||
engine: photon
|
engine: photon
|
||||||
shortcut: ph
|
shortcut: ph
|
||||||
|
|
||||||
|
- name: picjumbo
|
||||||
|
engine: picjumbo
|
||||||
|
shortcut: pj
|
||||||
|
disabled: true
|
||||||
|
|
||||||
- name: pinterest
|
- name: pinterest
|
||||||
engine: pinterest
|
engine: pinterest
|
||||||
shortcut: pin
|
shortcut: pin
|
||||||
@@ -2165,6 +2175,11 @@ engines:
|
|||||||
engine: sepiasearch
|
engine: sepiasearch
|
||||||
shortcut: sep
|
shortcut: sep
|
||||||
|
|
||||||
|
- name: shopify stock
|
||||||
|
engine: shopify_stock
|
||||||
|
shortcut: shs
|
||||||
|
disabled: true
|
||||||
|
|
||||||
- name: sogou
|
- name: sogou
|
||||||
engine: sogou
|
engine: sogou
|
||||||
shortcut: sogou
|
shortcut: sogou
|
||||||
@@ -2195,6 +2210,11 @@ engines:
|
|||||||
api_site: 'stackoverflow'
|
api_site: 'stackoverflow'
|
||||||
categories: [it, q&a]
|
categories: [it, q&a]
|
||||||
|
|
||||||
|
- name: stocksnap
|
||||||
|
engine: stocksnap
|
||||||
|
shortcut: sto
|
||||||
|
disabled: true
|
||||||
|
|
||||||
- name: askubuntu
|
- name: askubuntu
|
||||||
engine: stackexchange
|
engine: stackexchange
|
||||||
shortcut: ubuntu
|
shortcut: ubuntu
|
||||||
@@ -2834,6 +2854,12 @@ engines:
|
|||||||
shortcut: nvrv
|
shortcut: nvrv
|
||||||
disabled: true
|
disabled: true
|
||||||
|
|
||||||
|
- name: neosearch
|
||||||
|
engine: neosearch
|
||||||
|
shortcut: neo
|
||||||
|
disabled: true
|
||||||
|
inactive: true
|
||||||
|
|
||||||
- name: rubygems
|
- name: rubygems
|
||||||
shortcut: rbg
|
shortcut: rbg
|
||||||
engine: xpath
|
engine: xpath
|
||||||
@@ -2963,44 +2989,17 @@ engines:
|
|||||||
results: HTML
|
results: HTML
|
||||||
|
|
||||||
- name: searchzee
|
- name: searchzee
|
||||||
engine: json_engine
|
engine: searchzee
|
||||||
search_url: https://searchzee.com/api/search?q={query}&type=web&offset={pageno}
|
|
||||||
paging: true
|
|
||||||
first_page_num: 0
|
|
||||||
results_query: results
|
|
||||||
url_query: url
|
|
||||||
title_query: title
|
|
||||||
content_query: summary
|
|
||||||
content_html_to_text: true
|
|
||||||
categories: general
|
categories: general
|
||||||
|
searchzee_categ: web
|
||||||
shortcut: sz
|
shortcut: sz
|
||||||
disabled: true
|
disabled: true
|
||||||
inactive: true
|
inactive: true
|
||||||
about:
|
|
||||||
website: https://searchzee.com
|
|
||||||
use_official_api: false
|
|
||||||
require_api_key: false
|
|
||||||
results: JSON
|
|
||||||
|
|
||||||
- name: searchzee news
|
- name: searchzee news
|
||||||
engine: json_engine
|
engine: searchzee
|
||||||
search_url: https://searchzee.com/api/search?q={query}&type=news&offset={pageno}{time_range}
|
|
||||||
paging: true
|
|
||||||
first_page_num: 0
|
|
||||||
time_range_support: true
|
|
||||||
time_range_url: "&freshness={time_range_val}"
|
|
||||||
time_range_map:
|
|
||||||
day: pd
|
|
||||||
week: pw
|
|
||||||
month: pm
|
|
||||||
year: py
|
|
||||||
results_query: results
|
|
||||||
url_query: url
|
|
||||||
title_query: title
|
|
||||||
content_query: summary
|
|
||||||
thumbnail_query: thumbnail
|
|
||||||
content_html_to_text: true
|
|
||||||
categories: news
|
categories: news
|
||||||
|
searchzee_categ: news
|
||||||
shortcut: sznw
|
shortcut: sznw
|
||||||
disabled: true
|
disabled: true
|
||||||
inactive: true
|
inactive: true
|
||||||
@@ -3285,6 +3284,36 @@ engines:
|
|||||||
base_url: https://info.searchtoday.site
|
base_url: https://info.searchtoday.site
|
||||||
disabled: true
|
disabled: true
|
||||||
|
|
||||||
|
- name: sina
|
||||||
|
engine: json_engine
|
||||||
|
shortcut: sina
|
||||||
|
categories: news
|
||||||
|
paging: true
|
||||||
|
first_page_num: 1
|
||||||
|
search_url: https://search.sina.com.cn/api/search?q={query}&tp=mix&sort=0&page={pageno}&size=10&from=search_result
|
||||||
|
results_query: data/list
|
||||||
|
url_query: url
|
||||||
|
title_query: title
|
||||||
|
content_query: intro
|
||||||
|
thumbnail_query: thumb
|
||||||
|
title_html_to_text: true
|
||||||
|
time_range_map:
|
||||||
|
day: d
|
||||||
|
week: w
|
||||||
|
month: m
|
||||||
|
year: y
|
||||||
|
time_range_support: true
|
||||||
|
time_range_url: "&from=advanced_search&time={time_range_val}"
|
||||||
|
disabled: true
|
||||||
|
inactive: true
|
||||||
|
language: zh
|
||||||
|
about:
|
||||||
|
website: https://search.sina.com.cn
|
||||||
|
wikidata_id: Q938668
|
||||||
|
use_official_api: false
|
||||||
|
require_api_key: false
|
||||||
|
results: JSON
|
||||||
|
|
||||||
# - name: webcrawler
|
# - name: webcrawler
|
||||||
# engine: s1search
|
# engine: s1search
|
||||||
# shortcut: wc
|
# shortcut: wc
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
sxng_locales = (
|
sxng_locales = (
|
||||||
|
('af', 'Afrikaans', '', 'Afrikaans', '\U0001f310'),
|
||||||
('ar', 'العربية', '', 'Arabic', '\U0001f310'),
|
('ar', 'العربية', '', 'Arabic', '\U0001f310'),
|
||||||
('ar-SA', 'العربية', 'المملكة العربية السعودية', 'Arabic', '\U0001f1f8\U0001f1e6'),
|
('ar-SA', 'العربية', 'المملكة العربية السعودية', 'Arabic', '\U0001f1f8\U0001f1e6'),
|
||||||
('bg', 'Български', '', 'Bulgarian', '\U0001f310'),
|
('bg', 'Български', '', 'Bulgarian', '\U0001f310'),
|
||||||
@@ -45,6 +46,7 @@ sxng_locales = (
|
|||||||
('es-ES', 'Español', 'España', 'Spanish', '\U0001f1ea\U0001f1f8'),
|
('es-ES', 'Español', 'España', 'Spanish', '\U0001f1ea\U0001f1f8'),
|
||||||
('es-MX', 'Español', 'México', 'Spanish', '\U0001f1f2\U0001f1fd'),
|
('es-MX', 'Español', 'México', 'Spanish', '\U0001f1f2\U0001f1fd'),
|
||||||
('es-PE', 'Español', 'Perú', 'Spanish', '\U0001f1f5\U0001f1ea'),
|
('es-PE', 'Español', 'Perú', 'Spanish', '\U0001f1f5\U0001f1ea'),
|
||||||
|
('es-VE', 'Español', 'Venezuela', 'Spanish', '\U0001f1fb\U0001f1ea'),
|
||||||
('et', 'Eesti', '', 'Estonian', '\U0001f310'),
|
('et', 'Eesti', '', 'Estonian', '\U0001f310'),
|
||||||
('et-EE', 'Eesti', 'Eesti', 'Estonian', '\U0001f1ea\U0001f1ea'),
|
('et-EE', 'Eesti', 'Eesti', 'Estonian', '\U0001f1ea\U0001f1ea'),
|
||||||
('fi', 'Suomi', '', 'Finnish', '\U0001f310'),
|
('fi', 'Suomi', '', 'Finnish', '\U0001f310'),
|
||||||
@@ -56,6 +58,7 @@ sxng_locales = (
|
|||||||
('fr-CA', 'Français', 'Canada', 'French', '\U0001f1e8\U0001f1e6'),
|
('fr-CA', 'Français', 'Canada', 'French', '\U0001f1e8\U0001f1e6'),
|
||||||
('fr-CH', 'Français', 'Suisse', 'French', '\U0001f1e8\U0001f1ed'),
|
('fr-CH', 'Français', 'Suisse', 'French', '\U0001f1e8\U0001f1ed'),
|
||||||
('fr-FR', 'Français', 'France', 'French', '\U0001f1eb\U0001f1f7'),
|
('fr-FR', 'Français', 'France', 'French', '\U0001f1eb\U0001f1f7'),
|
||||||
|
('gl', 'Galego', '', 'Galician', '\U0001f310'),
|
||||||
('hi', 'हिन्दी', '', 'Hindi', '\U0001f310'),
|
('hi', 'हिन्दी', '', 'Hindi', '\U0001f310'),
|
||||||
('hi-IN', 'हिन्दी', 'भारत', 'Hindi', '\U0001f1ee\U0001f1f3'),
|
('hi-IN', 'हिन्दी', 'भारत', 'Hindi', '\U0001f1ee\U0001f1f3'),
|
||||||
('hr', 'Hrvatski', '', 'Croatian', '\U0001f310'),
|
('hr', 'Hrvatski', '', 'Croatian', '\U0001f310'),
|
||||||
@@ -89,6 +92,8 @@ sxng_locales = (
|
|||||||
('ro-RO', 'Română', 'România', 'Romanian', '\U0001f1f7\U0001f1f4'),
|
('ro-RO', 'Română', 'România', 'Romanian', '\U0001f1f7\U0001f1f4'),
|
||||||
('ru', 'Русский', '', 'Russian', '\U0001f310'),
|
('ru', 'Русский', '', 'Russian', '\U0001f310'),
|
||||||
('ru-RU', 'Русский', 'Россия', 'Russian', '\U0001f1f7\U0001f1fa'),
|
('ru-RU', 'Русский', 'Россия', 'Russian', '\U0001f1f7\U0001f1fa'),
|
||||||
|
('sk', 'Slovenčina', '', 'Slovak', '\U0001f310'),
|
||||||
|
('sq', 'Shqip', '', 'Albanian', '\U0001f310'),
|
||||||
('sv', 'Svenska', '', 'Swedish', '\U0001f310'),
|
('sv', 'Svenska', '', 'Swedish', '\U0001f310'),
|
||||||
('sv-FI', 'Svenska', 'Finland', 'Swedish', '\U0001f1eb\U0001f1ee'),
|
('sv-FI', 'Svenska', 'Finland', 'Swedish', '\U0001f1eb\U0001f1ee'),
|
||||||
('sv-SE', 'Svenska', 'Sverige', 'Swedish', '\U0001f1f8\U0001f1ea'),
|
('sv-SE', 'Svenska', 'Sverige', 'Swedish', '\U0001f1f8\U0001f1ea'),
|
||||||
@@ -96,6 +101,7 @@ sxng_locales = (
|
|||||||
('th-TH', 'ไทย', 'ไทย', 'Thai', '\U0001f1f9\U0001f1ed'),
|
('th-TH', 'ไทย', 'ไทย', 'Thai', '\U0001f1f9\U0001f1ed'),
|
||||||
('tr', 'Türkçe', '', 'Turkish', '\U0001f310'),
|
('tr', 'Türkçe', '', 'Turkish', '\U0001f310'),
|
||||||
('tr-TR', 'Türkçe', 'Türkiye', 'Turkish', '\U0001f1f9\U0001f1f7'),
|
('tr-TR', 'Türkçe', 'Türkiye', 'Turkish', '\U0001f1f9\U0001f1f7'),
|
||||||
|
('uk', 'Українська', '', 'Ukrainian', '\U0001f310'),
|
||||||
('vi', 'Tiếng Việt', '', 'Vietnamese', '\U0001f310'),
|
('vi', 'Tiếng Việt', '', 'Vietnamese', '\U0001f310'),
|
||||||
('vi-VN', 'Tiếng Việt', 'Việt Nam', 'Vietnamese', '\U0001f1fb\U0001f1f3'),
|
('vi-VN', 'Tiếng Việt', 'Việt Nam', 'Vietnamese', '\U0001f1fb\U0001f1f3'),
|
||||||
('zh', '中文', '', 'Chinese', '\U0001f310'),
|
('zh', '中文', '', 'Chinese', '\U0001f310'),
|
||||||
|
|||||||
Binary file not shown.
@@ -28,21 +28,23 @@
|
|||||||
# DZDevelopers <dzdevelopers@noreply.codeberg.org>, 2025.
|
# DZDevelopers <dzdevelopers@noreply.codeberg.org>, 2025.
|
||||||
# youtherthyf <youtherthyf@noreply.codeberg.org>, 2025.
|
# youtherthyf <youtherthyf@noreply.codeberg.org>, 2025.
|
||||||
# mustafa-phd <mustafa-phd@noreply.codeberg.org>, 2026.
|
# mustafa-phd <mustafa-phd@noreply.codeberg.org>, 2026.
|
||||||
|
# nebras <nebras@noreply.codeberg.org>, 2026.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: searx\n"
|
"Project-Id-Version: searx\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
|
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
|
||||||
"PO-Revision-Date: 2026-05-27 12:07+0000\n"
|
"PO-Revision-Date: 2026-06-28 18:07+0000\n"
|
||||||
"Last-Translator: mustafa-phd <mustafa-phd@noreply.codeberg.org>\n"
|
"Last-Translator: nebras <nebras@noreply.codeberg.org>\n"
|
||||||
|
"Language-Team: Arabic <https://translate.codeberg.org/projects/searxng/"
|
||||||
|
"searxng/ar/>\n"
|
||||||
"Language: ar\n"
|
"Language: ar\n"
|
||||||
"Language-Team: Arabic "
|
|
||||||
"<https://translate.codeberg.org/projects/searxng/searxng/ar/>\n"
|
|
||||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : "
|
|
||||||
"n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||||
|
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||||
|
"X-Generator: Weblate 2026.6.1\n"
|
||||||
"Generated-By: Babel 2.18.0\n"
|
"Generated-By: Babel 2.18.0\n"
|
||||||
|
|
||||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||||
@@ -1653,11 +1655,11 @@ msgstr "الدقة"
|
|||||||
|
|
||||||
#: searx/templates/simple/result_templates/images.html:55
|
#: searx/templates/simple/result_templates/images.html:55
|
||||||
msgid "Image formats"
|
msgid "Image formats"
|
||||||
msgstr ""
|
msgstr "صيغ الصور"
|
||||||
|
|
||||||
#: searx/templates/simple/result_templates/images.html:56
|
#: searx/templates/simple/result_templates/images.html:56
|
||||||
msgid "original format"
|
msgid "original format"
|
||||||
msgstr ""
|
msgstr "الصيغة الاصلية"
|
||||||
|
|
||||||
#: searx/templates/simple/result_templates/images.html:63
|
#: searx/templates/simple/result_templates/images.html:63
|
||||||
msgid "Engine"
|
msgid "Engine"
|
||||||
@@ -2402,4 +2404,3 @@ msgstr "إخفاء الفيديو"
|
|||||||
|
|
||||||
#~ msgid "Format"
|
#~ msgid "Format"
|
||||||
#~ msgstr "صيغة"
|
#~ msgstr "صيغة"
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -25,20 +25,22 @@
|
|||||||
# nhthinh <nhthinh@noreply.codeberg.org>, 2025.
|
# nhthinh <nhthinh@noreply.codeberg.org>, 2025.
|
||||||
# recreationalprogamer <recreationalprogamer@noreply.codeberg.org>, 2025.
|
# recreationalprogamer <recreationalprogamer@noreply.codeberg.org>, 2025.
|
||||||
# namhv05 <namhv05@noreply.codeberg.org>, 2026.
|
# namhv05 <namhv05@noreply.codeberg.org>, 2026.
|
||||||
|
# Anonymous104 <anonymous104@noreply.codeberg.org>, 2026.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: searx\n"
|
"Project-Id-Version: searx\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
|
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
|
||||||
"PO-Revision-Date: 2026-05-19 12:08+0000\n"
|
"PO-Revision-Date: 2026-06-28 18:07+0000\n"
|
||||||
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
|
"Last-Translator: Anonymous104 <anonymous104@noreply.codeberg.org>\n"
|
||||||
|
"Language-Team: Vietnamese <https://translate.codeberg.org/projects/searxng/"
|
||||||
|
"searxng/vi/>\n"
|
||||||
"Language: vi\n"
|
"Language: vi\n"
|
||||||
"Language-Team: Vietnamese "
|
|
||||||
"<https://translate.codeberg.org/projects/searxng/searxng/vi/>\n"
|
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
"X-Generator: Weblate 2026.6.1\n"
|
||||||
"Generated-By: Babel 2.18.0\n"
|
"Generated-By: Babel 2.18.0\n"
|
||||||
|
|
||||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||||
@@ -1651,11 +1653,11 @@ msgstr "Độ phân giải"
|
|||||||
|
|
||||||
#: searx/templates/simple/result_templates/images.html:55
|
#: searx/templates/simple/result_templates/images.html:55
|
||||||
msgid "Image formats"
|
msgid "Image formats"
|
||||||
msgstr ""
|
msgstr "Các định dạng ảnh"
|
||||||
|
|
||||||
#: searx/templates/simple/result_templates/images.html:56
|
#: searx/templates/simple/result_templates/images.html:56
|
||||||
msgid "original format"
|
msgid "original format"
|
||||||
msgstr ""
|
msgstr "định dạng gốc"
|
||||||
|
|
||||||
#: searx/templates/simple/result_templates/images.html:63
|
#: searx/templates/simple/result_templates/images.html:63
|
||||||
msgid "Engine"
|
msgid "Engine"
|
||||||
@@ -2419,4 +2421,3 @@ msgstr "ẩn video"
|
|||||||
|
|
||||||
#~ msgid "Format"
|
#~ msgid "Format"
|
||||||
#~ msgstr "Định dạng"
|
#~ msgstr "Định dạng"
|
||||||
|
|
||||||
|
|||||||
@@ -776,8 +776,11 @@ docs.live() {
|
|||||||
pyenv.install
|
pyenv.install
|
||||||
docs.prebuild
|
docs.prebuild
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
PATH="${PY_ENV_BIN}:${PATH}" pyenv.cmd sphinx-autobuild \
|
SPHINX_AUTOBUILD_DEBUG=1 PATH="${PY_ENV_BIN}:${PATH}" pyenv.cmd sphinx-autobuild \
|
||||||
${SPHINX_VERBOSE} ${SPHINXOPTS} --open-browser --host 0.0.0.0 \
|
${SPHINX_VERBOSE} ${SPHINXOPTS} \
|
||||||
|
--watch ./searx \
|
||||||
|
--re-ignore '(^|/)\.#|^(?!.*\.(rst|py|yml)$).*' \
|
||||||
|
--open-browser --host 0.0.0.0 \
|
||||||
-b html -c ./docs -d "${DOCS_BUILD}/.doctrees" ./docs "${DOCS_DIST}"
|
-b html -c ./docs -d "${DOCS_BUILD}/.doctrees" ./docs "${DOCS_DIST}"
|
||||||
dump_return $?
|
dump_return $?
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user