mirror of
				https://github.com/searxng/searxng.git
				synced 2025-10-31 18:47:07 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # SPDX-License-Identifier: AGPL-3.0-or-later
 | |
| """Open library (books)
 | |
| """
 | |
| from urllib.parse import urlencode
 | |
| import re
 | |
| 
 | |
| from dateutil import parser
 | |
| 
 | |
| about = {
 | |
|     'website': 'https://openlibrary.org',
 | |
|     'wikidata_id': 'Q1201876',
 | |
|     'require_api_key': False,
 | |
|     'use_official_api': False,
 | |
|     'official_api_documentation': 'https://openlibrary.org/developers/api',
 | |
| }
 | |
| 
 | |
| paging = True
 | |
| categories = []
 | |
| 
 | |
| base_url = "https://openlibrary.org"
 | |
| results_per_page = 10
 | |
| 
 | |
| 
 | |
| def request(query, params):
 | |
|     args = {
 | |
|         'q': query,
 | |
|         'page': params['pageno'],
 | |
|         'limit': results_per_page,
 | |
|     }
 | |
|     params['url'] = f"{base_url}/search.json?{urlencode(args)}"
 | |
|     return params
 | |
| 
 | |
| 
 | |
| def _parse_date(date):
 | |
|     try:
 | |
|         return parser.parse(date)
 | |
|     except parser.ParserError:
 | |
|         return None
 | |
| 
 | |
| 
 | |
| def response(resp):
 | |
|     results = []
 | |
| 
 | |
|     for item in resp.json().get("docs", []):
 | |
|         cover = None
 | |
|         if 'lending_identifier_s' in item:
 | |
|             cover = f"https://archive.org/services/img/{item['lending_identifier_s']}"
 | |
| 
 | |
|         published = item.get('publish_date')
 | |
|         if published:
 | |
|             published_dates = [date for date in map(_parse_date, published) if date]
 | |
|             if published_dates:
 | |
|                 published = min(published_dates)
 | |
| 
 | |
|         if not published:
 | |
|             published = parser.parse(str(item.get('first_published_year')))
 | |
| 
 | |
|         result = {
 | |
|             'template': 'paper.html',
 | |
|             'url': f"{base_url}{item['key']}",
 | |
|             'title': item['title'],
 | |
|             'content': re.sub(r"\{|\}", "", item['first_sentence'][0]) if item.get('first_sentence') else '',
 | |
|             'isbn': item.get('isbn', [])[:5],
 | |
|             'authors': item.get('author_name', []),
 | |
|             'thumbnail': cover,
 | |
|             'publishedDate': published,
 | |
|             'tags': item.get('subject', [])[:10] + item.get('place', [])[:10],
 | |
|         }
 | |
|         results.append(result)
 | |
| 
 | |
|     return results
 |