§
    ®eîi@  ã                   óä  — d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
mZmZmZmZmZmZ ddlmZmZmZmZ ddlmZ ddl	m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ddddddœdedee         dee         deeeef                  dee         dee         dee         dee         dee         dee         d
efd„Z	 d1d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!	 d1deded!ee         dee         d
ee         f
d"„Z"deded
efd#„Z#	 	 d2deded$ed%ee         d
ef
d&„Z$ddddddddddd'œ
dedee         dee         deeeef                  dee         dee         dee         dee         dee         dee         d$ed%ee         d
efd(„Z%dee         d
ee         fd)„Z&dddddddd*œdee         dee         deeeef                  dee         dee         dee         dee         dee         d
e'fd+„Z(d3dee         d-ed
eee                  fd.„Z)	 	 	 	 d4dedee         dee         d-ed$ed%ee         d
ee         fd/„Z*deded
efd0„Z+dS )5z4
Batch scraping functionality for Firecrawl v2 API.
é    N)ÚOptionalÚListÚCallableÚDictÚAnyÚUnioné   )ÚBatchScrapeRequestÚBatchScrapeResponseÚBatchScrapeJobÚScrapeOptionsÚDocumentÚWebhookConfigÚPaginationConfig)Ú
HttpClientÚhandle_response_errorÚvalidate_scrape_optionsÚprepare_scrape_options)Únormalize_document_input)ÚCrawlErrorsResponseÚ	data_listÚreturnc                 óž   — g }| pg D ]E}t          |t          ¦  «        r.t          |¦  «        }|                     t	          di |¤Ž¦  «         ŒF|S )N© )Ú
isinstanceÚdictr   Úappendr   )r   Ú	documentsÚdocÚ
normalizeds       ú^/home/div/.hermes/hermes-agent/venv/lib/python3.11/site-packages/firecrawl/v2/methods/batch.pyÚ_parse_batch_scrape_documentsr"      sb   € Ø "€IØˆ˜Bð 5ð 5ˆÝ�c�4Ñ Ô ð 	5Ý1°#Ñ6Ô6ˆJØ×Ò�XÐ3Ð3¨
Ð3Ð3Ñ4Ô4Ð4øØÐó    Úbodyc                 ó´  — |                       d¦  «        s#t          |                       dd¦  «        ¦  «        ‚|                       d¦  «        |                       dd¦  «        |                       dd¦  «        |                       d¦  «        |                       d	¦  «        |                       d
¦  «        t          |                       dg ¦  «        p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_responser5      sÁ   € Ø�8Š8�IÑÔð EÝ˜Ÿš Ð*BÑCÔCÑDÔDÐDð —(’(˜8Ñ$Ô$Ø—X’X˜k¨1Ñ-Ô-Ø—’˜' 1Ñ%Ô%ØŸš Ñ/Ô/Ø—h’h˜{Ñ+Ô+Ø—’˜Ñ Ô Ý-¨d¯hªh°v¸rÑ.BÔ.BÐ.HÀbÑIÔIðð ð r#   ©ÚoptionsÚwebhookÚappend_to_idÚignore_invalid_urlsÚmax_concurrencyÚzero_data_retentionÚintegrationÚidempotency_keyÚclientÚurlsr7   r8   r9   r:   r;   r<   r=   r>   c          
      óê  — t          ||||||||¬¦  «        }
|                      |	¦  «        }|                      d|
|¬¦  «        }|j        st	          |d¦  «         |                     ¦   «         }|                     d¦  «        s#t          |                     dd¦  «        ¦  «        ‚t          |                     d¦  «        |                     d	¦  «        |                     d
¦  «        pd¬¦  «        S )aW  
    Start a batch scrape job for multiple URLs.
    
    Args:
        client: HTTP client instance
        urls: List of URLs to scrape
        options: Scraping options
        
    Returns:
        BatchScrapeResponse containing job information
        
    Raises:
        FirecrawlError: If the batch scrape operation fails to start
    ©r7   r8   r9   r:   r;   r<   r=   z/v2/batch/scrape)Úheaderszstart batch scraper&   r'   r(   ÚidÚurlÚinvalidURLsN)rD   rE   Úinvalid_urls)	Úprepare_batch_scrape_requestÚ_prepare_headersÚpostÚokr   Újsonr3   r4   r   )r?   r@   r7   r8   r9   r:   r;   r<   r=   r>   Úrequest_datarC   Úresponser$   s                 r!   Ústart_batch_scraperO   -   s   € õ8 0ØØØØ!Ø/Ø'Ø/Øð	ñ 	ô 	€Lð ×%Ò% oÑ6Ô6€GØ�{Š{Ð-¨|ÀWˆ{ÑMÔM€Hð Œ;ð >Ý˜hÐ(<Ñ=Ô=Ð=ð �=Š=‰?Œ?€DØ�8Š8�IÑÔð EÝ˜Ÿš Ð*BÑCÔCÑDÔDÐDÝØ�8Š8�D‰>Œ>Ø�HŠH�U‰OŒOØ—X’X˜mÑ,Ô,Ð4°ðñ ô ð r#   Újob_idÚpagination_configc           	      óŒ  — |                       d|› �¦  «        }|j        st          |d¦  «         |                     ¦   «         }t	          |¦  «        }|d         }|r|j        nd}|r |d         rt          | |d         ||¦  «        }t          |d         |d         |d         |d	         |d
         |s|d         nd|¬¦  «        S )ak  
    Get the status of a batch scrape job.
    
    Args:
        client: 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:
        FirecrawlError: If the status check fails
    ú/v2/batch/scrape/zget batch scrape statusr/   Tr.   r)   r*   r+   r1   r2   Nr0   )r3   rK   r   rL   r5   Úauto_paginateÚ_fetch_all_batch_pagesr   )r?   rP   rQ   rN   r$   Úpayloadr   rT   s           r!   Úget_batch_scrape_statusrW   g   sý   € ð( �zŠzÐ6¨fÐ6Ð6Ñ7Ô7€Hð Œ;ð CÝ˜hÐ(AÑBÔBÐBð �=Š=‰?Œ?€DÝ1°$Ñ7Ô7€GØ˜”€Ið 8IÐRÐ%Ô3Ð3Èd€MØð 
˜ œð 
Ý*ØØ�FŒOØØñ	
ô 
ˆ	õ Ø�xÔ Ø˜+Ô&Ø�gÔØ˜^Ô,Ø˜<Ô(Ø$1Ð;ˆW�VŒ_ˆ_°tØðñ ô ð r#   )Úrequest_timeoutÚnext_urlrX   c          
      ó$  — |                       ||¬¦  «        }|j        st          |d¦  «         |                     ¦   «         }t	          |¦  «        }t          |d         |d         |d         |d         |d         |d         |d	         ¬
