o
    eD                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dl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 d dl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mZmZ d dlZd dlZd dlZd dl Z d d
lm!Z! d dl"m#Z# dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,h dZ-dZ.e!j/e!j0e!j1e!j2e!j3gZ4e5e6dpd7d8 Z9G dd de:Z;G dd de:Z<G dd de:Z=G d d! d!e:Z>G d"d# d#eZ?eG d$d% d%Z@eG d&d' d'ZAd(d) ZBeG d*d+ d+ZCeG d,d- d-ZDdd2d3ZEdd4d5ZFdd6d7ZG	ddd?d@ZH	dddEdFZIdddHdIZJddKdLZKddNdOZLddRdSZMddUdVZNddXdYZOdddZd[ZPdd]d^ZQdddbdcZRddedfZS			dddidjZTdddmdnZUddpdqZV		rdddudvZWddzd{ZXG d|d} d}eYZZdddZ[dddZ\dS )    )annotationsN)CancelledError)	dataclassfield)datetime)Enum)Path)Lock)AnyCallableOptional)
SpaceStage)WebSocketCommonProtocolzapi/predict/z
queue/joinZuploadconfiginfozinfo?serialize=Falsez0https://gradio-space-api-fetcher-v2.hf.space/apiresetzhttps://hf.space/{}>   ZtabitemZ	accordionformcolumnZdatasetgrouptabsrowtabZinterpretationboxstater   zversion.txt    asciic                   @     e Zd ZdZdS )TooManyRequestsErrorz.Raised when the API returns a 429 status code.N__name__
__module____qualname____doc__ r#   r#   CD:\Projects\ConvertPro\env\Lib\site-packages\gradio_client/utils.pyr   @       r   c                   @  r   )
QueueErrorzMRaised when the queue is full or there is an issue adding a job to the queue.Nr   r#   r#   r#   r$   r&   F   r%   r&   c                   @  r   )InvalidAPIEndpointErrorz(Raised when the API endpoint is invalid.Nr   r#   r#   r#   r$   r'   L   r%   r'   c                   @  r   )SpaceDuplicationErrorz:Raised when something goes wrong with a Space Duplication.Nr   r#   r#   r#   r$   r(   R   r%   r(   c                   @  s^   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZedddZdddZedddZdS )Statusz'Status codes presented to client users.STARTINGJOINING_QUEUE
QUEUE_FULLIN_QUEUESENDING_DATA
PROCESSING	ITERATINGPROGRESSFINISHED	CANCELLEDstatusreturnintc              
   C  s6   t jt jt jt jt jt jt jt jt j	t j
g
}|| S )z'Order of messages. Helpful for testing.)r)   r*   r+   r,   r-   r.   r/   r1   r0   r2   r3   index)r4   orderr#   r#   r$   orderingf   s   
zStatus.orderingotherc                 C  s   |  | |  |k S N)r9   )selfr:   r#   r#   r$   __lt__w   s   zStatus.__lt__msgstrc              	   C  s*   t jt jt jt jt jt jt jt jd|  S )zKMap the raw message from the backend to the status code presented to users.)	send_hash
queue_fullZ
estimation	send_dataZprocess_startsZprocess_generatingprocess_completedprogress)	r)   r+   r,   r-   r.   r/   r0   r2   r1   )r>   r#   r#   r$   msg_to_statusz   s   	zStatus.msg_to_statusN)r4   r)   r5   r6   )r:   r)   )r>   r?   r5   r)   )r   r    r!   r"   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   staticmethodr9   r=   rE   r#   r#   r#   r$   r)   X   s"    
r)   c                   @  sD   e Zd ZU ded< ded< ded< ded< ded< edddZdS )ProgressUnitzOptional[int]r7   lengthzOptional[str]unitzOptional[float]rD   descdata
list[dict]r5   list[ProgressUnit]c                   s    fdd|D S )Nc              
     s<   g | ]} | d | d| d| d| ddqS )r7   rH   rI   rD   rJ   )r7   rH   rI   rD   rJ   )get).0dclsr#   r$   
<listcomp>   s    z,ProgressUnit.from_ws_msg.<locals>.<listcomp>r#   )rR   rK   r#   rQ   r$   from_ws_msg   s   
zProgressUnit.from_ws_msgN)rK   rL   r5   rM   )r   r    r!   __annotations__classmethodrT   r#   r#   r#   r$   rG      s   
 rG   c                   @  sJ   e Zd ZU dZded< ded< ded< ded< d	ed
