summaryrefslogtreecommitdiff
path: root/searx/engines/lemmy.py
diff options
context:
space:
mode:
authorBnyro <bnyro@tutanota.com>2023-08-07 13:04:26 +0200
committerMarkus Heiser <markus.heiser@darmarIT.de>2023-08-10 12:58:40 +0200
commit224f2250ae5dfc2adc018a7fec0c3fa9fd7aab67 (patch)
tree2467b0394373aab913b6e55c1087fd5f9d4b150f /searx/engines/lemmy.py
parent9f82c3961090047509330498a62338effdacd1a3 (diff)
downloadsearxng-224f2250ae5dfc2adc018a7fec0c3fa9fd7aab67.tar.gz
searxng-224f2250ae5dfc2adc018a7fec0c3fa9fd7aab67.zip
[feat] engine: support for lemmy communities, posts, comments and users
Diffstat (limited to 'searx/engines/lemmy.py')
-rw-r--r--searx/engines/lemmy.py157
1 files changed, 157 insertions, 0 deletions
diff --git a/searx/engines/lemmy.py b/searx/engines/lemmy.py
new file mode 100644
index 000000000..2ab051e57
--- /dev/null
+++ b/searx/engines/lemmy.py
@@ -0,0 +1,157 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# lint: pylint
+"""This engine uses the Lemmy API (https://lemmy.ml/api/v3/search), which is
+documented at `lemmy-js-client`_ / `Interface Search`_. Since Lemmy is
+federated, results are from many different, independent lemmy instances, and not
+only the official one.
+
+.. _lemmy-js-client: https://join-lemmy.org/api/modules.html
+.. _Interface Search: https://join-lemmy.org/api/interfaces/Search.html
+
+Configuration
+=============
+
+The engine has the following additional settings:
+
+- :py:obj:`base_url`
+- :py:obj:`lemmy_type`
+
+This implementation is used by different lemmy engines in the :ref:`settings.yml
+<settings engine>`:
+
+.. code:: yaml
+
+ - name: lemmy communities
+ lemmy_type: Communities
+ ...
+ - name: lemmy users
+ lemmy_type: Users
+ ...
+ - name: lemmy posts
+ lemmy_type: Posts
+ ...
+ - name: lemmy comments
+ lemmy_type: Comments
+ ...
+
+Implementations
+===============
+
+"""
+
+from urllib.parse import urlencode
+from markdown_it import MarkdownIt
+from searx.utils import html_to_text
+
+about = {
+ "website": 'https://lemmy.ml/',
+ "wikidata_id": 'Q84777032',
+ "official_api_documentation": "https://join-lemmy.org/api/",
+ "use_official_api": True,
+ "require_api_key": False,
+ "results": 'JSON',
+}
+paging = True
+categories = ['general', 'social media']
+
+base_url = "https://lemmy.ml/"
+"""By default, https://lemmy.ml is used for providing the results. If you want
+to use a different lemmy instance, you can specify ``base_url``.
+"""
+
+lemmy_type = "Communities"
+"""Any of ``Communities``, ``Users``, ``Posts``, ``Comments``"""
+
+
+def request(query, params):
+ args = {
+ 'q': query,
+ 'page': params['pageno'],
+ 'type_': lemmy_type,
+ }
+
+ params['url'] = f"{base_url}api/v3/search?{urlencode(args)}"
+ return params
+
+
+def _format_content(content):
+ html = MarkdownIt("commonmark", {"typographer": True}).enable(["replacements", "smartquotes"]).render(content)
+ return html_to_text(html)
+
+
+def _get_communities(json):
+ results = []
+
+ for result in json["communities"]:
+ results.append(
+ {
+ 'url': result['community']['actor_id'],
+ 'title': result['community']['title'],
+ 'content': _format_content(result['community'].get('description', '')),
+ }
+ )
+
+ return results
+
+
+def _get_users(json):
+ results = []
+
+ for result in json["users"]:
+ results.append(
+ {
+ 'url': result['person']['actor_id'],
+ 'title': result['person']['name'],
+ 'content': _format_content(result['person'].get('bio', '')),
+ }
+ )
+
+ return results
+
+
+def _get_posts(json):
+ results = []
+
+ for result in json["posts"]:
+ results.append(
+ {
+ 'url': result['post']['ap_id'],
+ 'title': result['post']['name'],
+ 'content': _format_content(result['post'].get('body', '')),
+ }
+ )
+
+ return results
+
+
+def _get_comments(json):
+ results = []
+
+ for result in json["comments"]:
+ results.append(
+ {
+ 'url': result['comment']['ap_id'],
+ 'title': result['post']['name'],
+ 'content': _format_content(result['comment']['content']),
+ }
+ )
+
+ return results
+
+
+def response(resp):
+ json = resp.json()
+
+ if lemmy_type == "Communities":
+ return _get_communities(json)
+
+ if lemmy_type == "Users":
+ return _get_users(json)
+
+ if lemmy_type == "Posts":
+ return _get_posts(json)
+
+ if lemmy_type == "Comments":
+ return _get_comments(json)
+
+ raise ValueError(f"Unsupported lemmy type: {lemmy_type}")