o
    E'hZ  ã                   @  sü   d dl mZ d dlZd dlZd dlZd dlmZm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 d d	lmZ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mZ ddlm Z m!Z!m"Z"m#Z#m$Z$ e %d¡Z&G dd„ dƒZ'dS )é    )ÚannotationsN)ÚdatetimeÚtimezone)Úcached_property)Úcycle)Úshuffle)ÚsleepÚtime)ÚTracebackType)ÚAnyÚLiteral)Ú_Element)Ú
HTMLParser)Údocument_fromstringé   )ÚDuckDuckGoSearchExceptionÚRatelimitExceptionÚTimeoutException)Ú_expand_proxy_tb_aliasÚ_extract_vqdÚ
_normalizeÚ_normalize_urlÚ
json_loadszduckduckgo_search.DDGSc                   @  s  e Zd ZdZ					dSdTdd„ZdUdd„Z			dVdWdd„ZedXdd„ƒZdYdZd#d$„Z								d[d\d1d2„Z
d]d4d5„Z	6	7		8	d^d_d?d@„Z	6		d`dadAdB„Z	6		d`dadCdD„Z	6	7							dbdcdJdK„Z	6	7					dddedOdP„Z	6	7		dfdgdQdR„ZdS )hÚDDGSzBDuckDuckgo_search class to get search results from duckduckgo.com.Né
   TÚheadersúdict[str, str] | NoneÚproxyú
str | NoneÚproxiesúdict[str, str] | str | NoneÚtimeoutú
int | NoneÚverifyÚboolÚreturnÚNonec              
   C  s¾   t j d¡}|r
|nt|ƒ| _| jdu st| jtƒsJ dƒ‚|s;|r;tjddd� t|t	ƒr8| d¡p7| d¡n|| _|r?|ni | _
d	| j
d
< || _tj| j| jddddd|d�| _d| _dS )aù  Initialize the DDGS object.

        Args:
            headers (dict, optional): Dictionary of headers for the HTTP client. Defaults to None.
            proxy (str, optional): proxy for the HTTP client, supports http/https/socks5 protocols.
                example: "http://user:pass@example.com:3128". Defaults to None.
            timeout (int, optional): Timeout value for the HTTP client. Defaults to 10.
            verify (bool): SSL verification when making the request. Defaults to True.
        Z
DDGS_PROXYNzproxy must be a strz-'proxies' is deprecated, use 'proxy' instead.r   ©Ú
stacklevelÚhttpÚhttpsúhttps://duckduckgo.com/ÚRefererTÚrandomF)r   r!   Zcookie_storeZrefererZimpersonateZimpersonate_osZfollow_redirectsr#   ç        )ÚosÚenvironÚgetr   r   Ú
isinstanceÚstrÚwarningsÚwarnÚdictr   r!   ÚprimpZClientÚclientÚsleep_timestamp)Úselfr   r   r   r!   r#   Z
ddgs_proxy© r;   úYC:\Users\shubh\Videos\agent\nova\Lib\site-packages\duckduckgo_search/duckduckgo_search.pyÚ__init__"   s,   € 
÷
zDDGS.__init__c                 C  s   | S ©Nr;   ©r:   r;   r;   r<   Ú	__enter__I   s   zDDGS.__enter__Úexc_typeútype[BaseException] | NoneÚexc_valúBaseException | NoneÚexc_tbúTracebackType | Nonec                 C  s   d S r>   r;   )r:   rA   rC   rE   r;   r;   r<   Ú__exit__L   s   zDDGS.__exit__ÚLHTMLParserc                 C  s   t ddddd�S )zGet HTML parser.TF)Zremove_blank_textZremove_commentsZ
remove_pisZcollect_ids)rH   r?   r;   r;   r<   ÚparserT   s   zDDGS.parserç      è?Ú	sleeptimeÚfloatc                 C  s6   | j sdntƒ | j  dkrdn|}tƒ | _ t|ƒ dS )zSleep between API requests.r.   é   N)r9   r	   r   )r:   rK   Údelayr;   r;   r<   Ú_sleepY   s   "zDDGS._sleepÚmethodúCLiteral['GET', 'HEAD', 'OPTIONS', 'DELETE', 'POST', 'PUT', 'PATCH']Úurlr3   ÚparamsÚcontentúbytes | NoneÚdataÚcookiesÚjsonr   úfloat | Nonec
                 C  s  |   ¡  z| jj|||||||||	p| jd�	}
