
    i.                     n   U d 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m	Z	m
Z
mZ ddlmZ ddlmZ dd	lmZmZmZ ej&                  rdd
lmZ ddlmZ ddddddZg ZdZ	 dZdZddddZddddZddddZ e
       Z e!e"d<   de#e!ejH                  f   fdZ%de!ddfd Z&de!ddd!dfd"Z'd# Z(d$ Z)d% Z*d& Z+y)'zQ
DuckDuckGo Extra (images, videos, news)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N)datetime)	urlencode)
quote_plus)get_embeded_stream_urlhtml_to_textgen_useragentextr)get)fetch_traits)get_ddg_langget_vqdset_vqd)SXNG_Response)OnlineParamshttps://duckduckgo.com/Q12805Fz%JSON (site requires js to get images))websitewikidata_iduse_official_apirequire_api_keyresults Tz-21)r         ivnewsimagesvideosr   _HTTP_User_Agentengine_settingsc                 4    | d   dvrt        d| d          y )Nddg_categoryr   z!Unsupported DuckDuckGo category: )
ValueError)r#   s    //root/searxng/searx/engines/duckduckgo_extra.pyinitr(   /   s/    ~&.JJ<_^=\<]^__ K    queryparamsr   c                    t         j                  d       t        dt        |        d|d   d      }d}|j                  dk(  rFt        |j                  d	d
      }|rt         j                  d|       n6t         j                  d       yt         j                  d|j                         |rt        | ||       |S t         j                  d|j                         |S )Nz1fetch_vqd: request value from from duckduckgo.comzhttps://duckduckgo.com/?q=z&iar=images&t=h_headersr   )urlr-   timeoutr      zvqd=""z+vqd value from duckduckgo.com request: '%s'z>vqd: can't parse value from ddg response (return empty string)z$vqd: got HTTP %s from duckduckgo.com)r*   valuer+   z+none vqd value from duckduckgo.com: HTTP %s)	loggerdebugr
   r   status_coder	   texterrorr   )r*   r+   respr2   s       r'   	fetch_vqdr9   5   s    
 LLDE(E):(;;KLy!D E3TYY-LLFNLLYZ;T=M=MNe58 L 	BDDTDTULr)   returnc                    t        |       dk\  rd |d<   y |d   }t        |d<   t        | |      xs t        | |      }d|d<   d|d	<   d
|d<   t        j                  |d   t        j                        }t        t        |d         xs d}d| d|d|dd}||d   d<   ||d   d<   ||d   d<   d|d<   |d   dk7  r(|d   j                  d      d   j                         |d<   |d   dkD  r|d   dz
  dz  |d<   t        j                  |d          }|||d   d!<   ||d!<   dt        t            d"t        |       |d<   t        j!                  d#|d          t        j!                  d$|d%          t        j!                  d&|d          y )'Ni  r.   r-   z
User-Agent)r*   r+   z*/*Acceptr   Refererzduckduckgo.comHostsearxng_localezwt-wtjsonbingr   h_)oqulbpiavqdacookiesadahrF   ENctall-r   pagenor   d   s
safesearchpz.js?zparam headers: %szparam data: %sdatazparam cookies: %s)lenr"   r   r9   traits
get_region
all_localer   splituppersafesearch_cookiesr
   search_path_mapr%   r   r3   r4   )r*   r+   r-   rH   
eng_regioneng_langargssafe_searchs           r'   requestrc   S   s   
5zSu
 YG -GL
f
-
Vv1VCGH2GI&GFO '' J
 !0@)ABMgH "D 'F9d(F9d'F9cDJ5(,-33C8;AACT
h!H%)S0S	$(()=>K!,y#S	-ol.K-LDQZ[_Q`PabF5M
LL$fY&78
LL!6&>2
LL$fY&78r)   c           
      L    d| d   | d   d| d   | d   | d   d| d	   | d
   dS )Nzimages.htmlr.   titler   	thumbnailimagewidthz x heightsource)templater.   re   contentthumbnail_srcimg_src
resolutionrj    results    r'   _image_resultrs      sH    !e},'?#)'?F84DE"	 	r)   c                     d| d   | d   | d   | d   j                  d      xs | d   j                  d      t        | d         | d   | d	   | j                  d
      d	S )Nzvideos.htmlrl   re   descriptionr    smallmediumproviderdurationuploader)	rk   r.   re   rl   rf   
iframe_srcrj   lengthmetadata)r
   r   rq   s    r'   _video_resultr~      sw    !i -(H%))'2TfX6F6J6J86T,VI->?$$JJz*
 
r)   c                 h    | d   | d   t        | d         | d   t        j                  | d         dS )Nr.   re   excerptrj   date)r.   re   rl   rj   publishedDate)r   r   fromtimestamprq   s    r'   _news_resultr      sA    e}y 12"!//v? r)   c                 8   g }| j                         }|d   D ]  }t        dk(  r|j                  t        |             't        dk(  r|j                  t	        |             Kt        dk(  r|j                  t        |             ot        dt                |S )Nr   r    r!   r   zInvalid duckduckgo category: )r@   r%   appendrs   r~   r   r&   )r8   r   res_jsonrr   s       r'   responser      s    Gyy{H9% M8#NN=01X%NN=01V#NN</0<\NKLLM Nr)   ),__doc__typingtr   urllib.parser   r   searx.utilsr   r   r   r	   searx.networkr
   searx.engines.duckduckgor   r   r   r   TYPE_CHECKINGsearx.extended_typesr   searx.search.processorsr   about
categoriesr%   pagingrT   r]   safesearch_argsr^   r"   str__annotations__dictAnyr(   r9   rc   rs   r~   r   r   rp   r)   r'   <module>r      s   
   " # Q Q  1 C C??24 )6	 
	
$3/ ds+ C@% # '`$sAEEz* `<=93 =9 =94 =9@
r)   