
    j`              ?       r   d Z ddlZddl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	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  ej.                         dz  dz  dz  Z ej2                  e      Zi ddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+Zd,ej:                  d-ej<                  d.ee    dz  d/e fd0Z!d1e d2e"e#e e f      d3e d4e dz  d/df
d5Z$d6e ez  d2e"e#e e f      d/dfd7Z%d8e ez  d2e"e#e e f      d/dfd9Z&d:d;d2e"e#e e f      d<e'd/dfd=Z(d1e d/e fd>Z)d?e d@e d4e dAe dz  dBe'd/dfdCZ*	 	 	 ddDdEd1e dFe"e#e e f      d3e dAe dz  dGe+dz  dHe dz  dBe'd/dfdIZ, ejZ                  dDJ      ddK       Z.ddLZ/e.ja                         d/e fdM       Z1e.ja                          ejd                  dNdOdPQ       ejd                  dRdSdTQ       ejd                  dUdVdWdXY       ejd                  dZd[d\ ejf                  g d]      ^       ejd                  d_d` ejf                  g da      dbc       ejd                  ddded e+dfg       ejd                  dhdide+djg       ejd                  dkdldmg ejf                  g dn      dDe!o       ejd                  dpdqdrQ       ejd                  dsdtdDd:duv       ejd                  dwdxdyQ       ejd                  dzd{d d|Y       ejd                  d}d~dQ       ejd                  dddDdY       ejd                  dddDd:dv      d1e de dz  de de de dz  de+dz  de+de de dz  de dz  dGe+dAe dz  de'dBe'd<e'd/df d                                                                                                                Z4e.ja                          ejd                  dNdOdQ       ejd                  dRdSdQ       ejd                  dUdVdWdXY       ejd                  dZd[d\ ejf                  g d]      ^       ejd                  d_d` ejf                  g da             ejd                  ddded e+dfg       ejd                  dhdide+djg       ejd                  dkdldmg ejf                  g d      dDe!o       ejd                  dd ejf                  g d             ejd                  dd ejf                  g d             ejd                  dd ejf                  g d             ejd                  dd ejf                  g d             ejd                  dd ejf                  g d             ejd                  dpdqdrQ       ejd                  dsdtdDd:duv       ejd                  dwdxdyQ       ejd                  dzd{d d|Y       ejd                  d}d~dQ       ejd                  dddDdY       ejd                  dddDd:dv      d1e de dz  de de de dz  de+dz  de+de de dz  de dz  de dz  de dz  de dz  de dz  dGe+de dz  dAe dz  de'dBe'd<e'd/df*d                                                                                                                                                   Z5e.ja                          ejd                  dNdOdQ       ejd                  dRdSdQ       ejd                  dUdVdWdXY       ejd                  dZd[d\ ejf                  g d]      ^       ejd                  d_d` ejf                  g d      dc       ejd                  ddded e+dfg       ejd                  dhdide+djg       ejd                  dkdldmg ejf                  g d      dDe!o       ejd                  dd ejf                  ddg             ejd                  dsd ejf                  g d             ejd                  dd ejf                  ddg             ejd                  dpdqdrQ       ejd                  d}d~dQ       ejd                  dddDdY       ejd                  dddDd:dv      d1e de dz  de de de dz  de+dz  de+de de dz  de dz  de dz  de dz  dAe dz  dBe'd<e'd/df d                                                                                                                Z6e.ja                          ejd                  dNdOdQ       ejd                  dRdSdQ       ejd                  dUdVdWdXY       ejd                  dZd[d\ ejf                  g d]      ^       ejd                  d_d` ejf                  g da      dbc       ejd                  ddded e+dfg       ejd                  dhdide+djg       ejd                  dkdldmg ejf                  g d      dDe!o       ejd                  dpdqdrQ       ejd                  d}d~dQ       ejd                  dddDdY       ejd                  dddDd:dv      d1e de dz  de de de dz  de+dz  de+de de dz  dAe dz  dBe'd<e'd/dfd                                                                                           Z7e.ja                          ejd                  dNdOdQ       ejd                  dRdSdQ       ejd                  ddded e+dfg       ejd                  dhdide+djg       ejd                  dkdldmg ejf                  g d¢      dDe!o       ejd                  dpdqdrQ       ejd                  d}d~dQ       ejd                  dddDdY       ejd                  dddDd:dv      d1e de dz  de+dz  de+de de dz  dAe dz  dBe'd<e'd/dfdÄ                                                                      Z8e.ja                          ejd                  dddDdƬǫ       ejd                  dddd ejf                  g d̢      dͬg       ejd                  dpdqdάQ       ejd                  d}d~dQ       ejd                  dddDdY      d?e de de dz  dAe dz  dBe'd/dfdτ                                          Z9e.ja                          ejd                  d}d~dQ      dAe dz  d/dfdЄ              Z:e.ja                          ejd                  dsddDdҬӫ       ejd                  dZddDdլӫ       ejd                  dddجY       ejd                  dde+d۬g       ejd                  ddDdݬӫ       ejd                  d}d~dQ      de'de'de de+de'dAe dz  d/dfd                                                 Z;edk(  r e/        yy)zCLI tool for DDGS.    N)ThreadPoolExecutoras_completed)datetimetimezone)Path)unquote   )__version__)DDGS)_expand_proxy_tb_aliasz.cacheddgszapi.pidblackred   green   yellow   blue   magenta   cyan   bright_black   
bright_red	   bright_green
   bright_yellow   bright_blue   bright_magenta   bright_cyan   white   bright_white_ctx_paramvaluereturnc                 J    |!t        |t              rdj                  |      S y)N, )
