
    _j2T                        S r SSKrSSKJrJrJrJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJrJrJr  SSKJrJrJrJr  SSKJr  S\S	S4S
 jrS\S	\4S jrS\\\      S	\\   4S jrS\\\4   S	\\\4   4S jr S\S\S	\
4S jr! S%SS.S\S\S\\   S\\"   S	\	4
S jjjr#SS.S\S\S\\"   S	\	4S jjr$ S%SS.S\S\S\\   S\\   S\\"   S	\\   4S jjjr%S\S\S	\&4S jr'  S&SS.S\S\S\(S\\(   S\\"   S	\	4S jjjr)  S&SS.S\S\S\(S\\(   S\\"   S	\	4S jjjr*S\S\S	\4S  jr+S!\S"\S	\4S# jr,S\S	\4S$ jr-g)'z.
Crawling functionality for Firecrawl v2 API.
    N)OptionalDictAnyList   )CrawlRequestCrawlJobCrawlResponseDocumentCrawlParamsRequestCrawlParamsResponseCrawlParamsDataWebhookConfigCrawlErrorsResponseActiveCrawlsResponseActiveCrawlPaginationConfig)
HttpClienthandle_response_errorvalidate_scrape_optionsprepare_scrape_options)normalize_document_inputrequestreturnc                    U R                   (       a  U R                   R                  5       (       d  [        S5      eU R                  b  U R                  S::  a  [        S5      eU R                  b  [        U R                  5        gg)z
Validate crawl request parameters.

Args:
    request: CrawlRequest to validate
    
Raises:
    ValueError: If request is invalid
URL cannot be emptyNr   zLimit must be positive)urlstrip
ValueErrorlimitscrape_optionsr   )r   s    O/home/rurouni/.local/lib/python3.13/site-packages/firecrawl/v2/methods/crawl.py_validate_crawl_requestr#      sk     ;;gkk//11.//}} W]]a%7122 ) 6 67 *    c                 "   [        U 5        SU R                  0nU R                  (       a  U R                  US'   U R                  b   [	        U R                  5      nU(       a  X!S'   U R                  SSS9nUR                  SS5        UR                  SS5        UR                  SS5        U R                  bK  [        U R                  [        5      (       a  U R                  US'   OU R                  R                  SS	9US'   S
SSSSSSSSSSSSSSS.nUR                  5        H  u  pVXS;   d  M  UR                  U5      X'   M!     UR                  U5        SU;   a.  [        US   [        5      (       a  US   R                  5       US'   U$ )z
Prepare crawl request for API submission.

Args:
    request: CrawlRequest to prepare
    
Returns:
    Dictionary ready for API submission
r   promptNscrapeOptionsT)exclude_noneexclude_unsetr!   webhook)r(   includePathsexcludePathsmaxDiscoveryDepthsitemapignoreQueryParametersdeduplicateSimilarURLscrawlEntireDomainallowExternalLinksallowSubdomainsignoreRobotsTxtrobotsUserAgentdelaymaxConcurrencyregexOnFullURLzeroDataRetention)include_pathsexclude_pathsmax_discovery_depthr.   ignore_query_parametersdeduplicate_similar_urlscrawl_entire_domainallow_external_linksallow_subdomainsignore_robots_txtrobots_user_agentr6   max_concurrencyregex_on_full_urlzero_data_retentionintegration)r#   r   r&   r!   r   
model_dumppopr*   
isinstancestritemsupdater   )r   datascrape_datarequest_datafield_mappings
snake_case
camel_cases          r"   _prepare_crawl_requestrT   &   s    G$ 7;;D ~~ X ),W-C-CD$/! %%4t%LL UD!Xt$%t, "goos++%ooDO &oo88d8KDO ('2#:$<2 4-..+-2N& #1"6"6"8
%+//
;D #9
 	KKD,?!E!E"=1779]Kr$   	data_listc           
          / nU =(       d    /  H=  n[        U[        5      (       d  M  UR                  [        S0 [	        U5      D65        M?     U$ )N )rJ   dictappendr   r   )rU   	documentsdoc_datas      r"   _parse_crawl_documentsr\   q   sH     "IOOh%%XK(@(JKL $ r$   response_datac                 d   U R                  S5      (       d  [        U R                  SS5      5      eU R                  S5      U R                  SS5      U R                  SS5      U R                  SS5      U R                  S	5      U R                  S
5      [        U R                  S/ 5      5      S.$ )NsuccesserrorUnknown error occurredstatus	completedr   totalcreditsUsed	expiresAtnextrN   rb   rc   rd   credits_used
expires_atrg   rN   )get	Exceptionr\   )r]   s    r"   _parse_crawl_status_responserm   y   s    Y''))'3KLMM  ##H-"&&{A6""7A.%))-;#''4!!&)&}'8'8'DE r$   clientc                 T   [        U5      nU R                  SU5      nUR                  (       d  [        US5        UR	                  5       nUR                  S5      (       a.  UR                  S5      UR                  S5      S.n[        S	0 UD6$ [        UR                  SS5      5      e)
a  
Start a crawl job for a website.

Args:
    client: HTTP client instance
    request: CrawlRequest containing URL and options
    
Returns:
    CrawlResponse with job information
    
Raises:
    ValueError: If request is invalid
    Exception: If the crawl operation fails to start
z	/v2/crawlzstart crawlr_   idr   )rp   r   r`   ra   rW   )rT   postokr   jsonrk   r
   rl   )rn   r   rP   responser]   job_datas         r"   start_crawlrv      s     *'2L{{;5H;;h6MMOM####D) $$U+

 (x(())'3KLMMr$   request_timeoutjob_idpagination_configrx   c          
         U R                  SU 3US9nUR                  (       d  [        US5        UR                  5       n[	        U5      nUS   nU(       a  UR
                  OSnU(       aG  US   (       a=  U(       a&  UR                  b  [        U5      UR                  :  d  [        U US   UUUS9n[        US	   US
   US   US   US   U(       d  US   US9$ SUS9$ )a  
Get the status of a crawl job.

Args:
    client: HTTP client instance
    job_id: ID of the crawl job
    pagination_config: Optional configuration for pagination behavior
    request_timeout: Timeout (in seconds) for each individual HTTP request. When auto-pagination 
        is enabled (default) and there are multiple pages of results, this timeout applies to 
        each page request separately, not to the entire operation

Returns:
    CrawlJob with current status and data

Raises:
    Exception: If the status check fails

/v2/crawl/timeoutzget crawl statusrN   Trg   Nrw   rb   rc   rd   ri   rj   rh   )
rk   rr   r   rs   rm   auto_paginatemax_resultslen_fetch_all_pagesr	   )	rn   ry   rz   rx   rt   r]   payloadrZ   r   s	            r"   get_crawl_statusr      s   2 zzJvh/zIH ;;h(:; MMOM*=9GI 8I%33dM))5	N/;;;$FO+
	 x +&g^,<($1WV_  8< r$   next_urlc          
          U R                  XS9nUR                  (       d  [        US5        UR                  5       n[	        U5      n[        US   US   US   US   US   US   US	   S
9$ )au  
Fetch a single page of crawl results using the provided next URL.

Args:
    client: HTTP client instance
    next_url: Opaque next URL from a prior crawl status response
    request_timeout: Timeout (in seconds) for the HTTP request

Returns:
    CrawlJob with the page data and next URL (if any)

Raises:
    Exception: If the request fails or returns an error response
r}   zget crawl status pagerb   rc   rd   ri   rj   rg   rN   rh   )rk   rr   r   rs   rm   r	   )rn   r   rx   rt   r]   r   s         r"   get_crawl_status_pager      s~    ( zz(z<H;;h(?@MMOM*=9Gx +&g^,<(V_V_ r$   initial_documentsc                   UR                  5       nUnSnU(       a  UR                  OSnU(       a  UR                  OSn	U(       a  UR                  OSn
[        R
                  " 5       nU(       a  Ub  Xx:  a   U$ U
b  [        R
                  " 5       U-
  U
:  a   U$ U R                  XdS9nUR                  (       d4  SSKnUR                  S5      nUR                  SSUR                  0S9   U$ UR                  5       n [        U5      nUS    H(  nU	b  [        U5      U	:  a    OUR!                  U5        M*     U	b  [        U5      U	:  a   U$ US	   nUS
-  nU(       a  M  U$ ! [         a     U$ f = f)an  
Fetch all pages of crawl results.

Args:
    client: HTTP client instance
    next_url: URL for the next page
    initial_documents: Documents from the first page
    pagination_config: Optional configuration for pagination limits
    request_timeout: Optional timeout (in seconds) for the underlying HTTP request

Returns:
    List of all documents from all pages
r   Nr}   	firecrawlzFailed to fetch next pagestatus_code)extrarN   rg      )copy	max_pagesr   max_wait_timetime	monotonicrk   rr   logging	getLoggerwarningr   rs   rm   rl   r   rY   )rn   r   r   rz   rx   rZ   current_url
page_countr   r   r   
start_timert   r   logger	page_datapage_payloaddocuments                     r"   r   r     s   * "&&(IKJ 0A!++dI3D#//$K7H%33dM!J
!z'>J G %DNN,<z,I]+ZD ? ::k:C{{&&{3FNN6}hNbNb>cNd0 - MMO		7	BL
 %V,H&3y>[+HX&	 - "s9~'D  #6*a
M +P %  	" %	s   E( (
E65E6c                     U R                  SU 35      nUR                  (       d  [        US5        UR                  5       nUR	                  S5      S:H  $ )z
Cancel a running crawl job.

Args:
    client: HTTP client instance
    job_id: ID of the crawl job to cancel
    
Returns:
    bool: True if the crawl was cancelled, False otherwise
    
Raises:
    Exception: If the cancellation fails
r|   zcancel crawlrb   	cancelled)deleterr   r   rs   rk   )rn   ry   rt   r]   s       r"   cancel_crawlr   ^  sK     }}z&23H;;h7MMOMX&+55r$   poll_intervalr~   c                    [         R                  " 5       n [        U UUS9nUR                  S;   a  U$ Ub.  [         R                  " 5       U-
  U:  a  [	        SU SU S35      e[         R
                  " U5        Mf  )a  
Wait for a crawl job to complete, polling for status updates.

Args:
    client: HTTP client instance
    job_id: ID of the crawl job
    poll_interval: Seconds between status checks
    timeout: Maximum seconds to wait (None for no timeout)
    request_timeout: Optional timeout (in seconds) for each status request
    
Returns:
    CrawlJob when job completes
    
Raises:
    Exception: If the job fails
    TimeoutError: If timeout is reached
rw   )rc   failedr   z
Crawl job z did not complete within z seconds)r   r   r   rb   TimeoutErrorsleep)rn   ry   r   r~   rx   r   	crawl_jobs          r"   wait_for_crawl_completionr   u  s    2 !J
$+
	 CC DNN$4z$AW#LF83LWIU]^__ 	

=!! r$   c                X    [        X5      nUR                  nUb  UOUn[        U UUUUS9$ )a  
Start a crawl job and wait for it to complete.

Args:
    client: HTTP client instance
    request: CrawlRequest containing URL and options
    poll_interval: Seconds between status checks
    timeout: Maximum seconds to wait for the entire crawl job to complete (None for no timeout)
    request_timeout: Timeout (in seconds) for each individual HTTP request, including pagination 
        requests when fetching results. If there are multiple pages, each page request gets this timeout
    
Returns:
    CrawlJob when job completes
    
Raises:
    ValueError: If request is invalid
    Exception: If the crawl fails to start or complete
    TimeoutError: If timeout is reached
rw   )rv   rp   r   )rn   r   r   r~   rx   r   ry   effective_request_timeouts           r"   crawlr     sF    8 F,I\\F 4C3NT[ %1 r$   c                    UR                   (       a  UR                   R                  5       (       d  [        S5      eUR                  (       a  UR                  R                  5       (       d  [        S5      eUR                   UR                  S.nU R	                  SU5      nUR
                  (       d  [        US5        UR                  5       nUR                  S5      (       Gah  UR                  S0 5      n0 nSS	S
SSSSSSSSSSSS.nSU;   a-  US   n[        U[        5      (       a  [        S'0 UD6US'   OXS'   UR                  5        H  u  pX;   d  M  U	S:X  a  XY   b  XY   n0 nSSSSSSS.nUR                  5        H  u  pX;   d  M  X   X'   M     S U;   a/  US    n[        U[        5      (       a  S!S"KJn  U" US#9US '   OUUS '   UR                  5        H  u  nnUU;  d  M  US :w  d  M  UUU'   M     XU
'   M  XY   Xj'   M     UR                  5        H  u  nnUU;  d  M  UUU'   M     S$U;   a  US$   US$'   [!        S'0 UD6$ [#        UR                  S%S&5      5      e)(a8  
Get crawl parameters from LLM based on URL and prompt.

Args:
    client: HTTP client instance
    request: CrawlParamsRequest containing URL and prompt
    
Returns:
    CrawlParamsData containing suggested crawl options
    
Raises:
    ValueError: If request is invalid
    Exception: If the operation fails
r   zPrompt cannot be empty)r   r&   z/v2/crawl/params-previewzcrawl params previewr_   rN   r:   r;   r<   r.   r=   r>   r?   r@   rA   rB   rC   rD   r!   rF   )r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r7   r'   r9   r*   r'   include_tagsexclude_tagsonly_main_contentwait_forskip_tls_verificationremove_base64_images)includeTagsexcludeTagsonlyMainContentwaitForskipTlsVerificationremoveBase64Imagesformatsr   )ScrapeFormats)r   r   r`   ra   rW   )r   r   r   r&   rq   rr   r   rs   rk   rJ   rX   r   rL   listtypesr   r   rl   )rn   r   rP   rt   r]   params_dataconverted_paramsrQ   webhook_datarS   rR   scrape_opts_dataconverted_scrape_optsscrape_field_mappingsscrape_camelscrape_snakeformats_datar   keyvalues                       r"   crawl_params_previewr     s     ;;gkk//11.//>>!5!5!7!7122 {{..L {{5|DH ;;h(>? MMOM###''3 ++!6 %>&@!6"8122/-!6
$ #&y1L,--.;.Kl.K +.:+&4&:&:&<"J(0[5L5X'2'>$,.)'5'5+>#-/F.D-) 7L6Q6Q6S2';BRB`1? 7T
 !$44'7	'B%lD99=?LUa?b1)<?K1)< '7&<&<&>
