Ë
    cQêjÒ(  ã                   óð   — d 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m	Z	 ddl
mZ ddlmZ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 ddlmZ ddlmZ  ej<                  e«      Z  G d„ d«      Z!y)zDDGS class implementation.é    N)ÚThreadPoolExecutorÚwait)Úceil)ÚrandomÚshuffle)ÚTracebackType)ÚAnyÚClassVaré   )ÚBaseSearchEngine)ÚENGINES)ÚDDGSExceptionÚTimeoutException)Ú
HttpClient)ÚResultsAggregator)ÚSimpleFilterRanker)Ú_expand_proxy_tb_aliasc                   ó  — e Zd ZU dZdZeedz     ed<   	 	 d*ddœdedz  dedz  de	ez  d	dfd
„Z
d+d„Z	 	 	 d,dee   dz  dedz  dedz  d	dfd„Zdeded	eee      fd„Z	 d-dddddddœdedededz  dedededz  dedz  deded ed	eeeef      fd!„Zded ed	eeeef      fd"„Zded ed	eeeef      fd#„Zded ed	eeeef      fd$„Zded ed	eeeef      fd%„Zded ed	eeeef      fd&„Zd.d'ed(ed	eeeez  f   fd)„Zy)/ÚDDGSa’  DDGS | Dux Distributed Global Search.

    A metasearch library that aggregates results from diverse web search services.

    Args:
        proxy: The proxy to use for the search. Defaults to None.
        timeout: The timeout for the search. Defaults to 5.
        verify: bool (True to verify, False to skip) or str path to a PEM file. Defaults to True.

    Attributes:
        threads: The maximum number of threads per search. Defaults to None (automatic, based on max_results).

    Raises:
        DDGSException: If an error occurs during the search.

    Example:
        >>> from ddgs import DDGS
        >>> results = DDGS().search("python")

    NÚthreadsT)ÚverifyÚproxyÚtimeoutr   Úreturnc                ó�   — t        |«      xs t        j                  j                  d«      | _        || _        || _        i | _        y )NÚ
DDGS_PROXY)r   ÚosÚenvironÚgetÚ_proxyÚ_timeoutÚ_verifyÚ_engines_cache)Úselfr   r   r   s       úN/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/ddgs/ddgs.pyÚ__init__zDDGS.__init__.   s=   € ô -¨UÓ3ÒS´r·z±z·~±~ÀlÓ7SˆŒØˆŒØˆŒð ð 	Õó    c                 ó   — | S )z7Enter the context manager and return the DDGS instance.© )r$   s    r%   Ú	__enter__zDDGS.__enter__<   s   € àˆr'   Úexc_typeÚexc_valÚexc_tbc                  ó   — y)zExit the context manager.Nr)   )r$   r+   r,   r-   s       r%   Ú__exit__zDDGS.__exit__@   s   � r'   ÚcategoryÚbackendc           	      óü  — t        |t        «      rdj                  |«      }|j                  d«      D �cg c]  }|j	                  «       ‘Œ }}t        t
        |   j                  «       «      }t        |«       d|v sd|v r"|}|dk(  rddg|D �cg c]	  }|dvsŒ|‘Œ c}z   }n|}g }g }	|D ]?  }
t
        |   j                  |
«      x}r|j                  |«       Œ/|	j                  |
«       ŒA |	rGt        j                  dd	j                  t        |	«      «      d	j                  t        |«      «      «       g }|D ]x  }|| j                  v r|j                  | j                  |   «       Œ0 || j                  | j                  | j                   ¬
«      }|| j                  |<   |j                  |«       Œz |s't        j                  d«       | j#                  |d«      S |j%                  d„ d¬«       |S c c}w c c}w )a¶  Retrieve a list of search engine instances for a given category and backend.

        Args:
            category: The category of search engines (e.g., 'text', 'images', etc.).
            backend: A single or comma-delimited backends. Defaults to "auto".

        Returns:
            A list of initialized search engine instances corresponding to the specified
            category and backend. Instances are cached for reuse.

        ú,ÚautoÚallÚtextÚ	wikipediaÚ
