
    Sj!                        d dl mZmZmZmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ d d	lZd
eee      dee   fdZdeeef   deeef   fdZd	ddee   dee   deeef   fdZdedee   de	fdZ	 d dededee   de
fdZd	ddededee   de
fdZ	 d dededee   dee   dee   f
dZdedede fdZ!dededeeef   fdZ"y	)!    )OptionalListDictAny   )ScrapeOptionsWebhookConfigDocumentBatchScrapeResponseBatchScrapeJobPaginationConfig)AsyncHttpClient)prepare_scrape_options)handle_response_error)normalize_document_input)validate_batch_urlsN	data_listreturnc                     g }| xs g D ]8  }t        |t              st        |      }|j                  t	        di |       : |S )N )
isinstancedictr   appendr
   )r   	documentsdoc
normalizeds       Q/root/.hermes/venv/lib/python3.12/site-packages/firecrawl/v2/methods/aio/batch.py_parse_batch_scrape_documentsr   
   sL     "IB 5c4 1#6JX3
345     bodyc                 `   | j                  d      st        | j                  dd            | j                  d      | j                  dd      | j                  dd      | j                  d      | j                  d	      | j                  d
      t        | j                  dg       xs g       dS )NsuccesserrorUnknown error occurredstatus	completedr   totalcreditsUsed	expiresAtnextdatar%   r&   r'   credits_used
expires_atr*   r+   )get	Exceptionr   )r    s    r   #_parse_batch_scrape_status_responser1      s    88I*BCDD ((8$XXk1-'1%/hh{+ -dhhvr.B.HbI r   )optionsurlsr2   c          	      ~   | st        d      t        | D cg c]$  }t        |t              r|j	                         n|& c}      }d|i}|rt        |      }|r|j                  |       |j                  d      x}'t        |t              r|n|j                  d      |d<   |j                  d      x}||d<   |j                  d      x}||d	<   |j                  d
      x}||d<   |j                  d      x}||d<   |j                  d      x} t        |      j	                         }	|	r|	|d<   |S c c}w )NzURLs list cannot be emptyr3   webhookT)exclude_noneappend_to_id
appendToIdignore_invalid_urlsignoreInvalidURLsmax_concurrencymaxConcurrencyzero_data_retentionzeroDataRetentionintegration)	
ValueErrorr   r   strstripr   updater/   
model_dump)
r3   r2   kwargsuvalidated_urlspayloadoptswvtrimmed_integrations
             r   _preparerM   !   sQ   455(Z^)_UVz!S7I!'')q*P)_`N%~6G%g.NN4 ZZ	""/",Q"4Q!,,TX,:Y	ZZ''4 !ZZ-..;'(#$ZZ)**7$% !ZZ-..;'(#$ZZ&&3!!flln%8GM"N) *`s   )D:clientc                 ~  K   t        |fi |}| j                  d|       d {   }|j                  dk\  rt        |d       |j	                         }|j                  d      st        |j                  dd            t        |j                  d      |j                  d      |j                  d	      
      S 7 w)Nz/v2/batch/scrape  zstart batch scraper"   r#   r$   idurlinvalidURLs)rQ   rR   invalid_urls)rM   poststatus_coder   jsonr/   r0   r   )rN   r3   rE   rH   responser    s         r   start_batch_scraperY   <   s     t&v&G[[!3W==Hs"h(<===?D88I*BCDD$((4.dhhuoTXT\T\]jTkll >s   "B=B;BB=job_idpagination_configc           	      |  K   | j                  d|        d{   }|j                  dk\  rt        |d       |j                         }t	        |      }|d   }|r|j
                  nd}|r|d   rt        | |d   ||       d{   }t        |d   |d	   |d
   |d   |d   |s|d   |      S d|      S 7 7 4w)al  
    Get the status of a batch scrape job.
    
    Args:
        client: Async HTTP client instance
        job_id: ID of the batch scrape job
        pagination_config: Optional configuration for pagination behavior
        
    Returns:
        BatchScrapeJob containing job status and data
        
    Raises:
        Exception: If the status check fails
    /v2/batch/scrape/NrP   zget batch scrape statusr+   Tr*   r%   r&   r'   r-   r.   r,   )r/   rV   r   rW   r1   auto_paginate_fetch_all_batch_pages_asyncr   )rN   rZ   r[   rX   r    rH   docsr^   s           r   get_batch_scrape_statusra   G   s     & ZZ"3F8 <==Hs"h(AB==?D1$7G6?D 8I%33dM1FO	
 
 x +&g^,<($1WV_  8< # >
s"   B<B8A*B<B:3B<:B<)request_timeoutnext_urlrb   c          
         K   | j                  ||       d{   }|j                  dk\  rt        |d       |j                         }t	        |      }t        |d   |d   |d   |d   |d	   |d
   |d         S 7 aw)a  
    Fetch a single page of batch scrape results using the provided next URL.

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

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

    Raises:
        Exception: If the request fails or returns an error response
    )timeoutNrP   zget batch scrape status pager%   r&   r'   r-   r.   r*   r+   r,   )r/   rV   r   rW   r1   r   )rN   rc   rb   rX   r    rH   s         r   get_batch_scrape_status_pagerf   v   s     ( ZZ/ZBBHs"h(FG==?D1$7Gx +&g^,<(V_V_  Cs   A=A;A"A=initial_documentsc                   K   |j                         }|}d}|r|j                  nd}|r|j                  nd}|r|j                  nd}	t	        j
                         }