U&;;y@P9>1#6 '? 4IZ03>3J$0I '=N &++-JC.((- % .
 %*7	*BY'2!122))'3KLMMr$   http_clientcrawl_idc                 l   U R                  SU S35      nUR                  (       d  [        US5         UR                  5       nUR                  SU5      nUR                  S/ 5      UR                  SUR                  S/ 5      5      S.n[	        S0 UD6$ ! [
         a  n[        S	U 35      eS
nAff = f)z
Get errors from a crawl job.

Args:
    http_client: HTTP client for making requests
    crawl_id: The ID of the crawl job
    
Returns:
    CrawlErrorsResponse containing errors and robots blocked URLs
    
Raises:
    Exception: If the request fails
r|   z/errorszcheck crawl errorsrN   errorsrobotsBlockedrobots_blocked)r   r   z'Failed to parse crawl errors response: NrW   )rk   rr   r   rs   r   rl   )r   r   rt   bodyr   
normalizedes          r"   get_crawl_errorsr   G  s     H:W=>H;;h(<=
G}}((64( kk(B/%kk/7;;GWY[;\]

 #0Z00 GA!EFFGs   A!B 
B3 B..B3c                 ^   U R                  S5      nUR                  (       d  [        US5        UR                  5       nUR                  S5      (       d  [	        UR                  SS5      5      eUR                  S/ 5      n/ nU H|  n[        U[        5      (       d  M  UR                  UR                  S5      UR                  SUR                  S	5      5      UR                  S
5      UR                  S5      S.5        M~     [        SU Vs/ s H  n[        S0 UD6PM     snS9$ s  snf )z
Get a list of currently active crawl jobs.

Args:
    client: HTTP client instance
    
Returns:
    ActiveCrawlsResponse containing a list of active crawl jobs
    
Raises:
    Exception: If the request fails
z/v2/crawl/activezget active crawlsr_   r`   ra   crawlsrp   teamIdteam_idr   options)rp   r   r   r   T)r_   r   rW   )
rk   rr   r   rs   rl   rJ   rX   rY   r   r   )rn   rt   r   	crawls_innormalized_crawlscncs          r"   get_active_crawlsr   g  s     zz,-H;;h(;<==?D88I*BCDD2&Ia$$eeDk55155+;<uuU|55+	&    Rc5dRcBk6GB6GRc5dee5ds   D*
)N)r   N).__doc__r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   utilsr   r   r   r   utils.normalizer   r#   rX   rT   r\   rK   rm   rv   floatr   r   r   boolr   intr   r   r   r   r   rW   r$   r"   <module>r      s    , ,    g f 68\ 8d 8*HL HT HVhtCy&9 d8n S#X 4S>  N
  N\  Nm  NL 59>
 (,>>>   01>
 e_> >J (,	$$$ e_	$
 $V 59	H (,HHH H~H   01	H e_H 
(^HV6 6S 6T 64 !	+" (,+"+"+" +" c]	+" e_+" +"b !	) (,))) ) c]	) e_) )XuN uN6H uN_ uNpG* G G@S G@ fj  f-A  fr$   