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
							 |