[feat]: engines: add astrophysical data system
This commit is contained in:
		
							parent
							
								
									41159fed32
								
							
						
					
					
						commit
						521e8fb63b
					
				| @ -174,3 +174,4 @@ features or generally made searx better: | |||||||
| - @micsthepick | - @micsthepick | ||||||
| - Daniel Kukula `<https://github.com/dkuku>` | - Daniel Kukula `<https://github.com/dkuku>` | ||||||
| - Patrick Evans `https://github.com/holysoles` | - Patrick Evans `https://github.com/holysoles` | ||||||
|  | - Daniel Mowitz `<https://daniel.mowitz.rocks>` | ||||||
|  | |||||||
							
								
								
									
										93
									
								
								searx/engines/astrophysics_data_system.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								searx/engines/astrophysics_data_system.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,93 @@ | |||||||
|  | # 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 | ||||||
| @ -380,6 +380,14 @@ engines: | |||||||
|       require_api_key: false |       require_api_key: false | ||||||
|       results: JSON |       results: JSON | ||||||
| 
 | 
 | ||||||
|  |   # - name: astrophysics data system | ||||||
|  |   #   engine: astrophysics_data_system | ||||||
|  |   #   sort: asc | ||||||
|  |   #   weight: 5 | ||||||
|  |   #   categories: [science] | ||||||
|  |   #   api_key: your-new-key | ||||||
|  |   #   shortcut: ads | ||||||
|  | 
 | ||||||
|   - name: alpine linux packages |   - name: alpine linux packages | ||||||
|     engine: alpinelinux |     engine: alpinelinux | ||||||
|     disabled: true |     disabled: true | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user