W n4 tyL } z(dt|ƒ ¡ v r8t|› dt|ƒj	› d|› �ƒ|‚t
|› dt|ƒj	› d|› �ƒ|‚d }~ww t d|
j› d|
j› �¡ |
jdkra|
S |
jdv rrt|
j› d|
j› d�ƒ‚t
|
j› d	|›d
|›d|›�ƒ‚)N)rS   rT   rV   r   rW   rX   r!   r	   ú z: z_get_url() éÈ   )éÊ   i-  i“  i�  i­  i¢  z
 Ratelimitz return None. params=z	 content=z data=)rO   r8   Úrequestr!   Ú	Exceptionr3   Úlowerr   ÚtypeÚ__name__r   ÚloggerÚdebugrR   Ústatus_coder   )r:   rP   rR   rS   rT   rV   r   rW   rX   r!   ÚrespÚexr;   r;   r<   Ú_get_url_   s2   
÷  €ý

 zDDGS._get_urlÚkeywordsc                 C  s    | j ddd|id�j}t||ƒS )z!Get vqd value for a search query.ÚGETzhttps://duckduckgo.comÚq©rS   )rg   rT   r   )r:   rh   Úresp_contentr;   r;   r<   Ú_get_vqdƒ   s   
zDDGS._get_vqdúwt-wtÚmoderateÚautoÚregionÚ
safesearchÚ	timelimitÚbackendÚmax_resultsúlist[dict[str, str]]c                 C  sÖ   |dv rt jd|›d�dd� d}|dkrddgn|g}t|ƒ g d	}}	|D ]?}
z|
dkr7|  ||||¡}n|
dkrC|  ||||¡}|W   S  tyf } zt d
|
› d|› �¡ |}	W Y d	}~q'd	}~ww t|	ƒ‚)aj  DuckDuckGo text search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: wt-wt, us-en, uk-en, ru-ru, etc. Defaults to "wt-wt".
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: d, w, m, y. Defaults to None.
            backend: auto, html, lite. Defaults to auto.
                auto - try all backends in random order,
                html - collect data from https://html.duckduckgo.com,
                lite - collect data from https://lite.duckduckgo.com.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with search results, or None if there was an error.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        )ÚapiZecosiazbackend=z$ is deprecated, using backend='auto'é   r'   rp   ÚhtmlZliteNzError to search using z
 backend: )	r4   r5   r   Ú
_text_htmlÚ
_text_liter^   rb   Úinfor   )r:   rh   rq   rr   rs   rt   ru   ÚbackendsÚresultsÚerrÚbrf   r;   r;   r<   Útextˆ   s&   

€þz	DDGS.textc                 C  sî  |sJ dƒ‚|d|dœ}|r||d< t ƒ }g }tdƒD ]Ù}| jdd|d�j}	d	|	v r.|  S t|	| jƒ}
|
 d
