summaryrefslogtreecommitdiff
path: root/searx/external_bang.py
diff options
context:
space:
mode:
Diffstat (limited to 'searx/external_bang.py')
-rw-r--r--searx/external_bang.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/searx/external_bang.py b/searx/external_bang.py
new file mode 100644
index 000000000..f8b9c44d3
--- /dev/null
+++ b/searx/external_bang.py
@@ -0,0 +1,43 @@
+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')) 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)