
    /i"                        d dl mZmZmZmZmZmZmZ d dlZd dl	Z	d dl
m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  G d	 d
e      Z G d de      Z G d de      Z G d d      Zd Zedk(  r ej<                   e              yy)    )ListOptionalUnionAsyncGeneratorDictAnyCallableN)urljoin   )BrowserConfigCrawlerRunConfig)CrawlResult)AsyncLoggerLogLevel)hooks_to_stringc                       e Zd ZdZy)Crawl4aiClientErrorz1Base exception for Crawl4ai Docker client errors.N__name__
__module____qualname____doc__     R/mnt/e/genesis-system/.venv/lib/python3.12/site-packages/crawl4ai/docker_client.pyr   r          ;r   r   c                       e Zd ZdZy)ConnectionErrorz2Raised when connection to the Docker server fails.Nr   r   r   r   r   r      s    <r   r   c                       e Zd ZdZy)RequestErrorz1Raised when the server returns an error response.Nr   r   r   r   r    r       r   r   r    c                      e Zd ZdZ	 	 	 	 	 ddededededee   f
dZd	ed
dfdZ	ddZ
	 	 	 	 d dee   dee   dee   deeeeef   eeef   f      ded
eeef   fdZdeded
ej*                  fdZ	 	 	 	 d dee   dee   dee   deeeeef   eeef   f      ded
eeee   eedf   f   fdZd
eeef   fdZddZd!dZdee   dee   dee   d
dfdZy)"Crawl4aiDockerClientzMClient for interacting with Crawl4AI Docker server with token authentication.Nbase_urltimeout
verify_sslverboselog_filec                     |j                  d      | _        || _        t        |t        j
                  |      | _        t        j                  ||ddi      | _	        d | _
        y )N/)r'   	log_levelr&   zContent-Typeapplication/json)r$   verifyheaders)rstripr#   r$   r   r   DEBUGloggerhttpxAsyncClient_http_client_token)selfr#   r$   r%   r&   r'   s         r   __init__zCrawl4aiDockerClient.__init__   s[     !,!8x~~W^_!--#%78

 &*r   emailreturnc                 h  K   t        | j                  d      }	 | j                  j                  d| d       | j                  j                  |d|i       d{   }|j                          |j                         }|d   | _        d	| j                   | j                  j                  d
<   | j                  j                  dd       y7 r# t        j                  t        j                  f$ r;}dt        |       }| j                  j                  |d       t!        |      d}~ww xY ww)z1Authenticate with the server and store the token.z/tokenzAuthenticating with email: AUTHtagr7   jsonNaccess_tokenBearer AuthorizationzAuthentication successfulzAuthentication failed: ERROR)r
   r#   r0   infor3   postraise_for_statusr>   r4   r-   successr1   r    HTTPStatusErrorstrerrorr   )r5   r7   urlresponsedatae	error_msgs          r   authenticatez!Crawl4aiDockerClient.authenticate1   s    dmmX.	-KK:5'BO!..33Cw>N3OOH%%'==?D~.DK;B4;;-9PD%%o6KK ;H P ""E$9$9: 	-1#a&:IKKiW5!),,	-s<   D2AC CA1C D2C #D/46D**D//D2c                   K   	 | j                   j                  t        | j                  d             d{    | j                  j                  d| j                   d       y7 /# t        j                  $ rE}| j                  j                  dt        |       d       t        dt        |             d}~ww xY ww)	z6Check if server is reachable, raising an error if not.z/healthNzConnected to READYr;   zServer unreachable: rB   zCannot connect to server: )r3   getr
   r#   r0   rF   r1   r    rI   rH   r   )r5   rM   s     r   _check_serverz"Crawl4aiDockerClient._check_serverA   s     	I##''y(IJJJKK- ?WM K!! 	IKK 4SVH=7K!$>s1vh"GHH	Is9   C2A( A&.A( %C&A( (C ;A B;;C  Curlsbrowser_configcrawler_confighookshooks_timeoutc                 .   | j                   r&d| j                    | j                  j                  d<   ||r|j                         ni |r|j                         ni d}|r6t	        d |j                         D              rt        |      }n|}||d|d<   |S )z"Prepare request data from configs.r@   rA   )rT   rU   rV   c              3   2   K   | ]  }t        |        y wN)callable).0vs     r   	<genexpr>z8Crawl4aiDockerClient._prepare_request.<locals>.<genexpr>_   s     718A;7s   )coder$   rW   )r4   r3   r-   dumpanyvaluesr   )r5   rT   rU   rV   rW   rX   request_data
hooks_codes           r   _prepare_requestz%Crawl4aiDockerClient._prepare_requestJ   s     ;;;B4;;-9PD%%o6 7En11327En1132
 777,U3
 #
 #(%L!
 r   methodendpointc                   K   t        | j                  |      }	  | j                  j                  ||fi | d{   }|j	                          |S 7 # t
        j                  $ r}t        dt        |             d}~wt
        j                  $ r}t        dt        |             d}~wt
        j                  $ r}d|j                  j                  j                  dd      v r3|j                  j                         j                  dt        |            n
t        |      }t        d|j                  j                   d	|       d}~ww xY ww)
z)Make an HTTP request with error handling.NzRequest timed out: zFailed to connect: r+   zcontent-type detailzServer error z: )r
   r#   r3   requestrE   r1   TimeoutExceptionr   rH   r    rG   rK   r-   rR   r>   status_code)r5   rg   rh   kwargsrJ   rK   rM   rN   s           r   _requestzCrawl4aiDockerClient._requestm   s.    dmmX.	V6T..66vsMfMMH%%'O N %% 	B!$7Ax"@AA!! 	B!$7Ax"@AA$$ 	V-1C1C1G1GXZ1[[ *..xQ@ V  qzz/E/E.FbTUU		VsQ   E!A AA EA E'A>>EB++EBEEEc                    K    j                          d{     j                  |||||      |xr |j                  } j                  j	                  dt        |       d|rdnd d       |rdt        t        df   f fd	} |       S  j                  d