¡}t|tƒsB|  S |D ]t}t|t	ƒr¸| d¡}|r]t|tƒr]t
|d ƒnd }|r¸||vr¸| d¡s¸| |¡ | d¡}|r�t|tƒr�t
|d ƒnd}| d¡}|r™t|tƒr™d dd„ |D ƒ¡nd}| t|ƒt|ƒt|ƒdœ¡ |r¸t|ƒ|kr¸|    S qD|
 d¡}|rÂ|sÆ|  S t|tƒrÏ|d nd }t|t	ƒrô| d¡}| d¡}t|tƒrôt|tƒrôdd„ t||ƒD ƒ}q|S )Núkeywords is mandatoryÚ )rj   r€   ÚklÚdfé   ÚPOSTz https://html.duckduckgo.com/html©rV   s   No  results.z	//div[h2]z	./a/@hrefr   ©zhttp://www.google.com/search?q=z%https://duckduckgo.com/y.js?ad_domainz./h2/a/text()z./a//text()c                 s  ó   � | ]}t |ƒV  qd S r>   ©r3   ©Ú.0Úxr;   r;   r<   Ú	<genexpr>ç   ó   € z"DDGS._text_html.<locals>.<genexpr>©ÚtitleÚhrefÚbodyz.//div[@class="nav-link"]éÿÿÿÿú.//input[@type="hidden"]/@nameú.//input[@type="hidden"]/@valuec                 S  ó   i | ]\}}t |ƒt |ƒ“qS r;   r‹   ©r�   ÚnÚvr;   r;   r<   Ú
<dictcomp>ú   ó    z#DDGS._text_html.<locals>.<dictcomp>)ÚsetÚrangerg   rT   r   rI   Úxpathr2   Úlistr   r3   Ú
startswithÚaddÚjoinÚappendr   r   ÚlenÚzip)r:   rh   rq   rs   ru   ÚpayloadÚcacher~   Ú_rl   ÚtreeÚelementsÚeÚ	hrefxpathr“   Ú
titlexpathr’   Ú	bodyxpathr”   ÚnpxÚ	next_pageÚnamesÚvaluesr;   r;   r<   rz   º   sj   ý



ÿÿÿ


&ýÿ€



€zDDGS._text_htmlc                   sB  |sJ dƒ‚||dœ}|r||d< t ƒ }g }tdƒD �]}| jdd|d�j}	d|	v r.|  S t|	| jƒ}
|
 d	¡}t|tƒsB|  S t	t
td
dƒƒ|ƒ‰ ˆ D ]‘\}}t|tƒrß|d
kr¢| d¡}|rmt|tƒrmt|d ƒnd }|d u s|||v s|| d¡rˆ‡ fdd„tdƒD ƒ qN| |¡ | d¡}|rŸt|tƒrŸt|d ƒnd}qN|dkrß| d¡}|r¾t|tƒr¾d dd„ |D ƒ¡ ¡ nd}|rß| t|ƒt|ƒt|ƒdœ¡ |rßt|ƒ|krß|    S qN|
 d¡}|ré|sí|  S t|tƒrö|d nd }t|tƒ�r| d¡}| d¡}t|tƒ�rt|tƒ�rdd„ t	||ƒD ƒ}q|S )Nr‚   )rj   r„   r…   r†   r‡   z!https://lite.duckduckgo.com/lite/rˆ   s   No more results.z//table[last()]//trr   z.//a//@hrefr   r‰   c                   s   g | ]}t ˆ d ƒ‘qS r>   )Únext)r�   rª   rˆ   r;   r<   Ú