< ded< ded< dS )StatusUpdatezIUpdate message sent from the worker thread to the Job on the main thread.r)   codez
int | Nonerank
queue_sizezfloat | Noneetazbool | Nonesuccesszdatetime | Nonetimezlist[ProgressUnit] | Noneprogress_dataN)r   r    r!   r"   rU   r#   r#   r#   r$   rW      s   
 rW   c                	   C  s   t tjd d d d t d dS )N)rX   rY   rZ   r[   r\   r]   r^   )rW   r)   r*   r   nowr#   r#   r#   r$   create_initial_status_update   s   r`   c                   @  s6   e Zd ZU dZeedZded< eedZ	ded< dS )	JobStatuszpThe job status.

    Keeps track of the latest status update and intermediate outputs (not yet implements).
    )default_factoryrW   latest_statusz	list[Any]outputsN)
r   r    r!   r"   r   r`   rc   rU   listrd   r#   r#   r#   r$   ra      s   
 ra   c                   @  s>   e Zd ZU dZded< ded< ded< ded	< d
Zded< dS )CommunicatorzKHelper class to help communicate between the worker thread and main thread.r	   lockra   jobzCallable[..., tuple]prediction_processorr?   	reset_urlFboolshould_cancelN)r   r    r!   r"   rU   rl   r#   r#   r#   r$   rf      s   
 rf   possible_urlr?   r5   rk   c                 C  s
   |  dS )z>
    Check if the given string looks like an HTTP(S) URL.
    )zhttp://zhttps://)
startswithrm   r#   r#   r$   is_http_url_like   s   
rp   c                 C  s   ddi}z7t  (}|j| |d}|jdkr&|j| |djW  d   W S |jW  d   W S 1 s4w   Y  W dS  tyE   Y dS w )zb
    Probe the given URL to see if it responds with a 200 status code (to HEAD, then to GET).
    z
User-Agentz-gradio (https://gradio.app/; team@gradio.app)headersi  NF)requestssessionheadstatus_coderN   ok	Exception)rm   rr   sessZhead_requestr#   r#   r$   	probe_url   s   

(rz   c                 C  s   t d t| ot| S )z3
    Check if the given string is a valid URL.
    z^is_valid_url should not be used. Use is_http_url_like() and probe_url(), as suitable, instead.)warningswarnrp   rz   ro   r#   r#   r$   is_valid_url   s   r}   	websocketr   rK   	hash_datahelperCommunicator | Nonedict[str, Any]c                   s\  d}i }|s*t |  }| st|rh|jH |jrYt 4 I d H '}|j|j	t
|d}|  t j||ddI d H  W d   I d H  t 1 I d H sQw   Y  t W d    n1 scw   Y  t dI d H  | r| }	t
|	}|r|jn d|v }
tt|d |d|d	d |d
t |d|
rt|d nd d}|di dg }|r|jtjkrz|j| }W n ty } z	|g}W Y d }~nd }~ww |jj| ||j_ W d    n1 sw   Y  |d dkrt!d|d dkr| "|I d H  n|d dkr"| "|I d H  |d dk}|r|d S )NF)jsonT)return_exceptionsg{Gz?r^   r>   rZ   rY   r\   Zrank_eta)rX   rZ   rY   r\   r]   r[   r^   outputrK   rA   z Queue is full! Please try again.r@   rB   rC   )#asynciocreate_taskrecvdonerg   rl   httpxZAsyncClientpostrj   r   loadscancelgatherr   sleepresultrW   r)   rE   rN   r   r_   rG   rT   rX   r2   ri   rx   rh   rd   appendrc   r&   send)r~   rK   r   r   	completedresptaskhttpr   r>   Zhas_progressZstatus_updater   r   er#   r#   r$   get_pred_from_ws   sv   


