@@ -0,0 +1,100 @@
3+# @website https://invidio.us/
4+# @provide-api yes (https://github.com/omarroth/invidious/wiki/API)
9+# @parse url, title, content, publishedDate, thumbnail, embedded
11+from searx.url_utils import quote_plus
12+from dateutil import parser
15+# engine dependent config
16+categories = ["videos", "music"]
18+language_support = True
19+time_range_support = True
22+base_url = "https://invidio.us/"
26+def request(query, params):
33+ search_url = base_url + "api/v1/search?q={query}"
34+ params["url"] = search_url.format(
35+ query=quote_plus(query)
36+ ) + "&page={pageno}".format(pageno=params["pageno"])
38+ if params["time_range"] in time_range_dict:
39+ params["url"] += "&date={timerange}".format(
40+ timerange=time_range_dict[params["time_range"]]
43+ if params["language"] != "all":
44+ lang = params["language"].split("-")
46+ params["url"] += "&range={lrange}".format(lrange=lang[1])
51+# get response from search-request
55+ search_results = resp.json()
57+ '<iframe width="540" height="304" '
60+ + 'embed/{videoid}" '
61+ + 'frameborder="0" allowfullscreen></iframe>'
64+ base_invidious_url = base_url + "watch?v="
66+ for result in search_results:
67+ rtype = result.get("type", None)
69+ videoid = result.get("videoId", None)
73+ url = base_invidious_url + videoid
74+ embedded = embedded_url.format(videoid=videoid)
75+ thumbs = result.get("videoThumbnails", [])
77+ (th for th in thumbs if th["quality"] == "sddefault"), None
80+ thumbnail = thumb.get("url", "")
84+ publishedDate = parser.parse(
85+ time.ctime(result.get("published", 0))
91+ "title": result.get("title", ""),
92+ "content": result.get("description", ""),
93+ "template": "videos.html",
94+ "publishedDate": publishedDate,
95+ "embedded": embedded,
96+ "thumbnail": thumbnail,