mirror of
https://github.com/searxng/searxng.git
synced 2026-05-26 12:50:14 +02:00
efc305b7f9
[mod] normalize variable name for the max number of results per request In the past, we have used different names for the variable that specifies the maximum number of hits in the outgoing request. - ``page_size`` - ``number_of_results`` - ``nb_per_page`` Since *page_size* is the most accurate term and is also used in the XPath engines, all other engines are adjusted accordingly within this patch .. documentation adjusted accordingly. Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
144 lines
4.0 KiB
Python
144 lines
4.0 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""
|
|
Photon (Map)
|
|
"""
|
|
|
|
from json import loads
|
|
from urllib.parse import urlencode
|
|
from searx.utils import searxng_useragent
|
|
|
|
# about
|
|
about = {
|
|
"website": 'https://photon.komoot.io',
|
|
"wikidata_id": None,
|
|
"official_api_documentation": 'https://photon.komoot.io/',
|
|
"use_official_api": True,
|
|
"require_api_key": False,
|
|
"results": 'JSON',
|
|
}
|
|
|
|
# engine dependent config
|
|
categories = ['map']
|
|
paging = False
|
|
page_size = 10
|
|
|
|
# search-url
|
|
base_url = 'https://photon.komoot.io/'
|
|
search_string = 'api/?{query}&limit={limit}'
|
|
result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}'
|
|
|
|
# list of supported languages
|
|
supported_languages = ['de', 'en', 'fr', 'it']
|
|
|
|
|
|
# do search-request
|
|
def request(query, params):
|
|
params['url'] = base_url + search_string.format(query=urlencode({'q': query}), limit=page_size)
|
|
|
|
if params['language'] != 'all':
|
|
language = params['language'].split('_')[0]
|
|
if language in supported_languages:
|
|
params['url'] = params['url'] + "&lang=" + language
|
|
|
|
# using SearXNG User-Agent
|
|
params['headers']['User-Agent'] = searxng_useragent()
|
|
|
|
return params
|
|
|
|
|
|
# get response from search-request
|
|
def response(resp):
|
|
results = []
|
|
json = loads(resp.text)
|
|
|
|
# parse results
|
|
for r in json.get('features', {}):
|
|
|
|
properties = r.get('properties')
|
|
|
|
if not properties:
|
|
continue
|
|
|
|
# get title
|
|
title = properties.get('name')
|
|
|
|
# get osm-type
|
|
if properties.get('osm_type') == 'N':
|
|
osm_type = 'node'
|
|
elif properties.get('osm_type') == 'W':
|
|
osm_type = 'way'
|
|
elif properties.get('osm_type') == 'R':
|
|
osm_type = 'relation'
|
|
else:
|
|
# continue if invalid osm-type
|
|
continue
|
|
|
|
url = result_base_url.format(osm_type=osm_type, osm_id=properties.get('osm_id'))
|
|
|
|
osm = {'type': osm_type, 'id': properties.get('osm_id')}
|
|
|
|
geojson = r.get('geometry')
|
|
|
|
if properties.get('extent'):
|
|
boundingbox = [
|
|
properties.get('extent')[3],
|
|
properties.get('extent')[1],
|
|
properties.get('extent')[0],
|
|
properties.get('extent')[2],
|
|
]
|
|
else:
|
|
# better boundingbox calculation?
|
|
boundingbox = [
|
|
geojson['coordinates'][1],
|
|
geojson['coordinates'][1],
|
|
geojson['coordinates'][0],
|
|
geojson['coordinates'][0],
|
|
]
|
|
|
|
# address calculation
|
|
address = {}
|
|
|
|
# get name
|
|
if (
|
|
properties.get('osm_key') == 'amenity'
|
|
or properties.get('osm_key') == 'shop'
|
|
or properties.get('osm_key') == 'tourism'
|
|
or properties.get('osm_key') == 'leisure'
|
|
):
|
|
address = {'name': properties.get('name')}
|
|
|
|
# add rest of adressdata, if something is already found
|
|
if address.get('name'):
|
|
address.update(
|
|
{
|
|
'house_number': properties.get('housenumber'),
|
|
'road': properties.get('street'),
|
|
'locality': properties.get(
|
|
'city', properties.get('town', properties.get('village')) # noqa
|
|
), # noqa
|
|
'postcode': properties.get('postcode'),
|
|
'country': properties.get('country'),
|
|
}
|
|
)
|
|
else:
|
|
address = None
|
|
|
|
# append result
|
|
results.append(
|
|
{
|
|
'template': 'map.html',
|
|
'title': title,
|
|
'content': '',
|
|
'longitude': geojson['coordinates'][0],
|
|
'latitude': geojson['coordinates'][1],
|
|
'boundingbox': boundingbox,
|
|
'geojson': geojson,
|
|
'address': address,
|
|
'osm': osm,
|
|
'url': url,
|
|
}
|
|
)
|
|
|
|
# return results
|
|
return results
|