diff options
| author | Daniel Kukula <daniel.kuku@gmail.com> | 2024-05-14 20:06:20 +0100 |
|---|---|---|
| committer | Markus Heiser <markus.heiser@darmarIT.de> | 2024-05-17 16:37:39 +0200 |
| commit | a49232ee29aa01e5ef2a825bec5f09021a69e0cc (patch) | |
| tree | 66399f549239c23617e7d41a88001e80101bf4de /searx/engines | |
| parent | 3585d71f99d37b58fff4c6238e95cf1fd3391898 (diff) | |
[feat] engine: implementation of cargo search (crates.io)
Diffstat (limited to 'searx/engines')
| -rw-r--r-- | searx/engines/crates.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/searx/engines/crates.py b/searx/engines/crates.py new file mode 100644 index 000000000..a87ef42c8 --- /dev/null +++ b/searx/engines/crates.py @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Cargo search on crates.io""" + +from collections import OrderedDict +from urllib.parse import urlencode + +from dateutil import parser + +about = { + "website": "https://crates.io/", + "wikidata_id": None, + "official_api_documentation": "https://crates.io/data-access", + "use_official_api": True, + "require_api_key": False, + "results": "JSON", +} + +categories = ["it", "packages", "cargo"] + + +# engine dependent config +paging = True +page_size = 10 +search_url = "https://crates.io/api/v1/crates" + +linked_terms = OrderedDict( + [ + ("homepage", "Project homepage"), + ("documentation", "Documentation"), + ("repository", "Source code"), + ] +) + + +def request(query: str, params): + + args = urlencode({"page": params["pageno"], "q": query, "per_page": page_size}) + params["url"] = f"{search_url}?{args}" + return params + + +def response(resp): + results = [] + + for package in resp.json()["crates"]: + + published_date = package.get("updated_at") + published_date = parser.parse(published_date) + + links = {} + for k, v in linked_terms.items(): + l = package.get(k) + if l: + links[v] = l + + results.append( + { + "template": "packages.html", + "url": f'https://crates.io/crates/{package["name"]}', + "title": package["name"], + "package_name": package["name"], + "tags": package["keywords"], + "content": package["description"], + "version": package["newest_version"] or package["max_version"] or package["max_stable_version"], + "publishedDate": published_date, + "links": links, + } + ) + + return results |