<listcomp>(  s    z#DDGS._text_lite.<locals>.<listcomp>é   z.//a//text()rƒ   rx   z&.//td[@class='result-snippet']//text()c                 s  rŠ   r>   r‹   rŒ   r;   r;   r<   r�   0  r�   z"DDGS._text_lite.<locals>.<genexpr>r‘   z(//form[./input[contains(@value, 'ext')]]r•   r–   r—   c                 S  r˜   r;   r‹   r™   r;   r;   r<   rœ   G  r�   z#DDGS._text_lite.<locals>.<dictcomp>)rž   rŸ   rg   rT   r   rI   r    r2   r¡   r§   r   r   r3   r¢   r£   r¤   Ústripr¥   r   r   r¦   )r:   rh   rq   rs   ru   r¨   r©   r~   rª   rl   r«   r¬   Úir­   r®   r“   r¯   r’   r°   r”   r±   r²   r³   r´   r;   rˆ   r<   r{   þ   sz   þ



ÿÿ

 
ÿÿýýÿ€


€zDDGS._text_liteÚsizeÚcolorÚ
type_imageÚlayoutÚlicense_imagec                 C  sÔ  |sJ dƒ‚|   |¡}ddddœ}|rd|› �nd}|r!d|› �nd}|r*d|› �nd}|r3d	|› �nd}|r<d
|› �nd}|	rEd|	› �nd}	|d|||› d|› d|› d|› d|› d|	› �|| ¡  dœ}tƒ }g }tdƒD ]y}| jdd|ddid�j}t|ƒ}| dg ¡}|D ]A}| d¡}|rÉ||vrÉ| |¡ |d t	|ƒt	|d ƒt	|d ƒ|d |d |d dœ}| 
|¡ |
rÉt|ƒ|
krÉ|    S qˆ| d¡}|du sÕ|
sÙ|  S | d ¡d!  d"¡d# |d$< qn|S )%a.  DuckDuckGo images search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: wt-wt, us-en, uk-en, ru-ru, etc. Defaults to "wt-wt".
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: Day, Week, Month, Year. Defaults to None.
            size: Small, Medium, Large, Wallpaper. Defaults to None.
            color: color, Monochrome, Red, Orange, Yellow, Green, Blue,
                Purple, Pink, Brown, Black, Gray, Teal, White. Defaults to None.
            type_image: photo, clipart, gif, transparent, line.
                Defaults to None.
            layout: Square, Tall, Wide. Defaults to None.
            license_image: any (All Creative Commons), Public (PublicDomain),
                Share (Free to Share and Use), ShareCommercially (Free to Share and Use Commercially),
                Modify (Free to Modify, Share, and Use), ModifyCommercially (Free to Modify, Share, and
                Use Commercially). Defaults to None.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with images search results.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        r‚   Ú1ú-1©Úonro   Úoffztime:rƒ   zsize:zcolor:ztype:zlayout:zlicense:rX   ú,©ÚlÚorj   ÚvqdÚfÚpr†   ri   zhttps://duckduckgo.com/i.jsr,   r+   )rS   r   r~   Úimager’   Ú	thumbnailrR   ÚheightÚwidthÚsource)r’   rË   rÌ   rR   rÍ   rÎ   rÏ   rµ   Nús=r•   ú&r   Ús)rm   r_   rž   rŸ   rg   rT   r   r1   r£   r   r¥   r¦   Úsplit)r:   rh   rq   rr   rs   rº   r»   r¼   r½   r¾   ru   rÈ   Úsafesearch_baser¨   r©   r~   rª   rl   Ú	resp_jsonÚ	page_dataÚrowÚ	image_urlÚresultrµ   r;   r;   r<   ÚimagesK  s^   (
$
ú	ÿþ



ù
	€
