diff options
| author | Bnyro <bnyro@tutanota.com> | 2025-11-12 10:13:11 +0100 |
|---|---|---|
| committer | Bnyro <bnyro@tutanota.com> | 2025-11-14 20:26:43 +0100 |
| commit | ba98030438b24b9e6f95fb2cf264d922f5fd71e5 (patch) | |
| tree | da03b8306675e0563a8b16f086727c424258b4a0 | |
| parent | 1e200a1107bddf3cb801ecea1654b521e849ad83 (diff) | |
[feat] engines: add devicons engine
- official website: https://devicon.dev/
- the engine contains a lot of icons of popular software frameworks (e.g. pytest),
so they could for example be useful for visualizing a diagram of the tech stack used in an app
| -rw-r--r-- | searx/engines/devicons.py | 63 | ||||
| -rw-r--r-- | searx/settings.yml | 5 |
2 files changed, 68 insertions, 0 deletions
diff --git a/searx/engines/devicons.py b/searx/engines/devicons.py new file mode 100644 index 000000000..16ae4cc38 --- /dev/null +++ b/searx/engines/devicons.py @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Devicons (icons)""" + +import typing as t + +from searx.result_types import EngineResults + +if t.TYPE_CHECKING: + from extended_types import SXNG_Response + from search.processors.online import OnlineParams + + +about = { + "website": "https://devicon.dev/", + "wikidata_id": None, + "official_api_documentation": None, + "use_official_api": True, + "results": "JSON", +} + +cdn_base_url = "https://cdn.jsdelivr.net/gh/devicons/devicon@latest" +categories = ["images", "icons"] + + +def request(query: str, params: "OnlineParams"): + params["url"] = f"{cdn_base_url}/devicon.json" + params['query'] = query + return params + + +def response(resp: "SXNG_Response") -> EngineResults: + res = EngineResults() + query_parts = resp.search_params["query"].lower().split(" ") + + def is_result_match(result: dict[str, t.Any]) -> bool: + for part in query_parts: + if part in result["name"]: + return True + + for tag in result["altnames"] + result["tags"]: + if part in tag: + return True + + return False + + filtered_results = filter(is_result_match, resp.json()) + for result in filtered_results: + for image_type in result["versions"]["svg"]: + img_src = f"{cdn_base_url}/icons/{result['name']}/{result['name']}-{image_type}.svg" + res.add( + res.types.LegacyResult( + { + "template": "images.html", + "url": img_src, + "title": result["name"], + "content": f"Base color: {result['color']}", + "img_src": img_src, + "img_format": "SVG", + } + ) + ) + + return res diff --git a/searx/settings.yml b/searx/settings.yml index 3f29f486f..afb62b397 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -736,6 +736,11 @@ engines: shortcut: da timeout: 3.0 + - name: devicons + engine: devicons + shortcut: di + timeout: 3.0 + - name: ddg definitions engine: duckduckgo_definitions shortcut: ddd |