isinstancetuplejoin)r,   r-   r.   s      3/usr/local/lib/python3.12/dist-packages/ddgs/cli.py_convert_tuple_to_csvr7   -   s"    Zu5xx    querydatafunction_namefilenamec                    |r#|j                  d      r|j                  dd      nd |f\  }}|xs- | d|  dt        j                  t        j
                        d}|dk(  rt        | d| |       y |dk(  rt        | d| |       y y )	N)z.csvz.json.r	   _tz%Y%m%d_%H%M%Scsvjson)endswithrsplitr   nowr   utc	_save_csv
_save_json)r9   r:   r;   r<   exts        r6   
_save_datarL   3   s    /7H<M<MN_<`HOOC+gkmufvMHccm_AeWAhllhll6STa5bcH
e|XJau%t,	hZq&- 
r8   jsonfilec                     t        |       j                  dd      5 }|j                  t        j                  |dd             d d d        y # 1 sw Y   y xY w)Nwutf-8)encodingFr   )ensure_asciiindent)r   openwriterD   dumps)rM   r:   files      r6   rJ   rJ   <   sM    	h		S7		3 Ct

4::dqABC C Cs   (AAcsvfilec                     t        |       j                  ddd      5 }|rZ|d   j                         }t        j                  ||t        j
                        }|j                          |j                  |       d d d        y # 1 sw Y   y xY w)NrO   r2   rP   )newlinerQ   r   )
fieldnamesquoting)r   rT   keysrC   
DictWriterQUOTE_MINIMALwriteheader	writerows)rX   r:   rW   headerswriters        r6   rI   rI   A   sv    	g		Cg		> #$1gllnG^^DWcFWFWXF T"# # #s   ABBFno_colorre   c          	         t         j                  j                         }|sd}| rt        | d      D ]  \  }}|r| dd n| d}t	        j
                  |dd	       t        |j                         d      D ]d  \  }\  }}|r-|d
v rdnd}	|dk(  rdn|}
t	        j                  | |	ddd      }n|}
|}t	        j
                  |
d| d|s	t        |   ndd       f |st                 y y )NTr	   startz.	    zN==============================================================================r>   r   r)   )bgfg)contenthrefimagesource	thumbnailurli,  N   detected_languagelanguager2   z            )widthinitial_indentsubsequent_indentpreserve_paragraphsz<12)ri   rj   overline)
sysstdoutisatty	enumerateclicksechoitems	wrap_textCOLORSinput)r:   re   is_ttyiesepjkvrt   titletexts               r6   _print_datar   J   s   ZZ Fd!, 	DAq-3QCwxj)A3aCKKG4&qwwy: x	6Aq#$(b#bChjE*+/B*BJE ??##')*2,0D EDuSk$0WRZ`grvwx '	 r8   c                    | j                  dd      j                  dd      j                  dd      j                  dd      j                  dd      j                  d	d      j                  d
d      j                  dd      S )Nfiletyper2   :"'site r?   /\)replace)r9   s    r6   _sanitize_queryr   e   si    j"%	b		c				c		c		s		b		r8   rp   dir_pathproxyverifyc                v   	 t        j                  |ddd|      j                  |       }|j                  dk(  rGt	        |      |d d z  }|j                  d      5 }|j                  |j                         d d d        y y # 1 sw Y   y xY w# t        $ r!}t        j                  d| |       Y d }~y d }~ww xY w)Nrandomr    )r   impersonateimpersonate_ostimeoutr      wbzError download_file url=%s: %r)primpClientgetstatus_coder   rT   rU   rk   	Exceptionloggerdebug)	rp   r   r<   r   r   respfrW   exs	            r6   _download_filer   r   s    	@||%Xh`bkqrvv
 s"X$3/A )

