From fcec4dbc06b49592b152cf0aa0b103065e7992a4 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Tue, 12 Sep 2023 11:32:13 +0200 Subject: [PATCH] [feat] engine: implementation of google icons/material design icons --- searx/engines/material_icons.py | 61 +++++++++++++++++++++++++++++++++ searx/settings.yml | 6 ++++ 2 files changed, 67 insertions(+) create mode 100644 searx/engines/material_icons.py diff --git a/searx/engines/material_icons.py b/searx/engines/material_icons.py new file mode 100644 index 000000000..68b17f4c6 --- /dev/null +++ b/searx/engines/material_icons.py @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +"""Material Icons (images) +""" + +import re +from json import loads + +about = { + "website": 'https://fonts.google.com/icons', + "wikidata_id": 'Q107315222', + "official_api_documentation": None, + "use_official_api": False, + "require_api_key": False, + "results": 'JSON', +} +search_url = "https://fonts.google.com/metadata/icons?key=material_symbols&incomplete=true" +result_url = "https://fonts.google.com/icons?icon.query={query}&selected=Material+Symbols+Outlined:{icon_name}:FILL@0{fill};wght@400;GRAD@0;opsz@24" # pylint: disable=line-too-long +img_src_url = "https://fonts.gstatic.com/s/i/short-term/release/materialsymbolsoutlined/{icon_name}/{svg_type}/24px.svg" +filled_regex = r"(fill)(ed)?" + + +def request(query, params): + params['url'] = search_url + params['query'] = query + return params + + +def response(resp): + results = [] + + query = resp.search_params["query"].lower() + json_results = loads(resp.text[5:]) + + outlined = not re.findall(filled_regex, query) + query = re.sub(filled_regex, "", query).strip() + svg_type = "fill1" if not outlined else "default" + + query_parts = query.split(" ") + + for result in json_results["icons"]: + for part in query_parts: + if part in result["name"] or part in result["tags"] or part in result["categories"]: + break + else: + continue + + tags = [tag.title() for tag in result["tags"]] + categories = [category.title() for category in result["categories"]] + + results.append( + { + 'template': 'images.html', + 'url': result_url.format(icon_name=result["name"], query=result["name"], fill=0 if outlined else 1), + 'img_src': img_src_url.format(icon_name=result["name"], svg_type=svg_type), + 'title': result["name"].replace("_", "").title(), + 'content': ", ".join(tags) + " / " + ", ".join(categories), + } + ) + + return results diff --git a/searx/settings.yml b/searx/settings.yml index a0ad7f63d..6d20261a0 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -798,6 +798,12 @@ engines: play_categ: movies disabled: true + - name: material icons + engine: material_icons + categories: images + shortcut: mi + disabled: true + - name: gpodder engine: json_engine shortcut: gpod