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 |