.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
demo_online.py
Go to the documentation of this file.
1# SPDX-License-Identifier: AGPL-3.0-or-later
2"""Within this module we implement a *demo online engine*. Do not look to
3close to the implementation, its just a simple example which queries `The Art
4Institute of Chicago <https://www.artic.edu>`_
5
6To get in use of this *demo* engine add the following entry to your engines
7list in ``settings.yml``:
8
9.. code:: yaml
10
11 - name: my online engine
12 engine: demo_online
13 shortcut: demo
14 disabled: false
15
16"""
17
18import typing as t
19
20from json import loads
21from urllib.parse import urlencode
22from searx.result_types import EngineResults
23
24if t.TYPE_CHECKING:
25 from searx.extended_types import SXNG_Response
26
27
28engine_type = "online"
29send_accept_language_header = True
30categories = ["general"]
31disabled = True
32timeout = 2.0
33categories = ["images"]
34paging = True
35page_size = 20
36
37search_api = "https://api.artic.edu/api/v1/artworks/search?"
38image_api = "https://www.artic.edu/iiif/2/"
39
40about = {
41 "website": "https://www.artic.edu",
42 "wikidata_id": "Q239303",
43 "official_api_documentation": "http://api.artic.edu/docs/",
44 "use_official_api": True,
45 "require_api_key": False,
46 "results": "JSON",
47}
48
49
50# if there is a need for globals, use a leading underline
51_my_online_engine = None
52
53
54def init(engine_settings: dict[str, t.Any]) -> None:
55 """Initialization of the (online) engine. If no initialization is needed, drop
56 this init function."""
57 global _my_online_engine # pylint: disable=global-statement
58 _my_online_engine = engine_settings.get("name")
59
60
61def request(query: str, params: dict[str, t.Any]) -> None:
62 """Build up the ``params`` for the online request. In this example we build a
63 URL to fetch images from `artic.edu <https://artic.edu>`__
64
65 """
66 args = urlencode(
67 {
68 "q": query,
69 "page": params["pageno"],
70 "fields": "id,title,artist_display,medium_display,image_id,date_display,dimensions,artist_titles",
71 "limit": page_size,
72 }
73 )
74 params["url"] = search_api + args
75
76
77def response(resp: "SXNG_Response") -> EngineResults:
78 """Parse out the result items from the response. In this example we parse the
79 response from `api.artic.edu <https://artic.edu>`__ and filter out all
80 images.
81
82 """
83 res = EngineResults()
84 json_data = loads(resp.text)
85
86 res.add(
87 res.types.Answer(
88 answer="this is a dummy answer ..",
89 url="https://example.org",
90 )
91 )
92
93 for result in json_data["data"]:
94
95 if not result["image_id"]:
96 continue
97
98 kwargs: dict[str, t.Any] = {
99 "url": "https://artic.edu/artworks/%(id)s" % result,
100 "title": result["title"] + " (%(date_display)s) // %(artist_display)s" % result,
101 "content": "%(medium_display)s // %(dimensions)s" % result,
102 "author": ", ".join(result["artist_titles"]),
103 "img_src": image_api + "/%(image_id)s/full/843,/0/default.jpg" % result,
104 "template": "images.html",
105 }
106
107 res.add(res.types.LegacyResult(**kwargs))
108
109 return res
None request(str query, dict[str, t.Any] params)
EngineResults response("SXNG_Response" resp)
None init(dict[str, t.Any] engine_settings)