@@ -0,0 +1,104 @@
1+"""
2+ Recoll (local search engine)
3+
4+ @using-api yes
5+ @results JSON
6+ @stable yes
7+ @parse url, content, size, abstract, author, mtype, subtype, time, \
8+ filename, label, type, embedded
9+"""
10+
11+from datetime import date, timedelta
12+from json import loads
13+from urllib.parse import urlencode, quote
14+
15+# engine dependent config
16+time_range_support = True
17+
18+# parameters from settings.yml
19+base_url = None
20+search_dir = ''
21+mount_prefix = None
22+dl_prefix = None
23+
24+# embedded
25+embedded_url = '<{ttype} controls height="166px" ' +\
26+ 'src="{url}" type="{mtype}"></{ttype}>'
27+
28+
29+# helper functions
30+def get_time_range(time_range):
31+ sw = {
32+ 'day': 1,
33+ 'week': 7,
34+ 'month': 30,
35+ 'year': 365
36+ }
37+
38+ offset = sw.get(time_range, 0)
39+ if not offset:
40+ return ''
41+
42+ return (date.today() - timedelta(days=offset)).isoformat()
43+
44+
45+# do search-request
46+def request(query, params):
47+ search_after = get_time_range(params['time_range'])
48+ search_url = base_url + 'json?{query}&highlight=0'
49+ params['url'] = search_url.format(query=urlencode({
50+ 'query': query,
51+ 'after': search_after,
52+ 'dir': search_dir}))
53+
54+ return params
55+
56+
57+# get response from search-request
58+def response(resp):
59+ results = []
60+
61+ response_json = loads(resp.text)
62+
63+ if not response_json:
64+ return []
65+
66+ for result in response_json.get('results', []):
67+ title = result['label']
68+ url = result['url'].replace('file://' + mount_prefix, dl_prefix)
69+ content = '{}'.format(result['snippet'])
70+
71+ # append result
72+ item = {'url': url,
73+ 'title': title,
74+ 'content': content,
75+ 'template': 'files.html'}
76+
77+ if result['size']:
78+ item['size'] = int(result['size'])
79+
80+ for parameter in ['filename', 'abstract', 'author', 'mtype', 'time']:
81+ if result[parameter]:
82+ item[parameter] = result[parameter]
83+
84+ # facilitate preview support for known mime types
85+ if 'mtype' in result and '/' in result['mtype']:
86+ (mtype, subtype) = result['mtype'].split('/')
87+ item['mtype'] = mtype
88+ item['subtype'] = subtype
89+
90+ if mtype in ['audio', 'video']:
91+ item['embedded'] = embedded_url.format(
92+ ttype=mtype,
93+ url=quote(url.encode('utf8'), '/:'),
94+ mtype=result['mtype'])
95+
96+ if mtype in ['image'] and subtype in ['bmp', 'gif', 'jpeg', 'png']:
97+ item['img_src'] = url
98+
99+ results.append(item)
100+
101+ if 'nres' in response_json:
102+ results.append({'number_of_results': response_json['nres']})
103+
104+ return results