zDDGS.imagesÚ
resolutionÚdurationÚlicense_videosc	                 C  s`  |sJ dƒ‚|   |¡}	ddddœ}
|rd|› �nd}|r!d|› �nd}|r*d	|› �nd}|r3d
|› �nd}|d||	|› d|› d|› d|› �|
| ¡  dœ}tƒ }g }tdƒD ]W}| jdd|d�j}t|ƒ}| dg ¡}|D ]"}|d |vr�| |d ¡ | 	|¡ |r�t
|ƒ|kr�|    S qm| d¡}|du s›|sŸ|  S | d¡d  d¡d |d< qV|S )a  DuckDuckGo videos search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: wt-wt, us-en, uk-en, ru-ru, etc. Defaults to "wt-wt".
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: d, w, m. Defaults to None.
            resolution: high, standart. Defaults to None.
            duration: short, medium, long. Defaults to None.
            license_videos: creativeCommon, youtube. Defaults to None.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with videos search results.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        r‚   r¿   rÀ   ú-2rÁ   zpublishedAfter:rƒ   zvideoDefinition:zvideoDuration:zvideoLicense:rX   rÄ   rÅ   é   ri   zhttps://duckduckgo.com/v.jsrk   r~   rT   rµ   NrÐ   r•   rÑ   r   rÒ   )rm   r_   rž   rŸ   rg   rT   r   r1   r£   r¥   r¦   rÓ   )r:   rh   rq   rr   rs   rÛ   rÜ   rÝ   ru   rÈ   rÔ   r¨   r©   r~   rª   rl   rÕ   rÖ   r×   rµ   r;   r;   r<   Úvideos¨  s@   

ú	
€
zDDGS.videosc              	   C  sZ  |sJ dƒ‚|   |¡}ddddœ}|dd|||| ¡  dœ}|r$||d< tƒ }	g }
td	ƒD ]}}| jd
d|d�j}t|ƒ}| dg ¡}|D ]H}|d |	vrŒ|	 |d ¡ | dd¡}t	 
|d tj¡ ¡ |d t|d ƒt|d ƒt|ƒ|d dœ}|
 |¡ |rŒt|
ƒ|krŒ|
    S qD| d¡}|du s˜|sœ|
  S | d¡d  d¡d |d< q-|
S )aO  DuckDuckGo news search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: wt-wt, us-en, uk-en, ru-ru, etc. Defaults to "wt-wt".
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: d, w, m. Defaults to None.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with news search results.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        r‚   r¿   rÀ   rÞ   rÁ   rX   )rÆ   rÇ   Znoamprj   rÈ   rÊ   r…   r†   ri   zhttps://duckduckgo.com/news.jsrk   r~   rR   rË   NÚdater’   ZexcerptrÏ   )rá   r’   r”   rR   rË   rÏ   rµ   rÐ   r•   rÑ   r   rÒ   )rm   r_   rž   rŸ   rg   rT   r   r1   r£   r   Úfromtimestampr   ÚutcÚ	isoformatr   r   r¥   r¦   rÓ   )r:   rh   rq   rr   rs   ru   rÈ   rÔ   r¨   r©   r~   rª   rl   rÕ   rÖ   r×   rØ   rÙ   rµ   r;   r;   r<   Únewsî  sL   

ú

ú
€
z	DDGS.news)NNNr   T)r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   )r%   r   )NNN)rA   rB   rC   rD   rE   rF   r%   r&   )r%   rH   )rJ   )rK   rL   r%   r&   )NNNNNNN)rP   rQ   rR   r3   rS   r   rT   rU   rV   r   r   r   rW   r   rX   r   r!   rY   r%   r   )rh   r3   r%   r3   )rn   ro   Nrp   N)rh   r3   rq   r3   rr   r3   rs   r   rt   r3   ru   r"   r%   rv   )rn   NN)
rh   r3   rq   r3   rs   r   ru   r"   r%   rv   )	rn   ro   NNNNNNN)rh   r3   rq   r3   rr   r3   rs   r   rº   r   r»   r   r¼   r   r½   r   r¾   r   ru   r"   r%   rv   )rn   ro   NNNNN)rh   r3   rq   r3   rr   r3   rs   r   rÛ   r   rÜ   r   rÝ   r   ru   r"   r%   rv   )rn   ro   NN)rh   r3   rq   r3   rr   r3   rs   r   ru   r"   r%   rv   )ra   Ú
__module__Ú__qualname__Ú__doc__r=   r@   rG   r   rI   rO   rg   rm   r�   rz   r{   rÚ   rà   rå   r;   r;   r;   r<   r      s|    ú
'ü
ö
$ù5ûGûPõ`÷Iúr   )(Ú
__future__r   Úloggingr/   r4   r   r   Ú	functoolsr   Ú	itertoolsr   r-   r   r	   r   Útypesr
   Útypingr   r   r7   Z
lxml.etreer   Z	lxml.htmlr   rH   r   Ú
exceptionsr   r   r   Úutilsr   r   r   r   r   Ú	getLoggerrb   r   r;   r;   r;   r<   Ú<module>   s&    