d|       d{   }|j                         }	|	j                  dd      st        d|	j                  dd             |	j                  dg       D 
cg c]  }
t        di |
 }}
 j                  j                  dt        |       dd       t        |      dk(  r|d   S |S 7 =7 c c}
w w)a  
        Execute a crawl operation.

        Args:
            urls: List of URLs to crawl
            browser_config: Browser configuration
            crawler_config: Crawler configuration
            hooks: Optional hooks - can be either:
                   - Dict[str, Callable]: Function objects that will be converted to strings
                   - Dict[str, str]: Already stringified hook code
            hooks_timeout: Timeout in seconds for each hook execution (1-120)

        Returns:
            Single CrawlResult, list of results, or async generator for streaming

        Example with function hooks:
            >>> async def my_hook(page, context, **kwargs):
            ...     await page.set_viewport_size({"width": 1920, "height": 1080})
            ...     return page
            >>>
            >>> result = await client.crawl(
            ...     ["https://example.com"],
            ...     hooks={"on_page_context_created": my_hook}
            ... )
        Nz	Crawling z URLs z(streaming)rj   CRAWLr;   r8   c            
       K   j                   j                  dj                   d      4 d {   } | j                          | j	                         2 3 d {   }|j                         st        j                  |      }d|v r1j                  j                  |j                  dd      |d          dj                  j                  |j                  dd      d|j                  d	d
             |j                  d      dk(  rt        di | 7 7 6 d d d       d {  7   y # 1 d {  7  sw Y   y xY ww)NPOSTz/crawl/streamr=   rI   rJ   unknown)rJ   rI   Ttimingg        )rJ   rF   rv   status	completedr   )r3   streamr#   rE   aiter_linesstripr>   loadsr0   error_statusrR   
url_statusr   )rK   lineresultrL   r5   s      r   stream_resultsz2Crawl4aiDockerClient.crawl.<locals>.stream_results   s4    ,,33Ft}}o]<[bf3g < <ks--/&.&:&:&< 
< 
<d::<%)ZZ%5F&&0 $ 8 8VZZy=Yaghoap 8 q ( KK22vzz%7S]ajpjtjtu}  @C  kD2  E%zz(3{B (&1&;F&; ;<
<&<< < < < <so   0E
DE
!D5D"D D" D52B,D5E
 D""D5#E
.D1/E
5E;D><EE
rt   z/crawl)r>   r$   rF   FzCrawl failed: msgzUnknown errorresultszCrawl completed with z resultsr   r   r   )rS   rf   ry   r0   rC   lenr   r   rp   r>   rR   r    rF   )r5   rT   rU   rV   rW   rX   is_streamingr   rK   result_datarr   rL   s   `           @r   crawlzCrawl4aiDockerClient.crawl~   s`    B   """$$T>>5R_`%?.*?*?9SYKv|mY[5\]cjk<.d9J*K < "##vxdMZZmmoy%00W/XYZZ-8__Y-KL;##LL3CL>JPWX \Q.wqz;G;? 	#0 [
 Ms6   EEBE)E*AEEAEEEc                 b   K   | j                  dd       d{   }|j                         S 7 w)zRetrieve configuration schemas.GETz/schemaN)rp   r>   )r5   rK   s     r   
get_schemazCrawl4aiDockerClient.get_schema   s*     ui88}} 9s   /-/c                    K   | j                   j                  dd       | j                  j                          d{    y7 w)zClose the HTTP client session.zClosing clientCLOSEr;   N)r0   rC   r3   acloser5   s    r   closezCrawl4aiDockerClient.close   s6     )w7&&(((s   ;AAAc                    K   | S wr[   r   r   s    r   
__aenter__zCrawl4aiDockerClient.__aenter__   s     s   exc_typeexc_valexc_tbc                 @   K   | j                          d {    y 7 wr[   )r   )r5   r   r   r   s       r   	__aexit__zCrawl4aiDockerClient.__aexit__   s     jjls   )zhttp://localhost:8000g      >@TTN)r8   N)NNN   )r8   r"   ) r   r   r   r   rH   floatboolr   r6   rO   rS   r   r   r   r   r   r	   intr   rf   r1   Responserp   r   r   r   r   r   r   type	Exceptionr   r   r   r   r"   r"      s   W 0"&** * 	*
 * 3-*$- - - I 3759FJ!3i! !/! !!12	!
 d3=14S>ABC! ! 
c3h!FVS VC Venn V( 3759FJ@<3i@< !/@< !!12	@<
 d3=14S>ABC@< @< 
{D-~k4>O/PP	Q@<D$sCx. 
)
 )AT ^fgj^k pt r   r"   c                  V  K   t        d      4 d {   } | j                  d       d {    | j                  dg       d {   }t        |       | j	                          d {   }t        |       d d d       d {    y 7 v7 _7 G7 &7 # 1 d {  7  sw Y   y xY ww)NT)r&   zuser@example.comzhttps://example.com)r"   rO   r   printr   )clientr   schemas      r   mainr      s     #D1  V!!"4555||%:$;<<f((**f  5<*	   sx   B)B
B)BBBB"B)B*B9B)BB)BBBB)B&BB&"B)__main__)typingr   r   r   r   r   r   r	   r1   r>   urllib.parser
   asyncioasync_configsr   r   modelsr   async_loggerr   r   utilsr   r   r   r   r    r"   r   r   runr   r   r   <module>r      s}    M M M      :  / "	) 	
	) 	
	& 	
r rl zGKK r   