We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
findx crashes
... with message on web page: findx (unexpected crash: string indices must be integers) 

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `searx/engines/findx.py`
Content:
```
1 """
2 FindX (General, Images, Videos)
3 
4 @website     https://www.findx.com
5 @provide-api no
6 @using-api   no
7 @results     HTML
8 @stable      no
9 @parse       url, title, content, embedded, img_src, thumbnail_src
10 """
11 
12 from dateutil import parser
13 from json import loads
14 import re
15 
16 from lxml import html
17 
18 from searx import logger
19 from searx.engines.xpath import extract_text
20 from searx.engines.youtube_noapi import base_youtube_url, embedded_url
21 from searx.url_utils import urlencode
22 
23 
24 paging = True
25 results_xpath = '//script[@id="initial-state"]'
26 search_url = 'https://www.findx.com/{category}?{q}'
27 type_map = {
28     'none': 'web',
29     'general': 'web',
30     'images': 'images',
31     'videos': 'videos',
32 }
33 
34 
35 def request(query, params):
36     params['url'] = search_url.format(
37         category=type_map[params['category']],
38         q=urlencode({
39             'q': query,
40             'page': params['pageno']
41         })
42     )
43     return params
44 
45 
46 def response(resp):
47     dom = html.fromstring(resp.text)
48     results_raw_json = dom.xpath(results_xpath)
49     results_json = loads(extract_text(results_raw_json))
50 
51     if len(results_json['web']['results']) > 0:
52         return _general_results(results_json['web']['results'])
53 
54     if len(results_json['images']['results']) > 0:
55         return _images_results(results_json['images']['results'])
56 
57     if len(results_json['video']['results']) > 0:
58         return _videos_results(results_json['video']['results'])
59 
60     return []
61 
62 
63 def _general_results(general_results):
64     results = []
65     for result in general_results:
66         results.append({
67             'url': result['url'],
68             'title': result['title'],
69             'content': result['sum'],
70         })
71     return results
72 
73 
74 def _images_results(image_results):
75     results = []
76     for result in image_results:
77         results.append({
78             'url': result['sourceURL'],
79             'title': result['title'],
80             'content': result['source'],
81             'thumbnail_src': _extract_url(result['assets']['thumb']['url']),
82             'img_src': _extract_url(result['assets']['file']['url']),
83             'template': 'images.html',
84         })
85     return results
86 
87 
88 def _videos_results(video_results):
89     results = []
90     for result in video_results:
91         if not result['kind'].startswith('youtube'):
92             logger.warn('Unknown video kind in findx: {}'.format(result['kind']))
93             continue
94 
95         description = result['snippet']['description']
96         if len(description) > 300:
97             description = description[:300] + '...'
98 
99         results.append({
100             'url': base_youtube_url + result['id'],
101             'title': result['snippet']['title'],
102             'content': description,
103             'thumbnail': _extract_url(result['snippet']['thumbnails']['default']['url']),
104             'publishedDate': parser.parse(result['snippet']['publishedAt']),
105             'embedded': embedded_url.format(videoid=result['id']),
106             'template': 'videos.html',
107         })
108     return results
109 
110 
111 def _extract_url(url):
112     matching = re.search('(/https?://[^)]+)', url)
113     if matching:
114         return matching.group(0)[1:]
115     return ''
116
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/searx/engines/findx.py b/searx/engines/findx.py
--- a/searx/engines/findx.py
+++ b/searx/engines/findx.py
@@ -49,7 +49,7 @@
     results_json = loads(extract_text(results_raw_json))
 
     if len(results_json['web']['results']) > 0:
-        return _general_results(results_json['web']['results'])
+        return _general_results(results_json['web']['results']['webSearch']['results'])
 
     if len(results_json['images']['results']) > 0:
         return _images_results(results_json['images']['results'])

{"golden_diff": "diff --git a/searx/engines/findx.py b/searx/engines/findx.py\n--- a/searx/engines/findx.py\n+++ b/searx/engines/findx.py\n@@ -49,7 +49,7 @@\n     results_json = loads(extract_text(results_raw_json))\n \n     if len(results_json['web']['results']) > 0:\n-        return _general_results(results_json['web']['results'])\n+        return _general_results(results_json['web']['results']['webSearch']['results'])\n \n     if len(results_json['images']['results']) > 0:\n         return _images_results(results_json['images']['results'])\n", "issue": "findx crashes\n... with message on web page: findx (unexpected crash: string indices must be integers) \n", "before_files": [{"content": "\"\"\"\nFindX (General, Images, Videos)\n\n@website     https://www.findx.com\n@provide-api no\n@using-api   no\n@results     HTML\n@stable      no\n@parse       url, title, content, embedded, img_src, thumbnail_src\n\"\"\"\n\nfrom dateutil import parser\nfrom json import loads\nimport re\n\nfrom lxml import html\n\nfrom searx import logger\nfrom searx.engines.xpath import extract_text\nfrom searx.engines.youtube_noapi import base_youtube_url, embedded_url\nfrom searx.url_utils import urlencode\n\n\npaging = True\nresults_xpath = '//script[@id=\"initial-state\"]'\nsearch_url = 'https://www.findx.com/{category}?{q}'\ntype_map = {\n    'none': 'web',\n    'general': 'web',\n    'images': 'images',\n    'videos': 'videos',\n}\n\n\ndef request(query, params):\n    params['url'] = search_url.format(\n        category=type_map[params['category']],\n        q=urlencode({\n            'q': query,\n            'page': params['pageno']\n        })\n    )\n    return params\n\n\ndef response(resp):\n    dom = html.fromstring(resp.text)\n    results_raw_json = dom.xpath(results_xpath)\n    results_json = loads(extract_text(results_raw_json))\n\n    if len(results_json['web']['results']) > 0:\n        return _general_results(results_json['web']['results'])\n\n    if len(results_json['images']['results']) > 0:\n        return _images_results(results_json['images']['results'])\n\n    if len(results_json['video']['results']) > 0:\n        return _videos_results(results_json['video']['results'])\n\n    return []\n\n\ndef _general_results(general_results):\n    results = []\n    for result in general_results:\n        results.append({\n            'url': result['url'],\n            'title': result['title'],\n            'content': result['sum'],\n        })\n    return results\n\n\ndef _images_results(image_results):\n    results = []\n    for result in image_results:\n        results.append({\n            'url': result['sourceURL'],\n            'title': result['title'],\n            'content': result['source'],\n            'thumbnail_src': _extract_url(result['assets']['thumb']['url']),\n            'img_src': _extract_url(result['assets']['file']['url']),\n            'template': 'images.html',\n        })\n    return results\n\n\ndef _videos_results(video_results):\n    results = []\n    for result in video_results:\n        if not result['kind'].startswith('youtube'):\n            logger.warn('Unknown video kind in findx: {}'.format(result['kind']))\n            continue\n\n        description = result['snippet']['description']\n        if len(description) > 300:\n            description = description[:300] + '...'\n\n        results.append({\n            'url': base_youtube_url + result['id'],\n            'title': result['snippet']['title'],\n            'content': description,\n            'thumbnail': _extract_url(result['snippet']['thumbnails']['default']['url']),\n            'publishedDate': parser.parse(result['snippet']['publishedAt']),\n            'embedded': embedded_url.format(videoid=result['id']),\n            'template': 'videos.html',\n        })\n    return results\n\n\ndef _extract_url(url):\n    matching = re.search('(/https?://[^)]+)', url)\n    if matching:\n        return matching.group(0)[1:]\n    return ''\n", "path": "searx/engines/findx.py"}], "after_files": [{"content": "\"\"\"\nFindX (General, Images, Videos)\n\n@website     https://www.findx.com\n@provide-api no\n@using-api   no\n@results     HTML\n@stable      no\n@parse       url, title, content, embedded, img_src, thumbnail_src\n\"\"\"\n\nfrom dateutil import parser\nfrom json import loads\nimport re\n\nfrom lxml import html\n\nfrom searx import logger\nfrom searx.engines.xpath import extract_text\nfrom searx.engines.youtube_noapi import base_youtube_url, embedded_url\nfrom searx.url_utils import urlencode\n\n\npaging = True\nresults_xpath = '//script[@id=\"initial-state\"]'\nsearch_url = 'https://www.findx.com/{category}?{q}'\ntype_map = {\n    'none': 'web',\n    'general': 'web',\n    'images': 'images',\n    'videos': 'videos',\n}\n\n\ndef request(query, params):\n    params['url'] = search_url.format(\n        category=type_map[params['category']],\n        q=urlencode({\n            'q': query,\n            'page': params['pageno']\n        })\n    )\n    return params\n\n\ndef response(resp):\n    dom = html.fromstring(resp.text)\n    results_raw_json = dom.xpath(results_xpath)\n    results_json = loads(extract_text(results_raw_json))\n\n    if len(results_json['web']['results']) > 0:\n        return _general_results(results_json['web']['results']['webSearch']['results'])\n\n    if len(results_json['images']['results']) > 0:\n        return _images_results(results_json['images']['results'])\n\n    if len(results_json['video']['results']) > 0:\n        return _videos_results(results_json['video']['results'])\n\n    return []\n\n\ndef _general_results(general_results):\n    results = []\n    for result in general_results:\n        results.append({\n            'url': result['url'],\n            'title': result['title'],\n            'content': result['sum'],\n        })\n    return results\n\n\ndef _images_results(image_results):\n    results = []\n    for result in image_results:\n        results.append({\n            'url': result['sourceURL'],\n            'title': result['title'],\n            'content': result['source'],\n            'thumbnail_src': _extract_url(result['assets']['thumb']['url']),\n            'img_src': _extract_url(result['assets']['file']['url']),\n            'template': 'images.html',\n        })\n    return results\n\n\ndef _videos_results(video_results):\n    results = []\n    for result in video_results:\n        if not result['kind'].startswith('youtube'):\n            logger.warn('Unknown video kind in findx: {}'.format(result['kind']))\n            continue\n\n        description = result['snippet']['description']\n        if len(description) > 300:\n            description = description[:300] + '...'\n\n        results.append({\n            'url': base_youtube_url + result['id'],\n            'title': result['snippet']['title'],\n            'content': description,\n            'thumbnail': _extract_url(result['snippet']['thumbnails']['default']['url']),\n            'publishedDate': parser.parse(result['snippet']['publishedAt']),\n            'embedded': embedded_url.format(videoid=result['id']),\n            'template': 'videos.html',\n        })\n    return results\n\n\ndef _extract_url(url):\n    matching = re.search('(/https?://[^)]+)', url)\n    if matching:\n        return matching.group(0)[1:]\n    return ''\n", "path": "searx/engines/findx.py"}]}