4r   url_pathhf_token
str | Nonedirc              	   C  s   |d urt j|dd |rdd| ini }t|pt td }|jddd |t| j }t	j
| |dd(}|  t|d}t|j| W d    n1 sTw   Y  W d    n1 scw   Y  t| S )	NTexist_okAuthorizationBearer    r   parents)rr   streamwb)osmakedirsr   tempfile
gettempdirsecrets	token_hexmkdirnamers   rN   raise_for_statusopenshutilcopyfileobjrawr?   resolve)r   r   r   rr   	directory	file_pathrfr#   r#   r$   download_tmp_copy_of_file8  s   r   r   c                 C  sN   t |pt td }|jddd |t | j }t| | t	|
 S )Nr   Tr   )r   r   r   r   r   r   r   r   copy2r?   r   )r   r   r   destr#   r#   r$   create_tmp_copy_of_fileI  s
   r   filenamec                 C  s<   |  drdS t| d }|d ur|dddd}|S )Nz.vttztext/vttr   zx-wavZwavzx-flacflac)endswith	mimetypes
guess_typereplace)r   mimetyper#   r#   r$   get_mimetypeQ  s   
r   encodingc                 C  s^   |  dd} t| d }|dkrdS |d u rd S t|}|d ur-|dr-|dd  }|S )Nz	audio/wavzaudio/x-wavr   z
audio/flacr   .   )r   r   r   guess_extensionrn   )r   type	extensionr#   r#   r$   get_extensionZ  s   
r   r   
str | Pathc                 C  sp   t | d)}t| }t|d}tt| }d|d ur|nd d | 	 W  d    S 1 s1w   Y  d S )Nrbutf-8data: ;base64,)r   base64	b64encodereadr?   r   )r   fileencoded_string
base64_strr   r#   r#   r$   encode_file_to_base64g  s   
$r   urlc                 C  sL   t | }|  t|j}t|d}t| }d|d ur|nd d | S )Nr   r   r   r   )rs   rN   r   r   r   contentr?   r   )r   r   r   r   r   r#   r#   r$   encode_url_to_base64t  s   

r   pathc                 C  s    t | } t| rt| S t| S r;   )r?   rp   r   r   )r   r#   r#   r$   encode_url_or_file_to_base64  s   r   c                 c  sr    t  }|rdd| ini }tjd| |d}| D ]	}||7 }|V  qW d    n1 s/w   Y  |V  d S )Nr   r   GETrq   )	bytearrayr   r   Z
iter_bytes)r   r   Zarrrr   r   rK   r#   r#   r$   download_byte_stream  s   
r   tuple[bytes, str | None]c                 C  s&   t | }| ddd }t||fS )N,r   )r   rsplitr   	b64decode)r   r   rK   r#   r#   r$   decode_base64_to_binary  s   r      	max_bytesr6   c                 C  sf   d dd | D } t|  }||kr1||kr1t| dkr!	 | S | dd } t|  }||ks| S )zjStrips invalid characters from a filename and ensures that the file_length is less than `max_bytes` bytes.r   c                 S      g | ]}|  s|d v r|qS )z._- isalnumrO   charr#   r#   r$   rS          z5strip_invalid_filename_characters.<locals>.<listcomp>r   Nr   )joinlenencode)r   r   Zfilename_lenr#   r#   r$   !strip_invalid_filename_characters  s   r   original_namec                 C  s    d dd | D dd S )zECleans up a Python parameter name to make the API info more readable.r   c                 S  r   )z _r   r   r#   r#   r$   rS     r   z,sanitize_parameter_names.<locals>.<listcomp> _)r   r   lower)r   r#   r#   r$   sanitize_parameter_names  s   r   str | Path | Noneprefixc           	      C  s   t |pt td }|jddd t| \}}|d urA|d u rAt |j}|}d|v rA|d|d }||dd d  }|d urIt	|}|d u rVtj
d||d}ntj
d|d| |d	}|| |  |S )
Nr   Tr   r   r   r   F)deleter   r   )r   r   suffixr   )r   r   r   r   r   r   r   r   r7   r   NamedTemporaryFilewriteflush)	r   r   r   r   r   rK   r   r   file_objr#   r#   r$   decode_base64_to_file  s0   

r   jsnstr | dict | listc                 C  sT   |d urt j|dd tjdd|dd}t| trt| } t| | |	  |S )NTr   Fz.jsonzw+)r   r   r   mode)
r   r   r   r   
isinstancer?   r   r   dumpr   )r   r   r   r#   r#   r$   dict_or_str_to_json_file  s   