4<<() ) #) ) @5sB??@s6   AB B8B BB B 	B8B33B8Tr   resultsthreadspathnamec          
         |xs- | d|  dt        j                  t        j                        d}t	        |      j                  dd       |dn|}t        |      5 }g }	t        |d	      D ]t  \  }
}|d
k(  r|d   n|d   }t        |j                  d      d   j                  d      d         }|j                  t        |||
 d| ||      }|	j                  |       v t        j                  t        |	      dddd      5 }t!        |	      D ]#  }|j#                          |j%                  d       % 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr?   r@   rB   Tparentsexist_okr    )max_workersr	   rg   imagesrm   rl   r   ?r   r   Downloading2   )lengthlabelshow_percentshow_posrt   )r   rG   r   rH   r   mkdirr   r|   r   splitsubmitr   appendr}   progressbarlenr   resultupdate)r9   r   r;   r   r   r   r   pathexecutorfuturesr   resrp   r<   r   barfutures                    r6   _download_resultsr      si    _-%(,,(,,2OP]1^_DJTD1ObG		0 Hq1 	FAs"/8";#g,VCsyy~b177<Q?@HTaS(;Le\bcANN1		 w<
 		 &w/ 

1		 		 		 s%    B*E
2E=EE	EE#)chainc                       y)zDDGS CLI tool.N r   r8   r6   clir      s    r8   c                      t        j                  t         j                         	 t                y# t        $ r7} t        j                  t        |       j                   d|        Y d} ~ yd} ~ ww xY w)z=Run the CLI tool in try-except block to catch all exceptions.)levelz: N)	loggingbasicConfigWARNINGr   r   r}   echotype__name__)r   s    r6   safe_entry_pointr      sS    goo.3 3

d2h''(2&1223s   
1 	A1-A,,A1c                  ,    t        t               t        S )zPrint and return version.)printr
   r   r8   r6   versionr      s     
+r8   z-qz--queryztext search query)helpz-kz
--keywordsz(Deprecated) text search queryz-rz--regionzus-enzus-en, ru-ru, etc.)defaultr   z-sz--safesearchmoderate)onr   off)r   r   z-tz--timelimit)drO   myzday, week, month, year)r   r   -mz--max_resultszmaximum number of results)r   r   r   z-pz--pagezpage number of resultsz-bz	--backendauto)r   allbingbrave
duckduckgogoogle
grokipediamojeekyandexyahoo	wikipedia)r   r   multiplecallbackz-oz--outputzGcsv, json or filename.csv|json (save the results to a csv or json file)z-dz
--downloadz-download results. -dd to set custom directory)is_flagr   r   z-ddz--download-directoryz!Specify custom download directoryz-thz	--threadszdownload threads, default=10z-prz--proxyz=the proxy to send requests, example: socks5h://127.0.0.1:9150z-vz--verifyz"verify SSL when making the requestz-ncz
--no-colorzdisable color outputkeywordsregion
safesearch	timelimitmax_resultspagebackendoutputdownload_directorydownloadc          
          t        t        |      |      j                  | |||||||      }t        |xs |       } |rt	        | |d|       |rt        | |d||