¦  «        S )a±  
    Fetch a single page of batch scrape results using the provided next URL.

    Args:
        client: 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
    )Útimeoutzget batch scrape status pager)   r*   r+   r1   r2   r.   r/   r0   )r3   rK   r   rL   r5   r   )r?   rY   rX   rN   r$   rV   s         r!   Úget_batch_scrape_status_pager\   ›   sœ   € ð( �zŠz˜(¨OˆzÑ<Ô<€HàŒ;ð HÝ˜hÐ(FÑGÔGÐGà�=Š=‰?Œ?€DÝ1°$Ñ7Ô7€GåØ�xÔ Ø˜+Ô&Ø�gÔØ˜^Ô,Ø˜<Ô(Ø�VŒ_Ø�VŒ_ðñ ô ð r#   Úinitial_documentsc                 ó¾  — |                      ¦   «         }|}d}|r|j        nd}|r|j        nd}|r|j        nd}	t	          j        ¦   «         }
|�r|�||k    r�n|	�t	          j        ¦   «         |
z
  |	k    rnæ|                      |¦  «        }|j        s8ddl}| 	                    d¦  «        }| 
                    dd|j        i¬¦  «         n’|                     ¦   «         }	 t          |¦  «        }n# t          $ r Y naw xY w|d         D ].}|�t          |¦  «        |k    r n|                     |¦  «         Œ/|�t          |¦  «        |k    rn|d         }|d	z  }|�°|S )
