From 4dc792e1e2d3771b6d6620f5d564ea091597c4dc Mon Sep 17 00:00:00 2001 From: cy8aer Date: Fri, 2 Aug 2019 13:25:25 +0200 Subject: [PATCH] [enh] add invidious engine. (#1657) closes #1372 --- searx/engines/invidious.py | 100 ++++++++++++++++++ searx/settings.yml | 6 ++ .../themes/oscar/img/icons/invidious.png | Bin 0 -> 3427 bytes 3 files changed, 106 insertions(+) create mode 100644 searx/engines/invidious.py create mode 100644 searx/static/themes/oscar/img/icons/invidious.png diff --git a/searx/engines/invidious.py b/searx/engines/invidious.py new file mode 100644 index 00000000..8d81691f --- /dev/null +++ b/searx/engines/invidious.py @@ -0,0 +1,100 @@ +# Invidious (Videos) +# +# @website https://invidio.us/ +# @provide-api yes (https://github.com/omarroth/invidious/wiki/API) +# +# @using-api yes +# @results JSON +# @stable yes +# @parse url, title, content, publishedDate, thumbnail, embedded + +from searx.url_utils import quote_plus +from dateutil import parser +import time + +# engine dependent config +categories = ["videos", "music"] +paging = True +language_support = True +time_range_support = True + +# search-url +base_url = "https://invidio.us/" + + +# do search-request +def request(query, params): + time_range_dict = { + "day": "today", + "week": "week", + "month": "month", + "year": "year", + } + search_url = base_url + "api/v1/search?q={query}" + params["url"] = search_url.format( + query=quote_plus(query) + ) + "&page={pageno}".format(pageno=params["pageno"]) + + if params["time_range"] in time_range_dict: + params["url"] += "&date={timerange}".format( + timerange=time_range_dict[params["time_range"]] + ) + + if params["language"] != "all": + lang = params["language"].split("-") + if len(lang) == 2: + params["url"] += "&range={lrange}".format(lrange=lang[1]) + + return params + + +# get response from search-request +def response(resp): + results = [] + + search_results = resp.json() + embedded_url = ( + '' + ) + + base_invidious_url = base_url + "watch?v=" + + for result in search_results: + rtype = result.get("type", None) + if rtype == "video": + videoid = result.get("videoId", None) + if not videoid: + continue + + url = base_invidious_url + videoid + embedded = embedded_url.format(videoid=videoid) + thumbs = result.get("videoThumbnails", []) + thumb = next( + (th for th in thumbs if th["quality"] == "sddefault"), None + ) + if thumb: + thumbnail = thumb.get("url", "") + else: + thumbnail = "" + + publishedDate = parser.parse( + time.ctime(result.get("published", 0)) + ) + + results.append( + { + "url": url, + "title": result.get("title", ""), + "content": result.get("description", ""), + "template": "videos.html", + "publishedDate": publishedDate, + "embedded": embedded, + "thumbnail": thumbnail, + } + ) + + return results diff --git a/searx/settings.yml b/searx/settings.yml index 490b3af0..504a9fbe 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -392,6 +392,12 @@ engines: timeout : 6.0 disabled : True + - name : invidious + engine : invidious + base_url : 'https://invidio.us/' + shortcut: iv + timeout : 5.0 + - name: kickass engine : kickass shortcut : kc diff --git a/searx/static/themes/oscar/img/icons/invidious.png b/searx/static/themes/oscar/img/icons/invidious.png new file mode 100644 index 0000000000000000000000000000000000000000..a94c969d8a43f4096eb2bc20e6028a8579b98380 GIT binary patch literal 3427 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