|r|||k\  r	 |S |	t	        j
                         |
z
  |	kD  r	 |S | j                  |       d{   }|j                  dk\  r6ddl}|j                  d      }|j                  d|j                          	 |S |j                         }	 t        |      }|d   D ]%  }|t        |      |k\  r n|j                  |       ' |t        |      |k\  r	 |S |d   }|dz  }|r|S 7 # t        $ r Y |S w xY ww)	ag  
    Fetch all pages of batch scrape results asynchronously.
    
    Args:
        client: Async HTTP client instance
        next_url: URL for the next page
        initial_documents: Documents from the first page
        pagination_config: Optional configuration for pagination limits
        
    Returns:
        List of all documents from all pages
    r   NrP   	firecrawlzFailed to fetch next page: r+   r*      )copy	max_pagesmax_resultsmax_wait_timetime	monotonicr/   rV   logging	getLoggerwarningrW   r1   r0   lenr   )rN   rc   rg   r[   r   current_url
page_countrl   rm   rn   
start_timerX   rq   logger	page_datapage_payloaddocuments                    r   r_   r_      s    $ "&&(IKJ 0A!++dI3D#//$K7H%33dM!J
!
i(?H E %DNN,<z,I]+ZB =  K003&&&{3FNN89M9M8NOP. + MMO		>yIL
 %V, 	'H'c)n.KX&		' ##i.K*G  #6*a
K N = 1  	" %	s>   BE!EAE!5E  AE!E!	EE!EE!c                    K   | j                  d|        d {   }|j                  dk\  rt        |d       |j                         }|j	                  d      dk(  S 7 Cw)Nr]   rP   zcancel batch scraper%   	cancelled)deleterV   r   rW   r/   rN   rZ   rX   r    s       r   cancel_batch_scraper      s]     ]]%6vh#?@@Hs"h(=>==?D88H,,	 As   A AAA c                    K   | j                  d| d       d {   }|j                  dk\  rt        |d       |j                         }|j                  d      st	        |j                  dd            |S 7 ]w)Nr]   z/errorsrP   zget batch scrape errorsr"   r#   r$   )r/   rV   r   rW   r0   r   s       r   get_batch_scrape_errorsr      ss     ZZ"3F87 CDDHs"h(AB==?D88I*BCDDK Es   A;A9AA;)N)#typingr   r   r   r   typesr   r	   r
   r   r   r   utils.http_client_asyncr   utils.validationr   utils.error_handlerr   utils.normalizer   methods.batchr   ro   r   rA   r1   rM   rY   ra   floatrf   r_   boolr   r   r   r   r   <module>r      s   , , r r 6 6 8 7 0 Xd3i-@ T(^ d38n c3h  EI 49 (=*A W[\_ad\dWe 6m_ mDI mTg m 59,,,   01, 	,f (,	!!! e_	!
 !P 59	DDD H~D   01	D
 
(^DN-o -s -t -/ 3 4PSUXPX> r   