diff options
author | Bnyro <bnyro@tutanota.com> | 2024-02-11 13:56:30 +0100 |
---|---|---|
committer | Markus Heiser <markus.heiser@darmarIT.de> | 2024-02-23 07:50:48 +0100 |
commit | cfbe59b6b307b6808613f0ca6c0860c50526f443 (patch) | |
tree | 09e337fa9bacc7fee05eaabc997c7bc51f638ec7 /searx/engines/mozhi.py | |
parent | 3c42252c78faac3131dbeceea22c7f5f2e6df432 (diff) | |
download | searxng-cfbe59b6b307b6808613f0ca6c0860c50526f443.tar.gz searxng-cfbe59b6b307b6808613f0ca6c0860c50526f443.zip |
[feat] engine: implementation of mozhi
Diffstat (limited to 'searx/engines/mozhi.py')
-rw-r--r-- | searx/engines/mozhi.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/searx/engines/mozhi.py b/searx/engines/mozhi.py new file mode 100644 index 000000000..3494e1863 --- /dev/null +++ b/searx/engines/mozhi.py @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +"""Mozhi (alternative frontend for popular translation engines)""" + +import random +import re +from urllib.parse import urlencode + +about = { + "website": 'https://codeberg.org/aryak/mozhi', + "wikidata_id": None, + "official_api_documentation": 'https://mozhi.aryak.me/api/swagger/index.html', + "use_official_api": True, + "require_api_key": False, + "results": 'JSON', +} + +engine_type = 'online_dictionary' +categories = ['general'] + +base_url = "https://mozhi.aryak.me" +mozhi_engine = "google" + +re_transliteration_unsupported = "Direction '.*' is not supported" + + +def request(_query, params): + request_url = random.choice(base_url) if isinstance(base_url, list) else base_url + + args = {'from': params['from_lang'][1], 'to': params['to_lang'][1], 'text': params['query'], 'engine': mozhi_engine} + params['url'] = f"{request_url}/api/translate?{urlencode(args)}" + return params + + +def response(resp): + translation = resp.json() + + infobox = "" + + if translation['target_transliteration'] and not re.match( + re_transliteration_unsupported, translation['target_transliteration'] + ): + infobox = f"<b>{translation['target_transliteration']}</b>" + + if translation['word_choices']: + for word in translation['word_choices']: + infobox += f"<dl><dt>{word['word']}</dt>" + + for example in word['examples_target']: + infobox += f"<dd>{re.sub(r'<|>', '', example)}</dd>" + + infobox += "</dl>" + + result = { + 'infobox': translation['translated-text'], + 'content': infobox, + } + + return [result] |