Browse Source

[fix] invidious engine: store random base_url in param

Two different threads ( = two different user queries) can call the request
function in a row and then the response function.  The namespace will be same
since this is the same engine.

To keep exactly the same value ``base_url`` must be stored in params and then
retrieve using ``resp.search_params["base_url"]``.

Suggested-by: @dalf https://github.com/searxng/searxng/pull/862#discussion_r799324861
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Markus Heiser 3 years ago
parent
commit
e2ec6b4211
2 changed files with 13 additions and 17 deletions
  1. 8 12
      searx/engines/invidious.py
  2. 5 5
      searx/settings.yml

+ 8 - 12
searx/engines/invidious.py

@@ -23,16 +23,12 @@ categories = ["videos", "music"]
 paging = True
 time_range_support = True
 
-
-# search-url
-
-base_url = ''
-base_url_rand = ''
+# base_url can be overwritten by a list of URLs in the settings.yml
+base_url = 'https://vid.puffyan.us'
 
 
 # do search-request
 def request(query, params):
-    global base_url_rand
     time_range_dict = {
         "day": "today",
         "week": "week",
@@ -41,11 +37,11 @@ def request(query, params):
     }
 
     if isinstance(base_url, list):
-        base_url_rand = random.choice(base_url)
+        params["base_url"] = random.choice(base_url)
     else:
-        base_url_rand = base_url
+        params["base_url"] = base_url
 
-    search_url = base_url_rand + "api/v1/search?q={query}"
+    search_url = params["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:
@@ -67,12 +63,12 @@ def response(resp):
     embedded_url = (
         '<iframe width="540" height="304" '
         + 'data-src="'
-        + base_url_rand
-        + 'embed/{videoid}" '
+        + resp.search_params['base_url']
+        + '/embed/{videoid}" '
         + 'frameborder="0" allowfullscreen></iframe>'
     )
 
-    base_invidious_url = base_url_rand + "watch?v="
+    base_invidious_url = resp.search_params['base_url'] + "/watch?v="
 
     for result in search_results:
         rtype = result.get("type", None)

+ 5 - 5
searx/settings.yml

@@ -786,11 +786,11 @@ engines:
     # Instanes will be selected randomly, see https://api.invidious.io/ for
     # instances that are stable (good uptime) and close to you.
     base_url:
-      - https://invidious.snopyta.org/
-      - https://vid.puffyan.us/
-      - https://invidious.kavin.rocks/
-      - https://invidio.xamh.de/
-      - https://inv.riverside.rocks/
+      - https://invidious.snopyta.org
+      - https://vid.puffyan.us
+      # - https://invidious.kavin.rocks  # Error 1020 // Access denied by Cloudflare
+      - https://invidio.xamh.de
+      - https://inv.riverside.rocks
     shortcut: iv
     timeout: 3.0
     disabled: true