| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | # SPDX-License-Identifier: AGPL-3.0-or-later"""Library of Congress: query Photo, Print and Drawing from API endpoint_``photos``... _endpoint: https://www.loc.gov/apis/json-and-yaml/requests/endpoints/.. note::   Beside the ``photos`` endpoint_ there are more endpoints available / we are   looking forward for contributions implementing more endpoints."""from urllib.parse import urlencodefrom searx.network import raise_for_httperrorabout = {    "website": 'https://www.loc.gov/pictures/',    "wikidata_id": 'Q131454',    "official_api_documentation": 'https://www.loc.gov/api',    "use_official_api": True,    "require_api_key": False,    "results": 'JSON',}categories = ['images']paging = Trueendpoint = 'photos'base_url = 'https://loc.gov'search_string = "/{endpoint}/?sp={page}&{query}&fo=json"def request(query, params):    search_path = search_string.format(        endpoint=endpoint,        query=urlencode({'q': query}),        page=params['pageno'],    )    params['url'] = base_url + search_path    params['raise_for_httperror'] = False    return paramsdef response(resp):    results = []    json_data = resp.json()    json_results = json_data.get('results')    if not json_results:        # when a search term has none results, loc sends a JSON in a HTTP 404        # response and the HTTP status code is set in the 'status' element.        if json_data.get('status') == 404:            return results    raise_for_httperror(resp)    for result in json_results:        url = result["item"].get("link")        if not url:            continue        img_src = result['item'].get('service_medium')        if not img_src or img_src == 'https://memory.loc.gov/pp/grp.gif':            continue        title = result['title']        if title.startswith('['):            title = title.strip('[]')        content_items = [            result['item'].get('created_published_date'),            result['item'].get('summary', [None])[0],            result['item'].get('notes', [None])[0],            result['item'].get('part_of', [None])[0],        ]        author = None        if result['item'].get('creators'):            author = result['item']['creators'][0]['title']        results.append(            {                'template': 'images.html',                'url': url,                'title': title,                'content': ' / '.join([i for i in content_items if i]),                'img_src': img_src,                'thumbnail_src': result['item'].get('thumb_gallery'),                'author': author,            }        )    return results
 |