
    iJ                         d gZ ddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddl
mZ ddlZ
ddlZ
ddlmZ dd	lmZ dd
lmZmZ ddlmZmZ ddlmZ ddlmZ ddlmZ ej@                  rddl!m"Z" ddl#m$Z$  ejJ                  d      Z	 	 	 dde&e'e(ejR                  f      de*de*fdZ G d d      Z+ G d d e+      Z,y)SearchWithPlugins    N)default_timer)uuid4)copy_current_request_context)logger)settings)load_engines)get_bang_url)
initializecounter_inc)r   check_network_configuration)ResultContainer)
PROCESSORS)RequestParams   )SearchQuery)SXNG_Requestsearchsettings_enginescheck_networkenable_metricsc                     | xs	 t         d   } t        |        t        | t         d          |r
t                t	        | D cg c]  }|d   	 c}|       t        j                  |        y c c}w )Nenginesoutgoingname)r   r	   initialize_networkr   initialize_metricsr   init)r   r   r   engines       &/root/searxng/searx/search/__init__.pyr   r   !   sc    
 (>8I+>!"'*)=>#%5EF6vFWOO$% Gs   A+c                        e Zd ZdZd fdZdefdZd Zdee	ee
e
ef      ef   fdZde	ee
e
ef      fdZd	 Zdefd
Z xZS )SearchzSearch information containerc                 j    t         |           || _        t               | _        d| _        d| _        y)zInitialize the SearchN)super__init__search_queryr   result_container
start_timeactual_timeout)selfr&   	__class__s     r    r%   zSearch.__init__2   s2     	+71@1B(,,0    returnc                     | j                   j                  rIt        | j                         | j                  _        t        | j                  j                  t              ryy)zaCheck if there is a external bang.  If yes, update
        self.result_container and return True.TF)r&   external_bangr
   r'   redirect_url
isinstancestrr*   s    r    search_external_bangzSearch.search_external_bang;   sJ     **1=d>O>O1PD!!. $//<<cBr,   c                     t         j                  j                  j                  | j                  j
                        }| j                  j                  d |       t        |      S N)	searx	answerersSTORAGEaskr&   queryr'   extendbool)r*   resultss     r    search_answererszSearch.search_answerersG   sH    //))--d.?.?.E.EF$$T73G}r,   c                    g }d}| j                   j                  D ]  }t        j                  |j                        }|s%|j                  | j                        rA|j                  | j                   |j                        }|jt        d|j                  ddd       |j                  |j                  | j                   j                  |f       t        ||j                  j                        } t        d   d   }|}| j                   j                   }||n2||t#        ||      }n!||t#        ||      }n||t#        ||      }t%        j&                  dj)                  ||||             ||fS )	Nr   r   r   countsentr   max_request_timeoutzUactual_timeout={0} (default_timeout={1}, ?timeout_limit={2}, max_request_timeout={3}))r&   engineref_listr   getr   extend_container_if_suspendedr'   
get_paramscategoryr   appendr;   maxr   timeoutr   timeout_limitminr   debugformat)	r*   requestsdefault_timeout	engineref	processorrequest_paramsrC   r)   query_timeouts	            r    _get_requestszSearch._get_requestsN   s   9;  **99 	MI"y~~6I  66t7L7LM '11$2C2CYEWEWXN%)..(GVL OOY^^T->->-D-DnUV "/93C3C3K3KLO-	M2 'z23HI())77&=+@ (]-F -@N ,1F 2EFN ,1J 0CDNcjj@S	
 ''r,   rP   c           	         t        t                     }|D ]{  \  }}}t        t        |   j                        }t        j                  |||| j                  | j                  | j                  f|      }d|_
        ||_        |j                          } t        j                         D ]  }|j                  |k(  st        d| j                  t!               | j                  z
  z
        }|j#                  |       |j%                         scd|_
        | j                  j'                  |j                  d       t        |j                     j(                  j+                  d        y )N)targetargsr   Fg        TrK   zengine timeout)r2   r   r   r   r   	threadingThreadr'   r(   r)   _timeout_engine_namestart	enumerater   rJ   r   joinis_aliveadd_unresponsive_enginer   error)	r*   rP   	search_idengine_namer;   rT   _searchthremaining_times	            r    search_multiple_requestszSearch.search_multiple_requests   s(   L	2: 		.K2:k3J3Q3QRG!!^T-B-BDOOUYUhUhiB
  BK)BOHHJ		 %%' 	OBww)#!$S$*=*=SWSbSbAb*c!d';;="&BK))AA"//S\]r/66<<=MN	Or,   c                 Z    | j                         \  }| _        |r| j                  |       y)zC
        Update self.result_container, self.actual_timeout
        T)rV   r)   ri   )r*   rP   s     r    search_standardzSearch.search_standard   s2     )-(:(:(<%$% ))(3 r,   c                     t               | _        | j                         s | j                         s| j	                          | j
                  S r6   )r   r(   r4   r?   rk   r'   r3   s    r    r   zSearch.search   s;    '/((*((*$$&$$$r,   )r&   r   )__name__
__module____qualname____doc__r%   r=   r4   r?   tuplelistr2   r   floatrV   ri   rk   r   r   __classcell__r+   s   @r    r"   r"   /   st    &1
d 
8(uT%S-0G*H%I5%PQ 8(tOeCm<S6T1U O0% %r,   r"   c                   L     e Zd ZdZdddddee   f fdZd Zd	ef fd
Z	 xZ
S )r   z8Inherit from the Search class, add calls to the plugins.r&   r   requestr   user_pluginsc                     t         |   |       || _        | j                  | j                  _        |j                         | _        y r6   )r$   r%   rx   
_on_resultr'   	on_result_get_current_objectrw   )r*   r&   rw   rx   r+   s       r    r%   zSearchWithPlugins.__init__   s<    &(*.//' 224r,   c                 l    t         j                  j                  j                  | j                  | |      S r6   )r7   pluginsr9   r{   rw   )r*   results     r    rz   zSearchWithPlugins._on_result   s%    }}$$..t||T6JJr,   r-   c                 <   t         j                  j                  j                  | j                  |       rt
        |           t         j                  j                  j                  | j                  |        | j                  j                          | j                  S r6   )
r7   r~   r9   
pre_searchrw   r$   r   post_searchr'   close)r*   r+   s    r    r   zSearchWithPlugins.search   sg    ==  ++DLL$?GN))$,,=##%$$$r,   )rm   rn   ro   rp   rr   r2   r%   rz   r   r   rt   ru   s   @r    r   r      s>    B5] 5^ 5[_`c[d 5K% % %r,   )NFT)-__all__typingtrZ   timeitr   uuidr   flaskr   r7   r   r   searx.answererssearx.pluginssearx.enginesr	   searx.external_bangr
   searx.metricsr   r   r   searx.networkr   r   searx.resultsr   searx.search.processorsr    searx.search.processors.abstractr   TYPE_CHECKINGmodelsr   searx.extended_typesr   getChildrr   dictr2   Anyr=   r"   r    r,   r    <module>r      s    
      .     & , G W ) . :??#1		" 04&4QUU
+,&& &D% D%N% %r,   