summaryrefslogtreecommitdiff
path: root/searx/engines
diff options
context:
space:
mode:
Diffstat (limited to 'searx/engines')
-rw-r--r--searx/engines/devicons.py63
1 files changed, 63 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