@@ -0,0 +1,82 @@
1+# SPDX-License-Identifier: AGPL-3.0-or-later
2+"""CORE (science)
3+
4+"""
5+# pylint: disable=missing-function-docstring
6+
7+from json import loads
8+from datetime import datetime
9+from urllib.parse import urlencode
10+
11+from searx import logger
12+from searx.exceptions import SearxEngineAPIException
13+
14+logger = logger.getChild('CORE engine')
15+
16+about = {
17+ "website": 'https://core.ac.uk',
18+ "wikidata_id": None,
19+ "official_api_documentation": 'https://core.ac.uk/documentation/api/',
20+ "use_official_api": True,
21+ "require_api_key": True,
22+ "results": 'JSON',
23+}
24+
25+categories = ['science']
26+paging = True
27+nb_per_page = 10
28+
29+api_key = 'unset'
30+
31+logger = logger.getChild('CORE engine')
32+
33+base_url = 'https://core.ac.uk:443/api-v2/search/'
34+search_string = '{query}?page={page}&pageSize={nb_per_page}&apiKey={apikey}'
35+
36+def request(query, params):
37+
38+ if api_key == 'unset':
39+ raise SearxEngineAPIException('missing CORE API key')
40+
41+ search_path = search_string.format(
42+ query = urlencode({'q': query}),
43+ nb_per_page = nb_per_page,
44+ page = params['pageno'],
45+ apikey = api_key,
46+ )
47+ params['url'] = base_url + search_path
48+
49+ logger.debug("query_url --> %s", params['url'])
50+ return params
51+
52+def response(resp):
53+ results = []
54+ json_data = loads(resp.text)
55+
56+ for result in json_data['data']:
57+
58+ source = result['_source']
59+ time = source['publishedDate'] or source['depositedDate']
60+ if time :
61+ date = datetime.fromtimestamp(time / 1000)
62+ else:
63+ date = None
64+
65+ metadata = []
66+ if source['publisher'] and len(source['publisher']) > 3:
67+ metadata.append(source['publisher'])
68+ if source['topics']:
69+ metadata.append(source['topics'][0])
70+ if source['doi']:
71+ metadata.append(source['doi'])
72+ metadata = ' / '.join(metadata)
73+
74+ results.append({
75+ 'url': source['urls'][0].replace('http://', 'https://', 1),
76+ 'title': source['title'],
77+ 'content': source['description'],
78+ 'publishedDate': date,
79+ 'metadata' : metadata,
80+ })
81+
82+ return results