Loading searx/autocomplete.py +79 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,85 @@ from lxml import etree from requests import get from json import loads from urllib import urlencode from searx.languages import language_codes from searx.engines import ( categories, engines, engine_shortcuts ) def searx_bang(full_query): '''check if the searchQuery contain a bang, and create fitting autocompleter results''' # check if there is a query which can be parsed if len(full_query.getSearchQuery()) == 0: return [] results = [] # check if current query stats with !bang if full_query.getSearchQuery()[0] == '!': if len(full_query.getSearchQuery()) == 1: # show some example queries # TODO, check if engine is not avaliable results.append("!images") results.append("!wikipedia") results.append("!osm") else: engine_query = full_query.getSearchQuery()[1:] # check if query starts with categorie name for categorie in categories: if categorie.startswith(engine_query): results.append('!{categorie}'.format(categorie=categorie)) # check if query starts with engine name for engine in engines: if engine.startswith(engine_query.replace('_', ' ')): results.append('!{engine}'.format(engine=engine.replace(' ', '_'))) # check if query starts with engine shortcut for engine_shortcut in engine_shortcuts: if engine_shortcut.startswith(engine_query): results.append('!{engine_shortcut}'.format(engine_shortcut=engine_shortcut)) # check if current query stats with :bang elif full_query.getSearchQuery()[0] == ':': if len(full_query.getSearchQuery()) == 1: # show some example queries results.append(":en") results.append(":en_us") results.append(":english") results.append(":united_kingdom") else: engine_query = full_query.getSearchQuery()[1:] for lc in language_codes: lang_id, lang_name, country = map(str.lower, lc) # check if query starts with language-id if lang_id.startswith(engine_query): if len(engine_query) <= 2: results.append(':{lang_id}'.format(lang_id=lang_id.split('_')[0])) else: results.append(':{lang_id}'.format(lang_id=lang_id)) # check if query starts with language name if lang_name.startswith(engine_query): results.append(':{lang_name}'.format(lang_name=lang_name)) # check if query starts with country if country.startswith(engine_query.replace('_', ' ')): results.append(':{country}'.format(country=country.replace(' ', '_'))) # remove duplicates result_set = set(results) # remove results which are already contained in the query for query_part in full_query.query_parts: if query_part in result_set: result_set.remove(query_part) # convert result_set back to list return list(result_set) def dbpedia(query): Loading searx/engines/kickass.py +31 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ search_url = url + 'search/{search_term}/{pageno}/' # specific xpath variables magnet_xpath = './/a[@title="Torrent magnet link"]' torrent_xpath = './/a[@title="Download torrent file"]' content_xpath = './/span[@class="font11px lightgrey block"]' Loading Loading @@ -60,6 +61,9 @@ def response(resp): method="text")) seed = result.xpath('.//td[contains(@class, "green")]/text()')[0] leech = result.xpath('.//td[contains(@class, "red")]/text()')[0] filesize = result.xpath('.//td[contains(@class, "nobr")]/text()')[0] filesize_multiplier = result.xpath('.//td[contains(@class, "nobr")]//span/text()')[0] files = result.xpath('.//td[contains(@class, "center")][2]/text()')[0] # convert seed to int if possible if seed.isdigit(): Loading @@ -73,15 +77,42 @@ def response(resp): else: leech = 0 # convert filesize to byte if possible try: filesize = float(filesize) # convert filesize to byte if filesize_multiplier == 'TB': filesize = int(filesize * 1024 * 1024 * 1024 * 1024) elif filesize_multiplier == 'GB': filesize = int(filesize * 1024 * 1024 * 1024) elif filesize_multiplier == 'MB': filesize = int(filesize * 1024 * 1024) elif filesize_multiplier == 'kb': filesize = int(filesize * 1024) except: filesize = None # convert files to int if possible if files.isdigit(): files = int(files) else: files = None magnetlink = result.xpath(magnet_xpath)[0].attrib['href'] torrentfile = result.xpath(torrent_xpath)[0].attrib['href'] # append result results.append({'url': href, 'title': title, 'content': content, 'seed': seed, 'leech': leech, 'filesize': filesize, 'files': files, 'magnetlink': magnetlink, 'torrentfile': torrentfile, 'template': 'torrent.html'}) # return results sorted by seeder Loading searx/query.py +1 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ class Query(object): if lang == lang_id\ or lang_id.startswith(lang)\ or lang == lang_name\ or lang == country: or lang.replace('_', ' ') == country: parse_next = True self.languages.append(lang) break Loading searx/templates/oscar/base.html +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="generator" content="searx/{{ searx_version }}"> <meta name="viewport" content="width=device-width, initial-scale=1 , maximum-scale=1.0, user-scalable=1" /> {% block meta %}{% endblock %} <title>{% block title %}{% endblock %}searx</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}" type="text/css" /> Loading searx/templates/oscar/result_templates/default.html +1 −3 Original line number Diff line number Diff line Loading @@ -11,9 +11,7 @@ {% if result.embedded %} <div id="result-media-{{ index }}" class="collapse"> {% autoescape false %} {{ result.embedded }} {% endautoescape %} {{ result.embedded|safe }} </div> {% endif %} Loading Loading
searx/autocomplete.py +79 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,85 @@ from lxml import etree from requests import get from json import loads from urllib import urlencode from searx.languages import language_codes from searx.engines import ( categories, engines, engine_shortcuts ) def searx_bang(full_query): '''check if the searchQuery contain a bang, and create fitting autocompleter results''' # check if there is a query which can be parsed if len(full_query.getSearchQuery()) == 0: return [] results = [] # check if current query stats with !bang if full_query.getSearchQuery()[0] == '!': if len(full_query.getSearchQuery()) == 1: # show some example queries # TODO, check if engine is not avaliable results.append("!images") results.append("!wikipedia") results.append("!osm") else: engine_query = full_query.getSearchQuery()[1:] # check if query starts with categorie name for categorie in categories: if categorie.startswith(engine_query): results.append('!{categorie}'.format(categorie=categorie)) # check if query starts with engine name for engine in engines: if engine.startswith(engine_query.replace('_', ' ')): results.append('!{engine}'.format(engine=engine.replace(' ', '_'))) # check if query starts with engine shortcut for engine_shortcut in engine_shortcuts: if engine_shortcut.startswith(engine_query): results.append('!{engine_shortcut}'.format(engine_shortcut=engine_shortcut)) # check if current query stats with :bang elif full_query.getSearchQuery()[0] == ':': if len(full_query.getSearchQuery()) == 1: # show some example queries results.append(":en") results.append(":en_us") results.append(":english") results.append(":united_kingdom") else: engine_query = full_query.getSearchQuery()[1:] for lc in language_codes: lang_id, lang_name, country = map(str.lower, lc) # check if query starts with language-id if lang_id.startswith(engine_query): if len(engine_query) <= 2: results.append(':{lang_id}'.format(lang_id=lang_id.split('_')[0])) else: results.append(':{lang_id}'.format(lang_id=lang_id)) # check if query starts with language name if lang_name.startswith(engine_query): results.append(':{lang_name}'.format(lang_name=lang_name)) # check if query starts with country if country.startswith(engine_query.replace('_', ' ')): results.append(':{country}'.format(country=country.replace(' ', '_'))) # remove duplicates result_set = set(results) # remove results which are already contained in the query for query_part in full_query.query_parts: if query_part in result_set: result_set.remove(query_part) # convert result_set back to list return list(result_set) def dbpedia(query): Loading
searx/engines/kickass.py +31 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ search_url = url + 'search/{search_term}/{pageno}/' # specific xpath variables magnet_xpath = './/a[@title="Torrent magnet link"]' torrent_xpath = './/a[@title="Download torrent file"]' content_xpath = './/span[@class="font11px lightgrey block"]' Loading Loading @@ -60,6 +61,9 @@ def response(resp): method="text")) seed = result.xpath('.//td[contains(@class, "green")]/text()')[0] leech = result.xpath('.//td[contains(@class, "red")]/text()')[0] filesize = result.xpath('.//td[contains(@class, "nobr")]/text()')[0] filesize_multiplier = result.xpath('.//td[contains(@class, "nobr")]//span/text()')[0] files = result.xpath('.//td[contains(@class, "center")][2]/text()')[0] # convert seed to int if possible if seed.isdigit(): Loading @@ -73,15 +77,42 @@ def response(resp): else: leech = 0 # convert filesize to byte if possible try: filesize = float(filesize) # convert filesize to byte if filesize_multiplier == 'TB': filesize = int(filesize * 1024 * 1024 * 1024 * 1024) elif filesize_multiplier == 'GB': filesize = int(filesize * 1024 * 1024 * 1024) elif filesize_multiplier == 'MB': filesize = int(filesize * 1024 * 1024) elif filesize_multiplier == 'kb': filesize = int(filesize * 1024) except: filesize = None # convert files to int if possible if files.isdigit(): files = int(files) else: files = None magnetlink = result.xpath(magnet_xpath)[0].attrib['href'] torrentfile = result.xpath(torrent_xpath)[0].attrib['href'] # append result results.append({'url': href, 'title': title, 'content': content, 'seed': seed, 'leech': leech, 'filesize': filesize, 'files': files, 'magnetlink': magnetlink, 'torrentfile': torrentfile, 'template': 'torrent.html'}) # return results sorted by seeder Loading
searx/query.py +1 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ class Query(object): if lang == lang_id\ or lang_id.startswith(lang)\ or lang == lang_name\ or lang == country: or lang.replace('_', ' ') == country: parse_next = True self.languages.append(lang) break Loading
searx/templates/oscar/base.html +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="generator" content="searx/{{ searx_version }}"> <meta name="viewport" content="width=device-width, initial-scale=1 , maximum-scale=1.0, user-scalable=1" /> {% block meta %}{% endblock %} <title>{% block title %}{% endblock %}searx</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}" type="text/css" /> Loading
searx/templates/oscar/result_templates/default.html +1 −3 Original line number Diff line number Diff line Loading @@ -11,9 +11,7 @@ {% if result.embedded %} <div id="result-media-{{ index }}" class="collapse"> {% autoescape false %} {{ result.embedded }} {% endautoescape %} {{ result.embedded|safe }} </div> {% endif %} Loading