diff options
author | Markus Heiser <markus.heiser@darmarit.de> | 2023-07-28 21:55:21 +0200 |
---|---|---|
committer | Markus Heiser <markus.heiser@darmarIT.de> | 2023-08-03 16:23:36 +0200 |
commit | ef5831cd848b276449f57173120e1e86cb573541 (patch) | |
tree | be2ff0f176a5e680f094be7396fb4380dc413f98 /searx/engines/piped.py | |
parent | 7aa95d2d52501b01d8c289c82ca79475cbf0da34 (diff) | |
download | searxng-ef5831cd848b276449f57173120e1e86cb573541.tar.gz searxng-ef5831cd848b276449f57173120e1e86cb573541.zip |
[mod] engine piped: split into two dedicated engiens for video & music
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Diffstat (limited to 'searx/engines/piped.py')
-rw-r--r-- | searx/engines/piped.py | 88 |
1 files changed, 67 insertions, 21 deletions
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 |