diff --git a/searx/engines/startpagina.py b/searx/engines/startpagina.py new file mode 100644 index 000000000..31b007316 --- /dev/null +++ b/searx/engines/startpagina.py @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Startpagina is a Netherlands search engine by `Kompas`_. It takes all its +results from Google. + +.. _Kompas: https://www.kompaspublishing.nl/ +""" + +import typing as t +from urllib.parse import urlencode + +from dateutil import parser + +from searx.utils import format_duration +from searx.result_types import EngineResults + +if t.TYPE_CHECKING: + from searx.extended_types import SXNG_Response + from searx.search.processors import OnlineParams + +about = { + "website": "https://startpagina.nl", + "wikidata_id": None, + "official_api_documentation": None, + "use_official_api": False, + "require_api_key": False, + "results": "JSON", +} + +language = "ne" +paging = True +safesearch = True + +categories = ["general"] +startpagina_categ = "web" +"""Category to search in. Can be either "web", "images", "videos" or "news".""" +page_size = 10 + + +api_url = "https://search.kompas.services" + + +def init(_): + if startpagina_categ not in ("web", "images", "videos", "news"): + raise ValueError("invalid search type: %s" % startpagina_categ) + + +def request(query: str, params: "OnlineParams") -> None: + args = {"q": query, "page_size": page_size, "page": params["pageno"]} + params["url"] = f"{api_url}/api/v2/search/{startpagina_categ}/?{urlencode(args)}" + + +def response(resp: "SXNG_Response"): + res = EngineResults() + + json_resp = resp.json() + + for result in json_resp["results"]: + if startpagina_categ == "web": + res.add( + res.types.MainResult( + url=result["original_url"], + title=result["title"], + content=result["description"], + ) + ) + elif startpagina_categ == "news": + publishedDate = None + try: + publishedDate = parser.parse(result["date"]) + except parser.ParserError: + pass + + res.add( + res.types.MainResult( + url=result["original_url"], + title=result["title"], + content=result["description"], + thumbnail=result["image"]["thumbnail_url"], + publishedDate=publishedDate, + ) + ) + elif startpagina_categ == "videos": + res.add( + res.types.LegacyResult( + template="videos.html", + url=result["original_url"], + title=result["title"], + content=result["description"], + thumbnail=result["video"]["thumbnail_url"], + length=format_duration(result["video"]["duration"]), + ) + ) + elif startpagina_categ == "images": + res.add( + res.types.Image( + url=result["original_url"], + title=result["title"], + content=result["description"], + thumbnail_src=result["image"]["thumbnail_url"], + resolution=f"{result['image']['width']}x{result['image']['height']}", + ) + ) + + for related in json_resp["related_searches"]: + res.add(res.types.LegacyResult(suggestion=related["query"])) + + return res diff --git a/searx/settings.yml b/searx/settings.yml index 8f497b35c..9b665c579 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -3013,6 +3013,38 @@ engines: disabled: true inactive: true + - name: startpagina + engine: startpagina + shortcut: spnl + startpagina_categ: web + categories: general + disabled: true + inactive: true + + - name: startpagina images + engine: startpagina + shortcut: spnli + startpagina_categ: images + categories: images + disabled: true + inactive: true + + - name: startpagina videos + engine: startpagina + shortcut: spnlv + startpagina_categ: videos + categories: videos + disabled: true + inactive: true + + - name: startpagina news + engine: startpagina + shortcut: spnln + startpagina_categ: news + categories: news + disabled: true + inactive: true + - name: swisscows engine: swisscows categories: general