2"""`Marginalia Search`_ is an independent open source Internet search engine
3operating out of Sweden. It is principally developed and operated by Viktor
7 https://about.marginalia-search.com/
12The engine has the following required settings:
16You can configure a Marginalia engine by:
29from __future__
import annotations
32from urllib.parse
import urlencode, quote_plus
38 "website":
"https://marginalia.nu",
40 "official_api_documentation":
"https://about.marginalia-search.com/article/api/",
41 "use_official_api":
True,
42 "require_api_key":
True,
46base_url =
"https://api.marginalia.nu"
48categories = [
"general"]
52"""To get an API key, please follow the instructions from `Key and license`_
55 https://about.marginalia-search.com/article/api/
61 """Marginalia's ApiSearchResult_ class definition.
64 https://github.com/MarginaliaSearch/MarginaliaSearch/blob/master/code/services-application/api-service/java/nu/marginalia/api/model/ApiSearchResult.java
76 """Marginalia's ApiSearchResults_ class definition.
79 https://github.com/MarginaliaSearch/MarginaliaSearch/blob/master/code/services-application/api-service/java/nu/marginalia/api/model/ApiSearchResults.java
84 results: list[ApiSearchResult]
87def request(query: str, params: dict[str, t.Any]):
90 "count": results_per_page,
91 "nsfw": min(params[
"safesearch"], 1),
94 params[
"url"] = f
"{base_url}/{api_key}/search/{quote_plus(query)}?{urlencode(query_params)}"
95 params[
"headers"][
"User-Agent"] = searxng_useragent()
101 resp_json: ApiSearchResults = resp.json()
103 for item
in resp_json.get(
"results", []):
105 res.types.MainResult(
108 content=item.get(
"description",
""),
115def init(engine_settings: dict[str, t.Any]):
117 _api_key = engine_settings.get(
"api_key")
119 logger.error(
"missing api_key: see https://about.marginalia-search.com/article/api")
122 if _api_key ==
"public":
123 logger.error(
"invalid api_key (%s): see https://about.marginalia-search.com/article/api", api_key)
init(dict[str, t.Any] engine_settings)
request(str query, dict[str, t.Any] params)
response(SXNG_Response resp)