summaryrefslogtreecommitdiff
path: root/searx/engines/lingva.py
blob: 124499719a42c42b9109dba4da6ba90fbe9b7b16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""Lingva (alternative Google Translate frontend)"""

from json import loads

about = {
    "website": 'https://lingva.ml',
    "wikidata_id": None,
    "official_api_documentation": 'https://github.com/thedaviddelta/lingva-translate#public-apis',
    "use_official_api": True,
    "require_api_key": False,
    "results": 'JSON',
}

engine_type = 'online_dictionary'
categories = ['general']

url = "https://lingva.thedaviddelta.com/"
search_url = "{url}/api/v1/{from_lang}/{to_lang}/{query}"


def request(_query, params):
    params['url'] = search_url.format(
        url=url, from_lang=params['from_lang'][1], to_lang=params['to_lang'][1], query=params['query']
    )
    return params


def response(resp):
    results = []

    result = loads(resp.text)
    info = result["info"]
    from_to_prefix = "%s-%s " % (resp.search_params['from_lang'][1], resp.search_params['to_lang'][1])

    if "typo" in info:
        results.append({"suggestion": from_to_prefix + info["typo"]})

    if 'definitions' in info:  # pylint: disable=too-many-nested-blocks
        for definition in info['definitions']:
            if 'list' in definition:
                for item in definition['list']:
                    if 'synonyms' in item:
                        for synonym in item['synonyms']:
                            results.append({"suggestion": from_to_prefix + synonym})

    infobox = ""

    for translation in info["extraTranslations"]:
        infobox += f"<b>{translation['type']}</b>"

        for word in translation["list"]:
            infobox += f"<dl><dt>{word['word']}</dt>"

            for meaning in word["meanings"]:
                infobox += f"<dd>{meaning}</dd>"

            infobox += "</dl>"

    results.append(
        {
            'infobox': result["translation"],
            'content': infobox,
        }
    )

    return results