94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | # SPDX-License-Identifier: AGPL-3.0-or-later | ||
|  | """.. sidebar:: info
 | ||
|  | 
 | ||
|  | The Astrophysics Data System (ADS) is a digital library portal for researchers in astronomy and physics, | ||
|  | operated by the Smithsonian Astrophysical Observatory (SAO) under a NASA grant. | ||
|  | The engine is adapted from the solr engine. | ||
|  | 
 | ||
|  | """
 | ||
|  | 
 | ||
|  | # pylint: disable=global-statement | ||
|  | 
 | ||
|  | from datetime import datetime | ||
|  | from json import loads | ||
|  | from urllib.parse import urlencode | ||
|  | from searx.exceptions import SearxEngineAPIException | ||
|  | 
 | ||
|  | about = { | ||
|  |     "website": 'https://ui.adsabs.harvard.edu/', | ||
|  |     "wikidata_id": 'Q752099', | ||
|  |     "official_api_documentation": 'https://ui.adsabs.harvard.edu/help/api/api-docs.html', | ||
|  |     "use_official_api": True, | ||
|  |     "require_api_key": True, | ||
|  |     "results": 'JSON', | ||
|  | } | ||
|  | 
 | ||
|  | base_url = 'https://api.adsabs.harvard.edu/v1/search' | ||
|  | result_base_url = 'https://ui.adsabs.harvard.edu/abs/' | ||
|  | rows = 10 | ||
|  | sort = ''  # sorting: asc or desc | ||
|  | field_list = ['bibcode', 'author', 'title', 'abstract', 'doi', 'date']  # list of field names to display on the UI | ||
|  | default_fields = ''  # default field to query | ||
|  | query_fields = ''  # query fields | ||
|  | paging = True | ||
|  | api_key = 'unset' | ||
|  | 
 | ||
|  | 
 | ||
|  | def init(_): | ||
|  |     if api_key == 'unset': | ||
|  |         raise SearxEngineAPIException('missing ADS API key') | ||
|  | 
 | ||
|  | 
 | ||
|  | def request(query, params): | ||
|  |     query_params = {'q': query, 'rows': rows} | ||
|  |     if field_list: | ||
|  |         query_params['fl'] = ','.join(field_list) | ||
|  |     if query_fields: | ||
|  |         query_params['qf'] = ','.join(query_fields) | ||
|  |     if default_fields: | ||
|  |         query_params['df'] = default_fields | ||
|  |     if sort: | ||
|  |         query_params['sort'] = sort | ||
|  | 
 | ||
|  |     query_params['start'] = rows * (params['pageno'] - 1) | ||
|  | 
 | ||
|  |     params['headers']['Authorization'] = f'Bearer {api_key}' | ||
|  |     params['url'] = f"{base_url}/query?{urlencode(query_params)}" | ||
|  | 
 | ||
|  |     return params | ||
|  | 
 | ||
|  | 
 | ||
|  | def response(resp): | ||
|  |     try: | ||
|  |         resp_json = loads(resp.text) | ||
|  |     except Exception as e: | ||
|  |         raise SearxEngineAPIException("failed to parse response") from e | ||
|  | 
 | ||
|  |     if 'error' in resp_json: | ||
|  |         raise SearxEngineAPIException(resp_json['error']['msg']) | ||
|  | 
 | ||
|  |     resp_json = resp_json["response"] | ||
|  |     result_len = resp_json["numFound"] | ||
|  |     results = [] | ||
|  | 
 | ||
|  |     for res in resp_json["docs"]: | ||
|  |         author = res.get("author") | ||
|  | 
 | ||
|  |         if author: | ||
|  |             author = author[0] + ' et al.' | ||
|  | 
 | ||
|  |         results.append( | ||
|  |             { | ||
|  |                 'url': result_base_url + res.get("bibcode") + "/", | ||
|  |                 'title': res.get("title")[0], | ||
|  |                 'author': author, | ||
|  |                 'content': res.get("abstract"), | ||
|  |                 'doi': res.get("doi"), | ||
|  |                 'publishedDate': datetime.fromisoformat(res.get("date")), | ||
|  |             } | ||
|  |         ) | ||
|  | 
 | ||
|  |     results.append({'number_of_results': result_len}) | ||
|  | 
 | ||
|  |     return results |