diff --git a/searx/engines/piped.py b/searx/engines/piped.py index c34ab198f..7f6902777 100644 --- a/searx/engines/piped.py +++ b/searx/engines/piped.py @@ -9,6 +9,29 @@ design. `Piped’s architecture`_ consists of 3 components: .. _Piped’s architecture: https://docs.piped.video/docs/architecture/ +Configuration +============= + +The :py:obj:`backend_url` and :py:obj:`frontend_url` has to be set in the engine +named `piped` and are used by all piped engines + +.. code:: yaml + + - name: piped + engine: piped + piped_filter: videos + ... + frontend_url: https://.. + backend_url: + - https://.. + - https://.. + + - name: piped.music + engine: piped + network: piped + shortcut: ppdm + piped_filter: music_songs + ... """ from __future__ import annotations @@ -16,6 +39,7 @@ from __future__ import annotations import time import random from urllib.parse import urlencode +import datetime from dateutil import parser # about @@ -29,11 +53,11 @@ about = { } # engine dependent config -categories = ["videos", "music"] +categories = [] paging = False # search-url -backend_url: list|str = "https://pipedapi.kavin.rocks" +backend_url: list | str = "https://pipedapi.kavin.rocks" """Piped-Backend_: The core component behind Piped. The value is an URL or a list of URLs. In the latter case instance will be selected randomly. For a complete list of offical instances see Piped-Instances (`JSON @@ -50,17 +74,29 @@ frontend_url: str = "https://piped.video" .. _Piped-Frontend: https://github.com/TeamPiped/Piped """ -content_filter = 'videos' -"""Content filter ``music_albums`` or ``videos``""" +piped_filter = 'all' +"""Content filter ``music_songs`` or ``videos``""" + + +def _backend_url() -> str: + from searx.engines import engines # pylint: disable=import-outside-toplevel + + url = engines['piped'].backend_url # type: ignore + if isinstance(url, list): + url = random.choice(url) + return url + + +def _frontend_url() -> str: + from searx.engines import engines # pylint: disable=import-outside-toplevel + + return engines['piped'].frontend_url # type: ignore + def request(query, params): - if isinstance(backend_url, list): - base_url = random.choice(backend_url) - else: - base_url = backend_url query = urlencode({'q': query}) - params["url"] = base_url + f"/search?{query}&filter={content_filter}" + params["url"] = _backend_url() + f"/search?{query}&filter={piped_filter}" return params @@ -73,17 +109,27 @@ def response(resp): for result in search_results: publishedDate = parser.parse(time.ctime(result.get("uploaded", 0) / 1000)) - results.append( - { - # the api url differs from the frontend, hence use piped.video as default - "url": frontend_url + result.get("url", ""), - "title": result.get("title", ""), - "content": result.get("shortDescription", ""), - "template": "videos.html", - "publishedDate": publishedDate, - "iframe_src": frontend_url + '/embed' + result.get("url", ""), - "thumbnail": result.get("thumbnail", ""), - } - ) + item = { + # the api url differs from the frontend, hence use piped.video as default + "url": _frontend_url() + result.get("url", ""), + "title": result.get("title", ""), + "publishedDate": publishedDate, + "iframe_src": _frontend_url() + '/embed' + result.get("url", ""), + } + + if piped_filter == 'videos': + item["template"] = "videos.html" + item["content"] = result.get("shortDescription", "") + item["thumbnail"] = result.get("thumbnail", "") + + elif piped_filter == 'music_songs': + item["template"] = "default.html" + item["img_src"] = result.get("thumbnail", "") + item["content"] = result.get("uploaderName", "") + length = result.get("duration") + if length: + item["length"] = datetime.timedelta(seconds=length) + + results.append(item) return results diff --git a/searx/settings.yml b/searx/settings.yml index 4d5992354..0c6898d0f 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -1137,16 +1137,26 @@ engines: - name: piped engine: piped + shortcut: ppd + categories: videos + piped_filter: videos + timeout: 3.0 + + # URL to use as link and for embeds + frontend_url: https://srv.piped.video # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ backend_url: - https://pipedapi.kavin.rocks - https://pipedapi-libre.kavin.rocks - https://pipedapi.adminforge.de - # URL to use as link and for embeds - frontend_url: https://srv.piped.video - shortcut: ppd + + - name: piped.music + engine: piped + network: piped + shortcut: ppdm + categories: music + piped_filter: music_songs timeout: 3.0 - disabled: true - name: piratebay engine: piratebay