Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38e0a64c authored by Gaël Duval's avatar Gaël Duval
Browse files

Merge branch 'parallel-general-search' into 'master'

Make general search parallel

See merge request e/cloud/my-spot!14
parents 1f9d7e46 e670d867
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
"""
 Bing (Videos)

 @website     https://www.bing.com/videos
 @provide-api yes (http://datamarket.azure.com/dataset/bing/search)

 @using-api   no
 @results     HTML
 @stable      no
 @parse       url, title, content, thumbnail
"""

from json import loads
from lxml import html
from searx.engines.bing_images import _fetch_supported_languages, supported_languages_url
from searx.engines.xpath import extract_text
from searx.url_utils import urlencode
from searx.utils import match_language
@@ -48,6 +44,7 @@ def request(query, params):
        'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')

    # language cookie
    # NOTE: supported_languages initiated dynamically
    language = match_language(params['language'], supported_languages).lower()
    params['cookies']['_EDGE_S'] = 'mkt=' + language + '&F=1'

+11 −3
Original line number Diff line number Diff line
@@ -259,9 +259,17 @@ def get_search_query_from_webapp(preferences, form):
    if query_category is None:
        query_category = 'general'

    for engine in categories[query_category]:
        if (engine.name, query_category) not in disabled_engines:
            query_engines.append({'category': query_category, 'name': engine.name})
    def append_to_engines(cat):
        for engine in categories[cat]:
            if (engine.name, cat) not in disabled_engines:
                query_engines.append({'category': cat, 'name': engine.name})

    if query_category == 'general':
        append_to_engines(query_category)
        append_to_engines('images')
        append_to_engines('videos')
    else:
        append_to_engines(query_category)

    return SearchQuery(query, query_engines, [query_category], query_lang, query_safesearch, query_pageno,
                       query_time_range)
+2 −0
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ engines:
  - name : bing videos
    engine : bing_videos
    shortcut : biv
    disabled: true

  - name : bitbucket
    engine : xpath
@@ -215,6 +216,7 @@ engines:
  - name : 500px
    engine : www500px
    shortcut : px
    disabled: true

  - name : 1x
    engine : www1x
+35 −34
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import json
import os
import sys
import time
import atexit
import copy

import requests

@@ -477,8 +477,10 @@ def index():
            'index.html',
        )

    images = []
    videos = []
    # search
    searchData = None
    search_data = None
    try:
        # we dont want users to select multiple categories, this simplifies the experience.
        if request.form.get("categories"):
@@ -490,54 +492,53 @@ def index():
            request.form["category_images"] = u"off"
            request.form["category_" + request.form['category']] = u"On"
            
        searchData = search(request, settings['redis']['host'])
        search_data = search(request, settings['redis']['host'])

    except Exception as e:
        # log exception
        logger.exception('search error')

        # is it an invalid input parameter or something else ?
        if (issubclass(e.__class__, SearxParameterException)):
        if issubclass(e.__class__, SearxParameterException):
            return index_error(), 400
        else:
            return index_error(), 500

    # serrch 5 images and 5 videos
    images = []
    videos = []
    if searchData.categories == ['general'] and searchData.pageno == 1:
        request.form['category'] = 'images'
        host = settings['redis']['host']
        all_images = search(request, host).results
        for image in all_images[:min(5, len(all_images))]:
            images.append(image)

        request.form['category'] = 'videos'
        all_videos = search(request, host).results
        for video in all_videos[:min(5, len(all_videos))]:
            videos.append(video)
    if search_data.categories == ['general'] and search_data.pageno == 1:
        result_copy = copy.copy(search_data.results)
        for res in result_copy:
            if res.get('category') == 'images':
                if len(images) < 5:
                    images.append(res)
                search_data.results.remove(res)
            elif res.get('category') == 'videos':
                if len(videos) < 5:
                    videos.append(res)
                search_data.results.remove(res)
            elif res.get('category') is None:
                search_data.results.remove(res)

    # output
    config_results(searchData.results, searchData.query)
    config_results(images, searchData.query)
    config_results(videos, searchData.query)
    config_results(search_data.results, search_data.query)
    config_results(images, search_data.query)
    config_results(videos, search_data.query)

    return render(
        'results.html',
        results=searchData.results,
        q=searchData.query.decode('utf-8'),
        selected_categories=searchData.categories,
        pageno=searchData.pageno,
        time_range=searchData.time_range,
        number_of_results=format_decimal(searchData.results_number),
        results=search_data.results,
        q=search_data.query.decode('utf-8'),
        selected_categories=search_data.categories,
        pageno=search_data.pageno,
        time_range=search_data.time_range,
        number_of_results=format_decimal(search_data.results_number),
        advanced_search=request.form.get('advanced_search', None),
        suggestions=searchData.suggestions,
        answers=searchData.answers,
        corrections=searchData.corrections,
        infoboxes=searchData.infoboxes,
        paging=searchData.paging,
        unresponsive_engines=searchData.unresponsive_engines,
        current_language=match_language(searchData.language,
        suggestions=search_data.suggestions,
        answers=search_data.answers,
        corrections=search_data.corrections,
        infoboxes=search_data.infoboxes,
        paging=search_data.paging,
        unresponsive_engines=search_data.unresponsive_engines,
        current_language=match_language(search_data.language,
                                        LANGUAGE_CODES,
                                        fallback=settings['search']['language']),
        image_results=images,