[feat] add bandcamp engine

This commit is contained in:
Kyle Anthony Williams 2020-12-27 23:46:11 -05:00 committed by Markus Heiser
parent 6c0114567e
commit 4d3c399ee9
2 changed files with 77 additions and 0 deletions

72
searx/engines/bandcamp.py Normal file
View File

@ -0,0 +1,72 @@
"""
Bandcamp (Music)
@website https://bandcamp.com/
@provide-api no
@results HTML
@parse url, title, content, publishedDate, embedded, thumbnail
"""
from urllib.parse import urlencode, urlparse, parse_qs
from dateutil.parser import parse as dateparse
from lxml import html
from searx.utils import extract_text
categories = ['music']
paging = True
base_url = "https://bandcamp.com/"
search_string = search_string = 'search?{query}&page={page}'
embedded_url = '''<iframe width="100%" height="166"
scrolling="no" frameborder="no"
data-src="https://bandcamp.com/EmbeddedPlayer/{type}={result_id}/size=large/bgcol=ffffff/linkcol=0687f5/tracklist=false/artwork=small/transparent=true/"
></iframe>'''
def request(query, params):
'''pre-request callback
params<dict>:
method : POST/GET
headers : {}
data : {} # if method == POST
url : ''
category: 'search category'
pageno : 1 # number of the requested page
'''
search_path = search_string.format(
query=urlencode({'q': query}),
page=params['pageno'])
params['url'] = base_url + search_path
return params
def response(resp):
'''post-response callback
resp: requests response object
'''
results = []
tree = html.fromstring(resp.text)
search_results = tree.xpath('//li[contains(@class, "searchresult")]')
for result in search_results:
link = result.xpath('//div[@class="itemurl"]/a')[0]
result_id = parse_qs(urlparse(link.get('href')).query)["search_item_id"][0]
title = result.xpath('//div[@class="heading"]/a/text()')[0]
date = dateparse(result.xpath('//div[@class="released"]/text()')[0].replace("released ", ""))
content = result.xpath('//div[@class="subhead"]/text()')[0]
thumbnail = result.xpath('//div[@class="art"]/img/@src')[0]
new_result = {
"url": extract_text(link),
"title": title,
"content": content,
"publishedDate": date,
"thumbnail": thumbnail,
}
if "album" in result.classes:
new_result["embedded"] = embedded_url.format(type='album', result_id=result_id)
elif "track" in result.classes:
new_result["embedded"] = embedded_url.format(type='track', result_id=result_id)
results.append(new_result)
return results

View File

@ -197,6 +197,11 @@ engines:
# engine : base
# shortcut : bs
- name: bandcamp
engine: bandcamp
shortcut: bc
categories: music
- name : wikipedia
engine : wikipedia
shortcut : wp