[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 | ||||
| - Daniel Kukula `<https://github.com/dkuku>` | ||||
| - 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 | ||||
|       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 | ||||
|     engine: alpinelinux | ||||
|     disabled: true | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user