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