diff options
Diffstat (limited to 'searx/engines/gitea.py')
-rw-r--r-- | searx/engines/gitea.py | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/searx/engines/gitea.py b/searx/engines/gitea.py new file mode 100644 index 000000000..3775938ed --- /dev/null +++ b/searx/engines/gitea.py @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Engine to search in collaborative software platforms based on Gitea_. + +.. _Gitea: https://about.gitea.com/ + +Configuration +============= + +The engine has the following mandatory setting: + +- :py:obj:`base_url` + +Optional settings are: + +- :py:obj:`sort` +- :py:obj:`order` +- :py:obj:`page_size` + +.. code:: yaml + + - name: gitea.com + engine: gitea + base_url: https://gitea.com + shortcut: gitea + +If you would like to use additional instances, just configure new engines in the +:ref:`settings <settings engine>` and set the ``base_url``. + + +Implementation +============== + +""" + +from urllib.parse import urlencode +from dateutil import parser + +about = { + "website": 'https://about.gitea.com', + "wikidata_id": None, + "official_api_documentation": 'https://docs.gitea.com/next/development/api-usage', + "use_official_api": True, + "require_api_key": False, + "results": 'JSON', +} + +categories = ['it', 'repos'] +paging = True + +base_url: str = '' +"""URL of the Gitea_ instance.""" + +sort: str = "updated" +"""Sort criteria, possible values: + +- ``updated`` (default) +- ``alpha`` +- ``created`` +- ``size`` +- ``id`` +""" + +order = "desc" +"""Sort order, possible values: + +- ``desc`` (default) +- ``asc`` +""" + +page_size: int = 10 +"""Maximum number of results per page (default 10).""" + + +def init(_): + if not base_url: + raise ValueError('gitea engine: base_url is unset') + + +def request(query, params): + args = {'q': query, 'limit': page_size, 'sort': sort, 'order': order, 'page': params['pageno']} + params['url'] = f"{base_url}/api/v1/repos/search?{urlencode(args)}" + + return params + + +def response(resp): + results = [] + + for item in resp.json().get('data', []): + content = [item.get(i) for i in ['language', 'description'] if item.get(i)] + + results.append( + { + 'template': 'packages.html', + 'url': item.get('html_url'), + 'title': item.get('full_name'), + 'content': ' / '.join(content), + 'img_src': item.get('owner', {}).get('avatar_url'), + 'package_name': item.get('name'), + 'maintainer': item.get('owner', {}).get('login'), + 'publishedDate': parser.parse(item.get("updated_at") or item.get("created_at")), + 'tags': item.get('topics', []), + 'popularity': item.get('stargazers_count'), + 'homepage': item.get('homepage'), + 'source_code_url': item.get('clone_url'), + } + ) + + return results |