grokipedia)r7   r8   z9%s - backends do not exist or are disabled. Available: %sz, ©r   r   r   z backend is not set. Using 'auto'c                 ó&   — | j                   t        fS ©N)Úpriorityr   )Úes    r%   ú<lambda>z#DDGS._get_engines.<locals>.<lambda>„   s   €  a§j¡j´&Ð%9€ r'   T)ÚkeyÚreverse)Ú
isinstanceÚlistÚjoinÚsplitÚstripr   Úkeysr   r   ÚappendÚloggerÚwarningÚsortedr#   r    r!   r"   Ú_get_enginesÚsort)r$   r0   r1   ÚxÚbackend_listÚengine_keysrF   ÚkÚengine_classesÚinvalid_keysr?   Úengine_classÚ	instancesÚengine_instances                 r%   rK   zDDGS._get_enginesH   së  € ô  �gœtÔ$Ø—h‘h˜wÓ'ˆGØ+2¯=©=¸Ó+=Ö> a˜Ÿ™�	Ð>ˆÐ>Üœ7 8Ñ,×1Ñ1Ó3Ó4ˆÜ�ÔØ�\Ñ! U¨lÑ%:ØˆDØ˜6Ò!Ø# \Ð2ÀÖ5n¸AÈÐRmÒIm²aÒ5nÑn‘àˆDàˆØˆØò 	)ˆCÜ& xÑ0×4Ñ4°SÓ9Ð9ˆ|Ð9Ø×%Ñ% lÕ3à×#Ñ# CÕ(ð		)ñ Ü�N‰NØKØ—	‘	œ& Ó.Ó/Ø—	‘	œ& Ó-Ó.ôð ˆ	Ø*ò 	2ˆLà˜t×2Ñ2Ñ2Ø× Ñ  ×!4Ñ!4°\Ñ!BÕCñ #/°T·[±[È$Ï-É-Ð`d×`lÑ`lÔ"m�Ø4C�×#Ñ# LÑ1Ø× Ñ  Õ1ð	2ñ Ü�N‰NÐ=Ô>Ø×$Ñ$ X¨vÓ6Ð6ð 	�‰Ñ9À4ˆÔHØÐùòW ?ùò 6os   µG4Â	G9ÂG9zus-enÚmoderateé
   r   r4   )ÚregionÚ
safesearchÚ	timelimitÚmax_resultsÚpager1   ÚqueryÚkeywordsrX   rY   rZ   r[   r\   Úkwargsc          
      óÚ  — |xs |}|sd}t        |«      ‚| j                  ||	«      }t        |D �ch c]  }|j                  ’Œ c}«      }t	        «       }t        h d£«      }|rt        |t        |dz  «      dz   «      n|}t        j                  rt        |t        j                  «      }i d}}t        |d¬«      5 }t        g |¢d‘d¬«      D ]î  \  }}|r7|j                  |v rŒ |j                  |j                  |f||||d	œ|