r  dict | listc                 C  s6   t | }t|W  d    S 1 sw   Y  d S r;   )r   r   load)r   r   r#   r#   r$   file_to_json  s   
$r  ,  space_idtimeout_in_secondsc              
   C  sv   t jj|dtd}tjd|  dd|i|d}z	t j| W d S  t jjy: } ztdt	
|  d|d }~ww )	NZgradio_client)tokenZlibrary_nameZlibrary_versionz"https://huggingface.co/api/spaces/z
/sleeptimeseconds)r   rr   z>Could not set sleep timeout on duplicated Space. Please visit z5 to set a timeout manually to reduce billing charges.)huggingface_hubutilsZbuild_hf_headers__version__rs   r   Zhf_raise_for_statusZHfHubHTTPErrorr(   	SPACE_URLformat)r
  r   r  rr   reqerrr#   r#   r$   set_space_timeout  s(   
r  funcr   r
   c                 O  s"   t jjt j | g|R i |S )a  
    Runs async functions in sync scopes. Can be used in any scope.

    Example:
        if inspect.iscoroutinefunction(block_fn.fn):
            predictions = utils.synchronize_async(block_fn.fn, *processed_input)

    Args:
        func:
        *args:
        **kwargs:
    )fsspecZasynZsyncget_loop)r  argskwargsr#   r#   r$   synchronize_async  s   "r  c                   @  s   e Zd ZdS )APIInfoParseErrorN)r   r    r!   r#   r#   r#   r$   r    s    r  schemadictc                 C  s:   d| v r| d S |  drdS |  drdS td|  )Nr   oneOfanyOfzCannot parse type for )rN   r  )r  r#   r#   r$   get_type  s   

r!  c                 C  s  t | }|i krd| d v rdS dS |dkrdS |dkrdS |d	kr$d
S |dkr*dS |dkr0dS |dkrY| d}d|v rOddd |d D }d| dS t|}d| dS |dkrqddd | d  D }d| dS |dv rddd | | D }|S td |  )!z/Convert the json schema into a python type hintr   descriptionzDict[Any, Any]r
   nullNoneintegerr6   stringr?   booleanrk   numberzint | floatarrayitemsZprefixItemsz, c                 S     g | ]}t |qS r#   json_schema_to_python_typerO   ir#   r#   r$   rS   7      z.json_schema_to_python_type.<locals>.<listcomp>zTuple[]zList[objectc              	   S  s0   g | ]\}}| d t | d|d dqS )z: z (r"  ))r-  rN   )rO   nvr#   r#   r$   rS   ?  s    
propertieszDict(r3  )r  r   z | c                 S  r+  r#   r,  r.  r#   r#   r$   rS   F  r0  zCannot parse schema )r!  rN   r   r-  r*  r  )r  type_r*  elementsZdesrJ   r#   r#   r$   r-  !  sF   

r-  )rm   r?   r5   rk   r;   )
r~   r   rK   r?   r   r?   r   r   r5   r   )NN)r   r?   r   r   r   r   r5   r?   )r   r?   r   r   r5   r?   )r   r?   r5   r   )r   r?   r5   r   )r   r   )r   r?   )r   r   )r   r?   r5   r   )r   )r   r?   r   r6   r5   r?   )r   r?   r5   r?   )NNN)r   r?   r   r   r   r   r   r   )r   r  r   r   )r   r   r5   r  )Nr	  )r
  r?   r   r   r  r6   )r  r   r5   r
   )r  r  )r  r
   r5   r?   )]
__future__r   r   r   r   r   r   pkgutilr   r   r   r{   concurrent.futuresr   dataclassesr   r   r   enumr   pathlibr   	threadingr	   typingr
   r   r   Zfsspec.asynr  r   r  rs   r   Zwebsockets.legacy.protocolr   ZAPI_URLZWS_URLZ
UPLOAD_URLZ
CONFIG_URLZAPI_INFO_URLZRAW_API_INFO_URLZSPACE_FETCHER_URLZ	RESET_URLr  ZSKIP_COMPONENTSZSTATE_COMPONENTZNO_APP_FILEZCONFIG_ERRORZBUILD_ERRORZRUNTIME_ERRORZPAUSEDZINVALID_RUNTIMEget_datar   decodestripr  rx   r   r&   r'   r(   r)   rG   rW   r`   ra   rf   rp   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  
ValueErrorr  r!  r-  r#   r#   r#   r$   <module>   s    1



E

	





#