aR  
    Fetch all pages of batch scrape 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
        
    Returns:
        List of all documents from all pages
    r   NÚ	firecrawlzFailed to fetch next pageÚstatus_code)Úextrar/   r.   é   )ÚcopyÚ	max_pagesÚmax_resultsÚmax_wait_timeÚtimeÚ	monotonicr3   rK   ÚloggingÚ	getLoggerÚwarningr`   rL   r5   r4   Úlenr   )r?   rY   r]   rQ   r   Úcurrent_urlÚ
page_countrd   re   rf   Ú
start_timerN   ri   ÚloggerÚ	page_dataÚpage_payloadÚdocuments                    r!   rU   rU   Â   sË  € ð$ "×&Ò&Ñ(Ô(€IØ€KØ€Jð 0AÐJÐ!Ô+Ð+Àd€IØ3DÐNÐ#Ô/Ð/È$€KØ7HÐRÐ%Ô3Ð3Èd€Må”Ñ!Ô!€Jà
ñ %àÐ! z°YÒ'>Ð'>ÙàÐ%­D¬NÑ,<Ô,<¸zÑ,IÈ]Ò+ZÐ+ZØð —:’:˜kÑ*Ô*ˆàŒ{ð 	àˆNˆNˆNØ×&Ò& {Ñ3Ô3ˆFØ�NŠNÐ6¸}ÈhÔNbÐ>cˆNÑdÔdÐdØà—M’M‘O”Oˆ	ð	Ý>¸yÑIÔIˆLˆLøÝð 	ð 	ð 	ØˆEð	øøøð % VÔ,ð 	'ð 	'ˆHàÐ&­3¨y©>¬>¸[Ò+HÐ+HØ�Ø×Ò˜XÑ&Ô&Ð&Ð&ð Ð"¥s¨9¡~¤~¸Ò'DÐ'DØð # 6Ô*ˆØ�a‰ˆ
ðK ñ %ðN Ðs   Ã C0 Ã0
C=Ã<C=c                 óº   — |                       d|› �¦  «        }|j        st          |d¦  «         |                     ¦   «         }|                     d¦  «        dk    S )a(  
    Cancel a running batch scrape job.
    
    Args:
        client: HTTP client instance
        job_id: ID of the batch scrape job to cancel
        
    Returns:
        BatchScrapeStatusResponse with updated status
        
    Raises:
        FirecrawlError: If the cancellation fails
    rS   zcancel batch scraper)   Ú	cancelled)ÚdeleterK   r   rL   r3   )r?   rP   rN   r$   s       r!   Úcancel_batch_scraperw   	  sa   € ð$ �}Š}Ð9°Ð9Ð9Ñ:Ô:€Hð Œ;ð ?Ý˜hÐ(=Ñ>Ô>Ð>ð �=Š=‰?Œ?€DØ�8Š8�HÑÔ Ò,Ð,r#   Úpoll_intervalr[   c                 óî   — t          j        ¦   «         }	 t          | |¦  «        }|j        dv r|S |r0t          j        ¦   «         |z
  |k    rt	          d|› d|› d�¦  «        ‚t          j        |¦  «         Œb)aì  
    Wait for a batch scrape job to complete, polling for status updates.
    
    Args:
        client: HTTP client instance
        job_id: ID of the batch scrape job
        poll_interval: Seconds between status checks
        timeout: Maximum seconds to wait (None for no timeout)
        
    Returns:
        BatchScrapeStatusResponse when job completes
        
    Raises:
        FirecrawlError: If the job fails or timeout is reached
        TimeoutError: If timeout is reached
    T)r*   Úfailedru   zBatch scrape job z did not complete within z seconds)rg   rh   rW   r)   ÚTimeoutErrorÚsleep)r?   rP   rx   r[   ro   Ú
status_jobs         r!   Úwait_for_batch_completionr~   &  s˜   € õ, ”Ñ!Ô!€Jð"Ý,¨V°VÑ<Ô<ˆ
ð ÔÐ DÐDÐDØÐð ð 	g�œÑ(Ô(¨:Ñ5¸Ò@Ð@ÝÐe°6ÐeÐeÐT[ÐeÐeÐeÑfÔfÐfõ 	Œ
�=Ñ!Ô!Ð!ð"r#   )
r7   r8   r9   r:   r;   r<   r=   r>   rx   r[   c       
         óf   — t          | |||||||||	¬¦
  «
        }|j        }t          | ||
|¦  «        S )a  
    Start a batch scrape job and wait for it to complete.
    
    Args:
        client: HTTP client instance
        urls: List of URLs to scrape
        options: Scraping options
        poll_interval: Seconds between status checks
        timeout: Maximum seconds to wait (None for no timeout)
        
    Returns:
        BatchScrapeStatusResponse when job completes
        
    Raises:
        FirecrawlError: If the batch scrape fails to start or complete
        TimeoutError: If timeout is reached
    r6   )rO   rD   r~   )r?   r@   r7   r8   r9   r:   r;   r<   r=   r>   rx   r[   ÚstartrP   s                 r!   Úbatch_scraper�   M  s]   € õB ØØØØØ!Ø/Ø'Ø/ØØ'ðñ ô €Eð ŒX€Fõ %Ø�˜ wñô ð r#   c                 óN  — | st          d¦  «        ‚g }| D ]Ž}|rt          |t          ¦  «        st          d|› �¦  «        ‚|                     d¦  «        s'|                     d¦  «        st          d|› �¦  «        ‚|                     |                     ¦   «         ¦  «         Œ�|S )zë
    Validate and normalize a list of URLs for batch scraping.
    
    Args:
        urls: List of URLs to validate
        
    Returns:
        Validated list of URLs
        
    Raises:
        ValueError: If URLs are invalid
    zURLs list cannot be emptyzInvalid URL: zhttp://zhttps://z)URL must start with http:// or https://: )Ú
ValueErrorr   ÚstrÚ
startswithr   Ústrip)r@   Úvalidated_urlsrE   s      r!   Úvalidate_batch_urlsrˆ   ƒ  sÆ   € ð ð 6ÝÐ4Ñ5Ô5Ð5à€NØð +ð +ˆØð 	4�* S­#Ñ.Ô.ð 	4ÝÐ2¨SÐ2Ð2Ñ3Ô3Ð3ð —’˜yÑ)Ô)ð 	P¨S¯^ª^¸JÑ-GÔ-Gð 	PÝÐNÈÐNÐNÑOÔOÐOà×Ò˜cŸiši™kœkÑ*Ô*Ð*Ð*àÐr#   rB   c                ól  — t          | ¦  «        }d|i}	|r&t          |¦  «        }
|
r|	                     |
¦  «         |�4t          |t          ¦  «        r||	d<   n|                     d¬¦  «        |	d<   |�||	d<   |�||	d<   |�||	d<   |�||	d	<   |�$t	          |¦  «                             ¦   «         |	d
<   |	S )zÀ
    Prepare a batch scrape request payload.
    
    Args:
        urls: List of URLs to scrape
        options: Scraping options
        
    Returns:
        Request payload dictionary
    r@   Nr8   T)Úexclude_noneÚ
appendToIdÚignoreInvalidURLsÚmaxConcurrencyÚzeroDataRetentionr=   )rˆ   r   Úupdater   r„   Ú
model_dumpr†   )r@   r7   r8   r9   r:   r;   r<   r=   r‡   rM   Úscrape_datas              r!   rH   rH   ¡  sþ   € õ* )¨Ñ.Ô.€NØ$*¨NÐ#;€Lð ð -Ý,¨WÑ5Ô5ˆØð 	-Ø×Ò Ñ,Ô,Ð,ð ÐÝ�g�sÑ#Ô#ð 	LØ&-ˆL˜Ñ#Ð#à&-×&8Ò&8ÀdÐ&8Ñ&KÔ&KˆL˜Ñ#ØÐØ%1ˆ�\Ñ"ØÐ&Ø,?ˆÐ(Ñ)ØÐ"Ø)8ˆÐ%Ñ&ØÐ&Ø,?ˆÐ(Ñ)ØÐÝ&)¨+Ñ&6Ô&6×&<Ò&<Ñ&>Ô&>ˆ�]Ñ#àÐr#   éd   Ú
chunk_sizec                 óŒ   — g }t          dt          | ¦  «        |¦  «        D ]"}|                     | |||z   …         ¦  «         Œ#|S )zá
    Split a large list of URLs into smaller chunks for batch processing.
    
    Args:
        urls: List of URLs to chunk
        chunk_size: Maximum size of each chunk
        
    Returns:
        List of URL chunks
    r   )Úrangerl   r   )r@   r“   ÚchunksÚis       r!   Ú
chunk_urlsr˜   Ó  sR   € ð €FÝ�1•c˜$‘i”i Ñ,Ô,ð .ð .ˆØ�Š�d˜1˜Q ™^Ð+Ô,Ñ-Ô-Ð-Ð-Ø€Mr#   c                 ó¬   — t          ||¦  «        }g }d}|D ]<}	t          | |	|||¬¦  «        }
|
j        r|                     |
j        ¦  «         |dz  }Œ=|S )aÕ  
    Process a large batch of URLs by splitting into smaller chunks.
    
    Args:
        client: HTTP client instance
        urls: List of URLs to scrape
        options: Scraping options
        chunk_size: Size of each batch chunk
        poll_interval: Seconds between status checks
        timeout: Maximum seconds to wait per chunk
        
    Returns:
        List of all scraped documents
        
    Raises:
        FirecrawlError: If any chunk fails
    r   )r7   rx   r[   rb   )r˜   r�   r/   Úextend)r?   r@   r7   r“   rx   r[   Ú
url_chunksÚall_documentsÚcompleted_chunksÚchunkÚresults              r!   Úprocess_large_batchr    ä  s†   € õ2 ˜D *Ñ-Ô-€JØ€MØÐàð ð ˆåØØØØ'Øð
ñ 
ô 
ˆð Œ;ð 	.Ø× Ò  ¤Ñ-Ô-Ð-à˜AÑÐÐàÐr#   c                 óP  — |                       d|› d�¦  «        }|j        st          |d¦  «         |                     ¦   «         }|                      d|¦  «        }|                      dg ¦  «        |                      d|                      dg ¦  «        ¦  «        dœ}t	          d	i |¤ŽS )
zÕ
    Get errors for a batch scrape job.

    Args:
        client: HTTP client instance
        job_id: ID of the batch scrape job

    Returns:
        CrawlErrorsResponse with errors and robots-blocked URLs
    rS   z/errorszget batch scrape errorsr/   ÚerrorsÚrobotsBlockedÚrobots_blocked)r¢   r¤   r   )r3   rK   r   rL   r   )r?   rP   rN   r$   rV   r    s         r!   Úget_batch_scrape_errorsr¥     s±   € ð �zŠzÐ=¨fÐ=Ð=Ð=Ñ>Ô>€HàŒ;ð CÝ˜hÐ(AÑBÔBÐBà�=Š=‰?Œ?€DØ�hŠh�v˜tÑ$Ô$€Gà—+’+˜h¨Ñ+Ô+Ø!Ÿ+š+ o°w·{²{ÐCSÐUWÑ7XÔ7XÑYÔYðð €Jõ Ð,Ð, Ð,Ð,Ð,r#   )N)r	   N)r’   )Nr’   r	   N),Ú__doc__rg   Útypingr   r   r   r   r   r   Útypesr
   r   r   r   r   r   r   Úutilsr   r   r   r   Úutils.normalizer   r   r"   r„   r5   ÚboolÚintrO   rW   Úfloatr\   rU   rw   r~   r�   rˆ   r   rH   r˜   r    r¥   r   r#   r!   ú<module>r®      s_  ððð ð €€€Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð gÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fØ 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'ð¨X°d¸3´iÔ-@ð ÀTÈ(Ä^ð ð ð ð ð¨d°3¸°8¬nð ÀÀcÈ3ÀhÄð ð ð ð ð& (,Ø37Ø"&Ø*.Ø%)Ø*.Ø!%Ø%)ð7ð 7ð 7Øð7à
ˆsŒ)ð7ð �mÔ$ð	7ð
 �e˜C Ð.Ô/Ô0ð7ð ˜3”-ð7ð " $œð7ð ˜c”]ð7ð " $œð7ð ˜#”ð7ð ˜c”]ð7ð ð7ð 7ð 7ð 7ðz 59ð1ð 1Øð1àð1ð  Ð 0Ô1ð1ð ð	1ð 1ð 1ð 1ðp (,ð	$ð $ð $Øð$àð$ð ˜e”_ð	$ð
 ð$ð $ð $ð $ðV 59ð	Dð DØðDàðDð ˜H”~ðDð  Ð 0Ô1ð	Dð
 
ˆ(„^ðDð Dð Dð DðN-Øð-àð-ð 
ð-ð -ð -ð -ð@ Ø!ð	$"ð $"Øð$"àð$"ð ð$"ð �cŒ]ð	$"ð
 ð$"ð $"ð $"ð $"ðV (,Ø37Ø"&Ø*.Ø%)Ø*.Ø!%Ø%)ØØ!ð3ð 3ð 3Øð3à
ˆsŒ)ð3ð �mÔ$ð	3ð
 �e˜C Ð.Ô/Ô0ð3ð ˜3”-ð3ð " $œð3ð ˜c”]ð3ð " $œð3ð ˜#”ð3ð ˜c”]ð3ð ð3ð �cŒ]ð3ð ð3ð 3ð 3ð 3ðl˜d 3œið ¨D°¬Ið ð ð ð ðB (,Ø37Ø"&Ø*.Ø%)Ø*.Ø!%ð/ð /ð /Ø
ˆsŒ)ð/ð �mÔ$ð/ð �e˜C Ð.Ô/Ô0ð	/ð
 ˜3”-ð/ð " $œð/ð ˜c”]ð/ð " $œð/ð ˜#”ð/ð 
ð/ð /ð /ð /ðdð �T˜#”Yð ¨Cð ¸$¸tÀC¼y¼/ð ð ð ð ð( (,ØØØ!ð-ð -Øð-à
ˆsŒ)ð-ð �mÔ$ð-ð ð	-ð
 ð-ð �cŒ]ð-ð 
ˆ(„^ð-ð -ð -ð -ð`- Jð -¸ð -Ð@Sð -ð -ð -ð -ð -ð -r#   