summaryrefslogtreecommitdiff
path: root/searx/engines/wikidata.py
diff options
context:
space:
mode:
Diffstat (limited to 'searx/engines/wikidata.py')
-rw-r--r--searx/engines/wikidata.py61
1 files changed, 42 insertions, 19 deletions
diff --git a/searx/engines/wikidata.py b/searx/engines/wikidata.py
index 8c8e7f219..7877e1198 100644
--- a/searx/engines/wikidata.py
+++ b/searx/engines/wikidata.py
@@ -2,7 +2,7 @@ import json
from requests import get
from urllib import urlencode
-resultCount=2
+resultCount=1
urlSearch = 'https://www.wikidata.org/w/api.php?action=query&list=search&format=json&srnamespace=0&srprop=sectiontitle&{query}'
urlDetail = 'https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&props=labels%7Cinfo%7Csitelinks%7Csitelinks%2Furls%7Cdescriptions%7Cclaims&{query}'
urlMap = 'https://www.openstreetmap.org/?lat={latitude}&lon={longitude}&zoom={zoom}&layers=M'
@@ -33,17 +33,20 @@ def response(resp):
return results
def getDetail(jsonresponse, wikidata_id, language):
+ results = []
+ urls = []
+ attributes = []
+
result = jsonresponse.get('entities', {}).get(wikidata_id, {})
title = result.get('labels', {}).get(language, {}).get('value', None)
if title == None:
- title = result.get('labels', {}).get('en', {}).get('value', wikidata_id)
- results = []
- urls = []
- attributes = []
+ title = result.get('labels', {}).get('en', {}).get('value', None)
+ if title == None:
+ return results
- description = result.get('descriptions', {}).get(language, {}).get('value', '')
- if description == '':
+ description = result.get('descriptions', {}).get(language, {}).get('value', None)
+ if description == None:
description = result.get('descriptions', {}).get('en', {}).get('value', '')
claims = result.get('claims', {})
@@ -52,10 +55,15 @@ def getDetail(jsonresponse, wikidata_id, language):
urls.append({ 'title' : 'Official site', 'url': official_website })
results.append({ 'title': title, 'url' : official_website })
+ wikipedia_link_count = 0
if language != 'en':
- add_url(urls, 'Wikipedia (' + language + ')', get_wikilink(result, language + 'wiki'))
+ wikipedia_link_count += add_url(urls, 'Wikipedia (' + language + ')', get_wikilink(result, language + 'wiki'))
wikipedia_en_link = get_wikilink(result, 'enwiki')
- add_url(urls, 'Wikipedia (en)', wikipedia_en_link)
+ wikipedia_link_count += add_url(urls, 'Wikipedia (en)', wikipedia_en_link)
+ if wikipedia_link_count == 0:
+ misc_language = get_wiki_firstlanguage(result, 'wiki')
+ if misc_language != None:
+ add_url(urls, 'Wikipedia (' + misc_language + ')', get_wikilink(result, misc_language + 'wiki'))
if language != 'en':
add_url(urls, 'Wiki voyage (' + language + ')', get_wikilink(result, language + 'wikivoyage'))
@@ -105,14 +113,20 @@ def getDetail(jsonresponse, wikidata_id, language):
if date_of_death != None:
attributes.append({'label' : 'Date of death', 'value' : date_of_death})
-
- results.append({
- 'infobox' : title,
- 'id' : wikipedia_en_link,
- 'content' : description,
- 'attributes' : attributes,
- 'urls' : urls
- })
+ if len(attributes)==0 and len(urls)==2 and len(description)==0:
+ results.append({
+ 'url': urls[0]['url'],
+ 'title': title,
+ 'content': description
+ })
+ else:
+ results.append({
+ 'infobox' : title,
+ 'id' : wikipedia_en_link,
+ 'content' : description,
+ 'attributes' : attributes,
+ 'urls' : urls
+ })
return results
@@ -120,7 +134,9 @@ def getDetail(jsonresponse, wikidata_id, language):
def add_url(urls, title, url):
if url != None:
urls.append({'title' : title, 'url' : url})
-
+ return 1
+ else:
+ return 0
def get_mainsnak(claims, propertyName):
propValue = claims.get(propertyName, {})
@@ -147,7 +163,8 @@ def get_string(claims, propertyName, defaultValue=None):
if len(result) == 0:
return defaultValue
else:
- return ', '.join(result)
+ #TODO handle multiple urls
+ return result[0]
def get_time(claims, propertyName, defaultValue=None):
@@ -213,3 +230,9 @@ def get_wikilink(result, wikiid):
elif url.startswith('//'):
url = 'https:' + url
return url
+
+def get_wiki_firstlanguage(result, wikipatternid):
+ for k in result.get('sitelinks', {}).keys():
+ if k.endswith(wikipatternid) and len(k)==(2+len(wikipatternid)):
+ return k[0:2]
+ return None