# 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