mirror of
				https://github.com/searxng/searxng.git
				synced 2025-11-03 19:17:07 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			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
 |