forked from zaclys/searxng
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
import json
|
|
from os.path import join
|
|
|
|
from searx import searx_dir
|
|
|
|
# bangs data coming from the following url convert to json with
|
|
# https://raw.githubusercontent.com/jivesearch/jivesearch/master/bangs/bangs.toml
|
|
# https://pseitz.github.io/toml-to-json-online-converter/
|
|
# NOTE only use the get_bang_url
|
|
|
|
bangs_data = {}
|
|
with open(join(searx_dir, 'data/bangs.json'), encoding='utf-8') as json_file:
|
|
for bang in json.load(json_file)['bang']:
|
|
for trigger in bang["triggers"]:
|
|
bangs_data[trigger] = {x: y for x, y in bang.items() if x != "triggers"}
|
|
|
|
|
|
def get_bang_url(search_query):
|
|
"""
|
|
Redirects if the user supplied a correct bang search.
|
|
:param search_query: This is a search_query object which contains preferences and the submitted queries.
|
|
:return: None if the bang was invalid, else a string of the redirect url.
|
|
"""
|
|
|
|
if search_query.external_bang:
|
|
query = search_query.query.decode('utf-8', 'ignore')
|
|
bang = _get_bang(search_query.external_bang)
|
|
|
|
if bang and query:
|
|
# TODO add region support.
|
|
bang_url = bang["regions"]["default"]
|
|
|
|
return bang_url.replace("{{{term}}}", query)
|
|
return None
|
|
|
|
|
|
def _get_bang(user_bang):
|
|
"""
|
|
Searches if the supplied user bang is available. Returns None if not found.
|
|
:param user_bang: The parsed user bang. For example yt
|
|
:return: Returns a dict with bangs data (check bangs_data.json for the structure)
|
|
"""
|
|
return bangs_data.get(user_bang)
|