summaryrefslogtreecommitdiff
path: root/searx/external_bang.py
blob: f8b9c44d373d19f99ce8cc2b1dc172a8059d3fa5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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)