| 
							
							# 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
 |