|  | 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)
 |