||	       |s|st        ||       yyy)z/CLI function to perform a DDGS text metasearch.r   r   r9   r   r   r   r   r   r   r   r   r<   r;   r   r   r   r   rd   N)r   r   r   r   rL   r   r   )r9   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r:   s                   r6   r   r      s    p ,U3FCHH I 	D H-.E5$8 '	
 (D8, #6r8   zimages search queryz (Deprecated) images search query)r   )r   r   r   r   z-sizez--size)SmallMediumLarge	Wallpaperz-cz--color)color
MonochromeRedOrangeYellowGreenBluePurplePinkBrownBlackGrayTealWhitez-typez--type_image)photoclipartgiftransparentlinez-lz--layout)SquareTallWidez-licz--license_image)anyPublicShareShareCommerciallyModifyModifyCommerciallysizer  
type_imagelayoutlicense_imagec                    t        t        |      |      j                  | |||||||||	|
||      }t        |xs |       } |rt	        | |d|       |rt        | |d||||       |s|st        ||       yyy)z1CLI function to perform a DDGS images metasearch.r   )r9   r   r   r   r   r   r   r   r$  r  r%  r&  r'  r   r;   r<   r  rd   N)r   r   r   r   rL   r   r   )r9   r   r   r   r   r   r   r   r$  r  r%  r&  r'  r   r   r   r   r   r   re   r:   s                        r6   r   r   	  s    Z ,U3FCJJ# K D H-.E5$hH"'	
 (D8, #6r8   zvideos search queryz (Deprecated) videos search query)r   rO   r   zday, week, month)r   r   r   z-resz--resolutionhighstandartz
--duration)shortmediumlongz--license_videoscreativeCommonyoutube
resolutiondurationlicense_videosc                    t        t        |      |      j                  | |||||||||	|
      }t        |xs |       } |rt	        | |d|       yt        ||       y)z1CLI function to perform a DDGS videos metasearch.r   )r9   r   r   r   r   r   r   r   r1  r2  r3  videosr)  rd   N)r   r   r5  r   rL   r   )r9   r   r   r   r   r   r   r   r1  r2  r3  r   r   r   re   r:   s                   r6   r5  r5  v  su    T ,U3FCJJ% K D H-.E5$hHD8,r8   znews search queryz(Deprecated) news search query)r   r   r   r   r   c
          
          t        t        |	      |
      j                  | |||||||      }t        |xs |       } |rt	        | |d|       yt        ||       y)z/CLI function to perform a DDGS news metasearch.r   r  newsr)  rd   N)r   r   r7  r   rL   r   )r9   r   r   r   r   r   r   r   r   r   r   re   r:   s                r6   r7  r7    sl    H ,U3FCHH I 	D H-.E5$fvFD8,r8   zbooks search queryz(Deprecated) books search query)r   r   annasarchivec                    t        t        |      |      j                  | ||||      }	|rt        | |	d|       yt	        |	|       y)z0CLI function to perform a DDGS books metasearch.r   )r9   r   r   r   r   booksr)  rd   N)r   r   r:  rL   r   )
r9   r   r   r   r   r   r   r   re   r:   s
             r6   r:  r:    sS    < ,U3FCII J D 5$gGD8,r8   z-uz--urlzURL to extract content from)requiredr   z-fz--formatfmttext_markdown)r=  
text_plain	text_richr   rk   zOutput formatz2json or filename.json (save the results to a file)c          	         t        t        |      |      j                  | |      }|r]|j                         D ci c](  \  }}|t	        |t
              r|j                         n|* }}}t        t        |       |gd|       yt        j                  d|  d       |d   }	t        j                  t	        |	t
              r|	j                         n|	       yc c}}w )	z+CLI function to extract content from a URL.r   )rp   r<  extractr  zURL: 
