
    i                        d Z ddlmZ ddlm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 dd	lmZ ej"                  rdd
lmZ ddlmZ ddddddZdZddgZdZdZdZdZddddZdddddZd Zde dd d!dfd"Z!d#e d!edz  fd$Z"d%e#e e f   fd&Z$d%e#e e f   d!efd'Z%d%e#e ejL                  f   d!efd(Z'd%e#e ejL                  f   d!efd)Z(d*d+d!efd,Z)d-e	fd.Z*y)/zKarmasearch uses Brave's index, so the results should be the same as Brave's.

However, the advantages of this engine are:

- it has less strict rate-limits
- it has a JSON API, so it's less likely to break
    )datetime)	urlencodeN)parser)EngineTraits)html_to_text)EngineResults
MainResult)LegacyResult)SXNG_Response)OnlineParamshttps://karmasearch.orgFJSON)websiteofficial_api_documentationuse_official_apirequire_api_keyresultszhttps://api.karmasearch.orgwebgeneralToffmoderatestrict)r         DayWeekMonthYear)dayweekmonthyearc                 8    t         dvrt        dt                y )N)r   imagesvideosnewszinvalid search type: )search_type
ValueError)_s    */root/searxng/searx/engines/karmasearch.pyinitr+   0   s#    ==0>?? >    queryparamsr   returnc                     t         j                  |d         xs d}| t        |d      |d   |j                  d      d   d|d}|d	   rt        |d	      |d
<   d|d   d<   t
         dt         dt        |       |d<   y )Nsearxng_localezen-US
safesearchpageno-en)
searchTermadultFilter
pageNumbercountryuserLanguagemarket
time_range	freshnessr   headersRefererz/search/?url)traits
get_regionsafe_search_mapsplittime_range_mapbase_urlr'   r   )r-   r.   engine_regionargss       r*   requestrK   5   s    **62B+CDOM &vl';<X& &&s+B/"D l*6,+?@[ $=F9i jQy6GHF5Mr,   date_stringc                 `    	 t        j                  |       S # t         j                  $ r Y y w xY w)N)r   parseParserError)rL   s    r*   _parse_daterP   I   s.    ||K(( s    --resultc           	      d    t        | d   | d   t        | d         | j                  dd            S )NrB   titledescription	thumbnail )rB   rS   contentrU   )r	   r   getrQ   s    r*   _parse_generalrZ   P   s8    5MWoVM23**["-	 r,   c                     t        | d   | d   t        | d         | j                  d      t        | j                  dd            d      S )NrB   rS   rT   rU   agerV   )rB   rS   rW   rU   publishedDater
   r   rX   rP   rY   s    r*   _parse_newsr_   Y   sN    %=G_#F=$9:K0(E2)>?	
 r,   c                     t        d| d   | d   t        | d         | j                  d      t        | j                  dd            | j                  di       j                  d	      d
      S )Nzvideos.htmlrB   rS   rT   rU   r\   rV   videoduration)templaterB   rS   rW   rU   r]   lengthr^   rY   s    r*   _parse_videosre   e   sj    %%=G_#F=$9:K0(E2)>?jj"-11*=	

 
r,   c                     t        d| d   | d   d| j                  di       j                  d      | j                  di       j                  d      d      S )	Nzimages.htmlrB   rS   rV   
propertiesrU   src)rc   rB   rS   rW   img_srcthumbnail_src)r
   rX   rY   s    r*   _parse_imagesrk   s   sZ    %%=G_zz,377>#ZZR8<<UC	
	 	r,   respr   c                 H   t               }| j                         }t        |t              s|S |d   D ]  }|j	                  dd      rd|v r%|d   D ]  }|j                  t        |              ?d|v r%|d   D ]  }|j                  t        |              ht        dk(  r|j                  t        |             t        dk(  r|j                  t        |             t        dk(  r|j                  t        |             |j                  t        |              |S )Nr   	sponsoredFr%   r&   r$   )r   json
isinstancedictrX   addre   r_   r'   rk   rZ   )rl   res	json_resprQ   videos_resultnews_results         r*   responserw      s
   
/C"&))+Ii&
I& ,::k5)v!'!1 6m456V%f~ 2K012& GGK'(H$GGM&)*H$GGM&)*GGN6*+-,0 Jr,   engine_traitsc           	          ddl m} ddl}ddlm} ddlm} ddlm} ddd	d
d |       d} |d|d      }|j                  st        d      |j                  |j                        }|j                  d      D ]~  }	|	j                  dd      }
	  ||j                  j                  |
d            }| j"                  j                  |      }|r||
k7  rt%        d|d|d|
       p|
| j"                  |<    y# |j                   $ r Y w xY w)z[Fetch :ref:`languages <brave languages>` and :ref:`regions <brave
    regions>` from Brave.r   )htmlN)
region_tag)rX   )gen_useragentzgzip, deflatezno-cache1z
keep-alivezen,en-US;q=0.7,en;q=0.3)zAccept-EncodingzCache-ControlDNT
ConnectionzAccept-Languagez
User-Agentz https://karmasearch.org/settings   )r?   timeoutz(Response from Brave languages is not OK.z //select[@name='country']/optionvaluerV   r4   )sepzCONFLICT: babel z --> z, )lxmlrz   babelsearx.localesr{   searx.networkrX   searx.utilsr|   okRuntimeError
fromstringtextxpathLocalerN   UnknownLocaleErrorregionsprint)rx   rz   r   r{   rX   r|   r?   rl   domoptioncountry_tagsxng_tagconflicts                r*   fetch_traitsr      s    (! * +#"4#oG 17AND77EFF
//$))
$C))>? 6!::gr2	!%,,"4"4[c"4"JKH !((,,X6;&8[YZ*5h'6 '' 		s   #C;;DD)+__doc__r   urllib.parser   typingtdateutilr   searx.enginelib.traitsr   r   r   searx.result_typesr   r	   searx.result_types._baser
   TYPE_CHECKINGsearx.extended_typesr   searx.search.processorsr   aboutrH   
categoriesr'   pagingr2   time_range_supportrE   rG   r+   strrK   rP   rq   rZ   r_   Anyre   rk   rw   r    r,   r*   <module>r      sW    "   / $ 8 1 ??24 )"&	 )Y
 

 
x8&Q@
I3 I I4 I(S X_ 4S> 	S#X 	< 	$sAEEz* | 
$sAEEz* 
| 
? } D+6 +6r,   