Browse Source

[fix] openstreetmap engine

It seems there is an API change:
extratags can be either a dictionnary or None.

This commit avoid crash when extratags is None

Test query "!osm gare du nord"
Alexandre Flament 1 year ago
parent
commit
e16c007c22
1 changed files with 38 additions and 26 deletions
  1. 38 26
      searx/engines/openstreetmap.py

+ 38 - 26
searx/engines/openstreetmap.py

@@ -162,8 +162,15 @@ def response(resp):
             }
         )
 
+    # simplify the code below: make sure extratags is a dictionnary
+    for result in nominatim_json:
+        if not isinstance(result.get('extratags'), dict):
+            result["extratags"] = {}
+
+    # fetch data from wikidata
     fetch_wikidata(nominatim_json, user_language)
 
+    # create results
     for result in nominatim_json:
         title, address = get_title_address(result)
 
@@ -218,13 +225,12 @@ def fetch_wikidata(nominatim_json, user_language):
     wikidata_ids = []
     wd_to_results = {}
     for result in nominatim_json:
-        e = result.get("extratags")
-        if e:
-            # ignore brand:wikidata
-            wd_id = e.get("wikidata", e.get("wikidata link"))
-            if wd_id and wd_id not in wikidata_ids:
-                wikidata_ids.append("wd:" + wd_id)
-                wd_to_results.setdefault(wd_id, []).append(result)
+        extratags = result['extratags']
+        # ignore brand:wikidata
+        wd_id = extratags.get('wikidata', extratags.get('wikidata link'))
+        if wd_id and wd_id not in wikidata_ids:
+            wikidata_ids.append('wd:' + wd_id)
+            wd_to_results.setdefault(wd_id, []).append(result)
 
     if wikidata_ids:
         user_language = 'en' if user_language == 'all' else user_language.split('-')[0]
@@ -334,12 +340,13 @@ def get_img_src(result):
             img_src = result['wikidata']['image_sign']
 
     # img_src
-    if not img_src and result.get('extratags', {}).get('image'):
-        img_src = result['extratags']['image']
-        del result['extratags']['image']
-    if not img_src and result.get('extratags', {}).get('wikimedia_commons'):
-        img_src = get_external_url('wikimedia_image', result['extratags']['wikimedia_commons'])
-        del result['extratags']['wikimedia_commons']
+    extratags = result['extratags']
+    if not img_src and extratags.get('image'):
+        img_src = extratags['image']
+        del extratags['image']
+    if not img_src and extratags.get('wikimedia_commons'):
+        img_src = get_external_url('wikimedia_image', extratags['wikimedia_commons'])
+        del extratags['wikimedia_commons']
 
     return img_src
 
@@ -348,20 +355,25 @@ def get_links(result, user_language):
     """Return links from result['extratags']"""
     links = []
     link_keys = set()
+    extratags = result['extratags']
+    if not extratags:
+        # minor optimization : no need to check VALUE_TO_LINK if extratags is empty
+        return links, link_keys
     for k, mapping_function in VALUE_TO_LINK.items():
-        raw_value = result['extratags'].get(k)
-        if raw_value:
-            url, url_label = mapping_function(raw_value)
-            if url.startswith('https://wikidata.org'):
-                url_label = result.get('wikidata', {}).get('itemLabel') or url_label
-            links.append(
-                {
-                    'label': get_key_label(k, user_language),
-                    'url': url,
-                    'url_label': url_label,
-                }
-            )
-            link_keys.add(k)
+        raw_value = extratags.get(k)
+        if not raw_value:
+            continue
+        url, url_label = mapping_function(raw_value)
+        if url.startswith('https://wikidata.org'):
+            url_label = result.get('wikidata', {}).get('itemLabel') or url_label
+        links.append(
+            {
+                'label': get_key_label(k, user_language),
+                'url': url,
+                'url_label': url_label,
+            }
+        )
+        link_keys.add(k)
     return links, link_keys