¤Ž}|||<   t        |«      |k\  s||k\  rŠt        || j                  d
¬«      \  }}|j!                  «       D ]I  \  }}||v sŒ	 |j#                  «       x}r,|j%                  |«       |j'                  |j                  «       ŒK |D �ci c]  }|||   “Œ
 }}|sŒßt        |«      |k\  sŒî n ddd«       |j1                  «       }t3        «       }|j5                  ||«      }|r	|r|d| S |S d|› v rt7        |«      ‚t        |xs d«      ‚c c}w # t(        $ r.}|}t*        j-                  d|j.                  |«       Y d}~�Œ	d}~ww xY wc c}w # 1 sw Y   Œ£xY w)aƒ  Perform a search across engines in the given category.

        Args:
            category: The category of search engines (e.g., 'text', 'images', etc.).
            query: The search query.
            keywords: Deprecated alias for `query`.
            region: The region to use for the search (e.g., us-en, uk-en, ru-ru, etc.).
            safesearch: The safesearch setting (e.g., on, moderate, off).
            timelimit: The timelimit for the search (e.g., d, w, m, y) or custom date range.
            max_results: The maximum number of results to return. Defaults to 10.
            page: The page of results to return. Defaults to 1.
            backend: A single or comma-delimited backends. Defaults to "auto".
            **kwargs: Additional keyword arguments to pass to the search engines.

        Returns:
            A list of dictionaries containing the search results.

        zquery is mandatory.>   ÚurlÚhrefÚimageÚ	embed_urlrW   r   Nr   )Úmax_workersÚthread_name_prefix)Ústart)rX   rY   rZ   r\   ÚFIRST_EXCEPTION)r   Úreturn_whenzError in engine %s: %rz	timed outzNo results found.)r   rK   ÚlenÚproviderÚsetr   Úminr   r   r   r   Ú	enumerateÚsubmitÚsearchr   r!   ÚitemsÚresultÚextendÚaddÚ	ExceptionrH   ÚinfoÚnameÚextract_dictsr   Úrankr   )r$   r0   r]   r^   rX   rY   rZ   r[   r\   r1   r_   ÚmsgÚenginesÚengineÚlen_unique_providersÚseen_providersÚresults_aggregatorre   ÚfuturesÚerrÚexecutorÚiÚfutureÚdoneÚnot_doneÚfÚf_engineÚrÚexÚresultsÚrankers                                  r%   Ú_search_synczDDGS._search_sync‡   s™  € ð@ Ò!˜EˆÙØ'ˆCÜ Ó$Ð$à×#Ñ# H¨gÓ6ˆÜ"À'Ö#J¸ F§O£OÒ#JÓKÐÜ#&£5ˆô ;LÒLqÓ:rÐÙOZ”cÐ.´°[À2Ñ5EÓ0FÈÑ0JÔKÐ`tˆÜ�<Š<Ü˜k¬4¯<©<Ó8ˆKØ˜4�ˆÜ¨KÈFÔSð 	ÐW_Ü&Ð'7¨Ð'7°$Ð'7¸qÔAò ‘	��6ÙØ—‘¨.Ñ8Ø Ø,˜XŸ_™_ØŸ™Øðð  &Ø#-Ø"+Ø!ñð !ñ�Fð '-�G˜F‘Oä�w“< ;Ò.°!°{Ò2BÜ%)¨'¸4¿=¹=ÐVgÔ%h‘N�D˜(Ø'.§}¡}£ò Y™˜˜8Ø š9ðYØ()¯©«
 ? 1 ?Ø$6×$=Ñ$=¸aÔ$@Ø$2×$6Ñ$6°x×7HÑ7HÔ$IøðYð 7?Ö?°˜q '¨!¡*™}Ð?�GÐ?â¤3Ð'9Ó#:¸kÓ#IÙð;÷	ð@ %×2Ñ2Ó4ˆä#Ó%ˆØ—+‘+˜g uÓ-ˆáÙ,7�7˜<˜KÐ(ÐD¸WÐDà˜S˜EÑ"Ü" 3Ó'Ð'Ü˜CÒ6Ð#6Ó7Ð7ùòg $KøôB $-ò YØ&( Ü &§¡Ð,DÀhÇmÁmÐUW× XÒ XûðYüò @÷7	ð 	úsT   ±HÂ<BI!Å>H"ÆI!ÆIÆ(I!Æ-I!Æ<I!È"	I	È+#I	ÉI!ÉI	ÉI!É!I*c                 ó*   —  | j                   d|fi |¤ŽS )zPerform a text search.r6   ©r�   ©r$   r]   r_   s      r%   r6   z	DDGS.textâ   ó   € à ˆt× Ñ  ¨Ñ9°&Ñ9Ð9r'   c                 ó*   —  | j                   d|fi |¤ŽS )zPerform an image search.Úimagesr�   r�   s      r%   r“   zDDGS.imagesæ   ó   € à ˆt× Ñ  ¨5Ñ;°FÑ;Ð;r'   c                 ó*   —  | j                   d|fi |¤ŽS )zPerform a news search.Únewsr�   r�   s      r%   r–   z	DDGS.newsê   r‘   r'   c                 ó*   —  | j                   d|fi |¤ŽS )zPerform a video search.Úvideosr�   r�   s      r%   r˜   zDDGS.videosî   r”   r'   c                 ó*   —  | j                   d|fi |¤ŽS )zPerform a book search.Úbooksr�   r�   s      r%   rš   z
DDGS.booksò   s   € à ˆt× Ñ  ¨%Ñ:°6Ñ:Ð:r'   ra   Úfmtc                 ó†  — t        | j                  | j                  | j                  ¬«      }|j	                  |«      }|j
                  dk7  rd|› d|j
                  › �}t        |«      ‚|dk(  r|j                  }nB|dk(  r|j                  }n0|dk(  r|j                  }n|dk(  r|j                  }n|j                  }||d	œS )