rk   N)r   r   rA  r   r3   bytesdecoderL   r   r}   r   )
rp   r<  r   r   r   r:   r   r   str_datark   s
             r6   rA  rA    s    , ,U3FCKKPSY\K]D]a]g]g]i#jUYUVXYAZ55Iqxxzq$P#j#j?3'(YP

U3%r?#y/

z'5'A7>>#wO $ks   -Cc                     	 ddl m} | r t        |       xs | t        j                  d<   ddl}|j                  |j                                y# t        $ r t        j                  dd       Y yw xY w)a  Start DDGS MCP server over stdio for local MCP clients.

    Examples:
        ddgs mcp                            # Start MCP server using stdio transport
        ddgs mcp -pr socks5h://127.0.0.1:9150  # With proxy

    MCP client configuration:
        {
          "mcpServers": {
            "ddgs": {
              "command": "ddgs",
              "args": ["mcp"]
            }
          }
        }

    r   )mcpzCError: MCP dependencies not installed. Run: pip install 'ddgs[mcp]'TerrN
DDGS_PROXY)ddgs.api_server.mcprG  ImportErrorr}   r   r   osenvironasynciorunrun_stdio_async)r   
mcp_serverrO  s      r6   rG  rG  4  sc    (9
 #9%#@#IE

< KK
**,-  

X^bcs   A  A10A1z--detachz,Run the server in detached mode (background))r   r   z--stopzStop the detached server--hostz0.0.0.0zHost to bind the server to--porti  zPort to bind the server toz--reloadz"Enable auto-reload on code changesdetachstophostportreloadc           
         t         j                  j                  dd       |rt         j                         st	        j
                  dd       yt        t         j                         j                               }	 t        j                  |d       t	        j
                  d| d       t         j                  d       y	 ddl}ddl}		 ddlm}
  |
        t	        j
                  d       t        j&                  j)                         }|rt+        |      xs ||d<   | rddl}t.        j0                  dddd|dt3        |      g}|j5                  ||j6                  |j6                  |      }|j9                  d       |j;                         %t	        j
                  d|j<                   d       yt         j?                  t3        |j@                               t	        j
                  d| d| d|j@                   d       |rt	        j
                  d|d           yyt	        j
                  d | d|        |rt	        j
                  d|d           t	        j
                  d!       |r|d   t        j&                  d<   |	jC                  d||d"|#       y# t        $ r t	        j
                  d	| d
       Y t        $ r%}t	        j
                  d| d       Y d}~Ed}~ww xY w# t         j                  d       w xY w# t         $ r t	        j
                  dd       Y yw xY w# t         $ r t	        j
                  d       Y lw xY w)$a  Start/stop the DDGS API server.

    Starts a FastAPI server with REST endpoints for search tools.
    Supports text, image, news, video, and book search.

    Examples:
        ddgs api              # Start server in foreground
        ddgs api -d           # Start server in detached mode
        ddgs api -s           # Stop the detached server
        ddgs api --host 127.0.0.1 --port 9000  # Bind to specific host/port
        ddgs api -pr socks5h://127.0.0.1:9150  # Use proxy

    Tr   z2No detached server is running (PID file not found)rH  Nr*   zDDGS API server stopped (PID: )zServer process (PID: z') was not running, cleaning up PID filezFailed to stop server: )
missing_okr   zCError: API dependencies not installed. Run: pip install 'ddgs[api]'r	   )get_dht_servicez6API server starting with distributed DHT cache enabledzKAPI server starting (DHT cache not available - install ddgs[dht] to enable)rJ  r   uvicornzddgs.api_server:fastapi_apprS  rT  )rz   stderrenvg      ?z1Failed to start server: process exited with code z3DDGS API server started in detached mode on http://r   z (PID: zUsing proxy: z#Starting DDGS API server on http://zPress Ctrl+C to stopinfo)rW  rX  	log_levelrY  )"	_PID_FILEparentr   existsr}   r   int	read_textstriprM  killProcessLookupErrorOSErrorunlink
subprocessr^  rL  
api_serverr]  rN  copyr   timery   
executablestrPopenDEVNULLsleeppoll
returncode
write_textpidrP  )rU  rV  rW  rX  rY  r   ry  r   rm  r^  r]  	proxy_envrp  cmdprocesss                  r6   apir}  V  s   , 4$7!JJKQUV)%%'--/0	.GGCJJ7uA>? -
b/

