summaryrefslogtreecommitdiff
path: root/searx/engines/chinaso.py
diff options
context:
space:
mode:
authorBrandonStudio <55647556+BrandonStudio@users.noreply.github.com>2025-04-30 05:48:19 +0000
committerMarkus Heiser <markus.heiser@darmarIT.de>2025-05-02 14:22:51 +0200
commitd47cf9db244e7ce241fcfde298a87311d00295e4 (patch)
treeb61f686a594d563d9289fbfa4cb5ed21c794a36e /searx/engines/chinaso.py
parent705ebe64b5053bd7c80b940e80db579d9c10187a (diff)
[feat] engine ChinaSo: support source filter for ChinaSo-News
* filtering ChinaSo-News results by source, option ``chinaso_news_source`` * add ChinaSo engine to the online docs https://docs.searxng.org/dev/engines/online/chinaso.html * fix SearXNG categories in the settings.yml * deactivate ChinaSo engines ``inactive: true`` until [1] is fixed * configure network of the ChinaSo engines [1] https://github.com/searxng/searxng/issues/4694 Signed-off-by: @BrandonStudio Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
Diffstat (limited to 'searx/engines/chinaso.py')
-rw-r--r--searx/engines/chinaso.py86
1 files changed, 83 insertions, 3 deletions
diff --git a/searx/engines/chinaso.py b/searx/engines/chinaso.py
index 23c2a2a82..ebf7682fc 100644
--- a/searx/engines/chinaso.py
+++ b/searx/engines/chinaso.py
@@ -1,5 +1,60 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
-"""ChinaSo: A search engine from ChinaSo."""
+"""ChinaSo_, a search engine for the chinese language area.
+
+.. attention::
+
+ ChinaSo engine does not return real URL, the links from these search
+ engines violate the privacy of the users!!
+
+ We try to find a solution for this problem, please follow `issue #4694`_.
+
+ As long as the problem has not been resolved, these engines are
+ not active in a standard setup (``inactive: true``).
+
+.. _ChinaSo: https://www.chinaso.com/
+.. _issue #4694: https://github.com/searxng/searxng/issues/4694
+
+Configuration
+=============
+
+The engine has the following additional settings:
+
+- :py:obj:`chinaso_category` (:py:obj:`ChinasoCategoryType`)
+- :py:obj:`chinaso_news_source` (:py:obj:`ChinasoNewsSourceType`)
+
+In the example below, all three ChinaSO engines are using the :ref:`network
+<engine network>` from the ``chinaso news`` engine.
+
+.. code:: yaml
+
+ - name: chinaso news
+ engine: chinaso
+ shortcut: chinaso
+ categories: [news]
+ chinaso_category: news
+ chinaso_news_source: all
+
+ - name: chinaso images
+ engine: chinaso
+ network: chinaso news
+ shortcut: chinasoi
+ categories: [images]
+ chinaso_category: images
+
+ - name: chinaso videos
+ engine: chinaso
+ network: chinaso news
+ shortcut: chinasov
+ categories: [videos]
+ chinaso_category: videos
+
+
+Implementations
+===============
+
+"""
+
+import typing
from urllib.parse import urlencode
from datetime import datetime
@@ -20,13 +75,31 @@ paging = True
time_range_support = True
results_per_page = 10
categories = []
-chinaso_category = 'news'
+
+ChinasoCategoryType = typing.Literal['news', 'videos', 'images']
"""ChinaSo supports news, videos, images search.
- ``news``: search for news
- ``videos``: search for videos
- ``images``: search for images
+
+In the category ``news`` you can additionally filter by option
+:py:obj:`chinaso_news_source`.
+"""
+chinaso_category = 'news'
+"""Configure ChinaSo category (:py:obj:`ChinasoCategoryType`)."""
+
+ChinasoNewsSourceType = typing.Literal['CENTRAL', 'LOCAL', 'BUSINESS', 'EPAPER', 'all']
+"""Filtering ChinaSo-News results by source:
+
+- ``CENTRAL``: central publication
+- ``LOCAL``: local publication
+- ``BUSINESS``: business publication
+- ``EPAPER``: E-Paper
+- ``all``: all sources
"""
+chinaso_news_source: ChinasoNewsSourceType = 'all'
+"""Configure ChinaSo-News type (:py:obj:`ChinasoNewsSourceType`)."""
time_range_dict = {'day': '24h', 'week': '1w', 'month': '1m', 'year': '1y'}
@@ -35,7 +108,9 @@ base_url = "https://www.chinaso.com"
def init(_):
if chinaso_category not in ('news', 'videos', 'images'):
- raise SearxEngineAPIException(f"Unsupported category: {chinaso_category}")
+ raise ValueError(f"Unsupported category: {chinaso_category}")
+ if chinaso_category == 'news' and chinaso_news_source not in typing.get_args(ChinasoNewsSourceType):
+ raise ValueError(f"Unsupported news source: {chinaso_news_source}")
def request(query, params):
@@ -56,6 +131,11 @@ def request(query, params):
'params': {'start_index': (params["pageno"] - 1) * results_per_page, 'rn': results_per_page},
},
}
+ if chinaso_news_source != 'all':
+ if chinaso_news_source == 'EPAPER':
+ category_config['news']['params']["type"] = 'EPAPER'
+ else:
+ category_config['news']['params']["cate"] = chinaso_news_source
query_params.update(category_config[chinaso_category]['params'])