a9  Fetch a URL and extract its content.

        Args:
            url: The URL to fetch and extract content from.
            fmt: Output format: "text_markdown", "text_plain", "text_rich", "text" (raw HTML), "content" (raw bytes).

        Returns:
            A dictionary with 'url' and 'content' keys.

        r9   éÈ   zFailed to fetch z: HTTP Ú
text_plainÚ	text_richr6   Úcontent)ra   r    )r   r    r!   r"   r   Ústatus_coder   rž   rŸ   r6   r    Útext_markdown)r$   ra   r›   ÚclientÚresprz   r    s          r%   ÚextractzDDGS.extractö   s¶   € ô  $§+¡+°t·}±}ÈTÏ\É\ÔZˆØ�z‰z˜#‹ˆØ×Ñ˜sÒ"Ø$ S E¨°×1AÑ1AÐ0BÐCˆCÜ Ó$Ð$à�,ÒØ—o‘o‰GØ�KÒØ—n‘n‰GØ�FŠ]Ø—i‘i‰GØ�IÒØ—l‘l‰Gà×(Ñ(ˆGØ wÑ/Ð/r'   )Né   )r   r   )NNNr;   )r¢   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r
   ÚintÚ__annotations__ÚstrÚboolr&   r*   ÚtypeÚBaseExceptionr   r/   rB   r   r	   rK   Údictr�   r6   r“   r–   r˜   rš   Úbytesr¥   r)   r'   r%   r   r      s‚  … ñð* %)€GˆX�c˜D‘jÑ!Ó(ð !Øðð
 "òà�T‰zðð �t‘ðð
 �s‘
ðð 
óóð 04Ø(,Ø'+ñ	(à�}Ñ%¨Ñ,ð(ð  Ñ%ð(ð  Ñ$ð	(ð
 
ó(ð=àð=ð ð=ð 
Ð˜sÑ#Ñ	$ó	=ðF  $ð	Y8ð Ø$Ø $Ø"$ØØòY8àðY8ð ðY8ð ˜‘*ð	Y8ð ðY8ð ðY8ð ˜‘:ðY8ð ˜4‘ZðY8ð ðY8ð ðY8ð ðY8ð 
ˆd�3˜�8‰nÑ	óY8ðv:˜#ð :¨ð :°°d¸3À¸8±nÑ1Eó :ð<˜Cð <¨3ð <°4¸¸SÀ#¸X¹Ñ3Gó <ð:˜#ð :¨ð :°°d¸3À¸8±nÑ1Eó :ð<˜Cð <¨3ð <°4¸¸SÀ#¸X¹Ñ3Gó <ð;˜3ð ;¨#ð ;°$°t¸CÀ¸H±~Ñ2Fó ;ñ0˜3ð 0 Sð 0¸tÀCÈÈuÉÐDTÑ?Uô 0r'   r   )"rª   Úloggingr   Úconcurrent.futuresr   r   Úmathr   r   r   Útypesr   Útypingr	   r
   Úbaser   r{   r   Ú
exceptionsr   r   Úhttp_clientr   r‹   r   Ú
similarityr   Úutilsr   Ú	getLoggerr§   rH   r   r)   r'   r%   ú<module>r¾      sP   ðÙ  ã Û 	ß 7Ý ß "Ý ß  å "Ý ß 7Ý #Ý &Ý *Ý )à	ˆ×	Ñ	˜8Ó	$€÷{0ò {0r'   