KL
 

!I"8"?"H5	, NN)I	
 ""%%%%	 # 
 	

3<<>%JJJ7K]K]J^_eijS-.

HaPTvU\]d]h]h\iijklJJy'>&?@A  	

8avFGJJy'>&?@A

)*'0'>BJJ|$) 	 	
I " 	]JJ.se3Z[\ 	@JJ04$??	@ -  

X^bc  b

`absZ   </J# L "L9 #"K5K8 K5K0*K8 0K55K8 8L L65L69MM__main__)NNN)r/   N)<__doc__rC   rD   r   rM  ry   concurrent.futuresr   r   r   r   pathlibr   urllib.parser   r}   r   r2   r
   r   r   utilsr   homerc  	getLoggerr   r   r   Context	Parameterr4   rr  r7   listdictrL   rJ   rI   boolr   r   r   rf  r   groupr   r   commandr   optionChoicer   r   r5  r7  r:  rA  rG  r}  r   r8   r6   <module>r     s)    
   	 
 ? '        ) DIIK("V+i7				8	$
w
u
 w
 x	

 v
 y
 v
 ~
 |
 ~
 
 
 
 
 
  !
( u uUXz\`O` eh .c .d38n!5 .c .UX[_U_ .dh .Ct C4S#X+? CD C
#sTz #d38n)= #$ # AF d4S>*  $ 6
3 
3 

@ 
@s 
@c 
@#* 
@Y] 
@bf 
@"  $sCx.!  :	
 4Z Dj  
D 4 3    dI$78dL'GHdJ6JKdNJ\U\\Jc=dedM5I(JQijdORc@[\dHac8PQH		

 "), dJ%nodL$Dste+2UVe["3QReY%dedJ3WXe\4E[\+-+-Dj+- +- 	+-
 Tz+- t+- +- +- $J+- d
+- +- :+- +- +-  !+-" 
#+- ] Y f S W u p- R ] k f L I 9 J+-\ dI$9:dL'IJdJ6JKdNJ\U\\Jc=dedM5I(JKdORc@[\dHac8PQH	;	<" gxlell3\&]^		

, g~LELL9k,lmdJ\U\\2L%MN
	e	f
 dJ%nodL$Dste+2UVe["3QReY%dedJ3WXe\4E[\5-5-Dj5- 5- 	5-
 Tz5- t5- 5- 5- *5- :5- d
5- $J5- :5- d
5- 5-  $J!5-" :#5-& '5-( )5-* +5-, 
-5- ] Y f S W u p O n- _ R ] L f L K ; j5-p dI$9:dL'IJdJ6JKdNJ\U\\Jc=dedM_(EL^_dORc@[\dHac8PQH	3	4" fn<5<<8L+MNdL|u||4O'PQf(|u||=My<Y/Z[dJ%noeY%dedJ3WXe\4E[\$-$-Dj$- $- 	$-
 Tz$- t$- $- $- d
$- Dj$- $J$- $J$- :$- $-  !$-" 
#$- ] Y f p \ R O R ] ` f L K ; .$-N dI$78dL'GHdJ6JKdNJ\U\\Jc=dedM5I(JQijdORc@[\dHac8PQH	D	E" dJ%noeY%dedJ3WXe\4E[\--Dj- - 	-
 Tz- t- - - $J- :- - - 
- ] Y f p R ] k f L I 9 (-B dI$89dL'HIdORc@[\dHac8PQH	5	6" dJ%noeY%dedJ3WXe\4E[\--Dj- t- 	-
 - $J- :- - - 
- ] Y f p R ] J : "-4 dGd1NO		U	V	 dJ%YZeY%dedJ3WXP	P	P $JP :	P P 
P Y f [ P P& eY%de.sTz .d . f .@ dJ3abdHd1KLh	0LMh35QRj$-QReY%dec
 c
D c
 c
3 c
 c
SSWZ c
\` c
 f S S N M c c
L z r8   