on master help sign in
Merge pull request #2763 from return42/add-bandcamp

Add Bandcamp search engine

commit59df3bec285d0cfe9d0e8ea7e8fe861a6b6561ee authorNoémi Ványi <kvch@users.noreply.github.com> dateFri 16 Apr 2021, 17:25 (6 years ago) parent6c01145f637bfc
4 files changed+80−2
searx/engines/bandcamp.py+73 searx/settings.yml+5 searx/static/themes/oscar/img/icons/bandcamp.png searx/templates/oscar/result_templates/default.html+2−2
searx/engines/bandcamp.pynew file+73
@@ -0,0 +1,73 @@
1+"""
2+Bandcamp (Music)
3+
4+@website https://bandcamp.com/
5+@provide-api no
6+@results HTML
7+@parse url, title, content, publishedDate, embedded, thumbnail
8+"""
9+
10+from urllib.parse import urlencode, urlparse, parse_qs
11+from dateutil.parser import parse as dateparse
12+from lxml import html
13+from searx.utils import extract_text
14+
15+categories = ['music']
16+paging = True
17+
18+base_url = "https://bandcamp.com/"
19+search_string = search_string = 'search?{query}&page={page}'
20+embedded_url = '''<iframe width="100%" height="166"
21+ scrolling="no" frameborder="no"
22+ data-src="https://bandcamp.com/EmbeddedPlayer/{type}={result_id}/size=large/bgcol=ffffff/linkcol=0687f5/tracklist=false/artwork=small/transparent=true/"
23+></iframe>'''
24+
25+
26+def request(query, params):
27+ '''pre-request callback
28+ params<dict>:
29+ method : POST/GET
30+ headers : {}
31+ data : {} # if method == POST
32+ url : ''
33+ category: 'search category'
34+ pageno : 1 # number of the requested page
35+ '''
36+
37+ search_path = search_string.format(
38+ query=urlencode({'q': query}),
39+ page=params['pageno'])
40+
41+ params['url'] = base_url + search_path
42+
43+ return params
44+
45+
46+def response(resp):
47+ '''post-response callback
48+ resp: requests response object
49+ '''
50+ results = []
51+ tree = html.fromstring(resp.text)
52+ search_results = tree.xpath('//li[contains(@class, "searchresult")]')
53+ for result in search_results:
54+ link = result.xpath('.//div[@class="itemurl"]/a')[0]
55+ result_id = parse_qs(urlparse(link.get('href')).query)["search_item_id"][0]
56+ title = result.xpath('.//div[@class="heading"]/a/text()')
57+ date = dateparse(result.xpath('//div[@class="released"]/text()')[0].replace("released ", ""))
58+ content = result.xpath('.//div[@class="subhead"]/text()')
59+ new_result = {
60+ "url": extract_text(link),
61+ "title": extract_text(title),
62+ "content": extract_text(content),
63+ "publishedDate": date,
64+ }
65+ thumbnail = result.xpath('.//div[@class="art"]/img/@src')
66+ if thumbnail:
67+ new_result['thumbnail'] = thumbnail[0]
68+ if "album" in result.classes:
69+ new_result["embedded"] = embedded_url.format(type='album', result_id=result_id)
70+ elif "track" in result.classes:
71+ new_result["embedded"] = embedded_url.format(type='track', result_id=result_id)
72+ results.append(new_result)
73+ return results
searx/settings.yml+5
@@ -197,6 +197,11 @@ engines:
197197# engine : base
198198# shortcut : bs
199199
200+ - name: bandcamp
201+ engine: bandcamp
202+ shortcut: bc
203+ categories: music
204+
200205 - name : wikipedia
201206 engine : wikipedia
202207 shortcut : wp
searx/static/themes/oscar/img/icons/bandcamp.pngnew file

Binary file not shown.

searx/templates/oscar/result_templates/default.html+2−2
@@ -13,10 +13,10 @@
1313</div>
1414{%- endif -%}
1515
16−{%- if result.img_src -%}
16+{%- if result.img_src or result.thumbnail -%}
1717<div class="container-fluid">{{- "" -}}
1818 <div class="row">{{- "" -}}
19− <img src="{{ image_proxify(result.img_src) }}" title="{{ result.title|striptags }}" style="width: auto; max-height: 60px; min-height: 60px;" class="col-xs-2 col-sm-4 col-md-4 result-content">
19+ <img src="{{ image_proxify(result.img_src or result.thumbnail) }}" title="{{ result.title|striptags }}" style="width: auto; max-height: 60px; min-height: 60px;" class="col-xs-2 col-sm-4 col-md-4 result-content">
2020 {%- if result.content %}<p class="result-content col-xs-8 col-sm-8 col-md-8">{{ result.content|safe }}</p>{% endif -%}
2121 </div>{{- "" -}}
2222</div>