o
    rqi7                     @   sH  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 d dl	m
Z
mZmZmZ 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mZ d dlmZ d dlmZ e Zd	d
 Z dd Z!dFddZ"dee#ee# f fddZ$dd Z%de&de#fddZ'de#de&fddZ(de#de#fddZ)dGdee# fdd Z*d!d" Z+dFd#d$Z,d%d& Z-d'd( Z.		)dHd*e#d+ee# d,ee# ddfd-d.Z/d/Z0d0e1de#fd1d2Z2d3eeee#e&f   d4ee# de#fd5d6Z3d7d8 Z4e j5dd9d:ee#ef d;ee1 de
eddf fd<d=Z6	>dId?ee&e#ef d@e#dee fdAdBZ7dCe#de#fdDdEZ8dS )J    N)datetime)Path)	GeneratorListOptionalUnion)BaseFileLockFileLockSoftFileLockTimeout)DEFAULT_MODELSCOPE_DOMAINDEFAULT_MODELSCOPE_GROUPDEFAULT_MODELSCOPE_INTL_DOMAINMODEL_ID_SEPARATORMODELSCOPE_DOMAINMODELSCOPE_SDK_DEBUGMODELSCOPE_URL_SCHEME)FileIntegrityError)
get_loggerc                 C   s<   t | v r| t d }| t d }||fS t}| }||fS )Nr      )r   splitr   )model_idZgroup_or_ownername r   a/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/hub/utils/utils.pymodel_id_to_group_owner_name   s   r   c                 C   s   t j| d  }|dkS )N true)osenvirongetstriplower)var_namevaluer   r   r   is_env_true%   s   r%   Tc                 C   s*   t tjv rtt rtt S | rtS tS N)r   r   r   getenvr   r   Zcn_siter   r   r   
get_domain*   s
   
r)   	raw_inputc                 C   s   d }t | tr#t }d| v rdd | dD }|S ||   |S t | trNt }| D ] }t |trMd|v rF|dd |dD  q-||  q-|S )N,c                 S      g | ]}|  qS r   r!   ).0sr   r   r   
<listcomp>8       z$convert_patterns.<locals>.<listcomp>c                 S   r,   r   r-   )r.   ssr   r   r   r0   @   r1   )
isinstancestrlistr   appendr!   extend)r*   outputr/   r   r   r   convert_patterns3   s"   
	

r9   c                 C   sD   t jdr| dd}n| dd}tj|d |dd}|S )Nwin\   /r   .Z___)sysplatform
startswithrsplitr   pathjoinreplace)	directoryr   partsZmasked_directoryr   r   r   get_model_masked_directoryH   s
   rH   
size_bytesreturnc                 C   sZ   dd l }| dkr
dS d}t||| d}|d|}t| | d}| d||  S )Nr   Z0B)	BZKBMBGBTBPBEBZBYBi   r<    )mathintfloorlogpowround)rI   rT   Z	size_nameipr/   r   r   r   convert_readable_sizeR   s   r\   folder_pathc                 C   s2   d}t | dD ]}| r|| j7 }q	|S )Nr   *)r   rglobis_filestatst_size)r]   
total_sizerC   r   r   r   get_folder_size]   s   rd   c                 C   s   t t| dS )Nr]   )r\   rd   re   r   r   r   get_readable_folder_sizef   s   rf   r   c                 C   sD   t  dd}tdtj|d}| du r|S tj|| d S )zcache dir precedence:
        function parameter > environment > ~/.cache/modelscope/hub
    Args:
        model_id (str, optional): The model id.
    Returns:
        str: the model_id dir if model_id not None, otherwise cache root dir.
    z.cache
modelscopeZMODELSCOPE_CACHEZhubNr=   )r   homejoinpathr   r'   rC   rD   )r   Zdefault_cache_dir	base_pathr   r   r   get_cache_dirj   s   rk   c                  C   sL   t tjv rttt  } | S ddlm	} ttt
|jd } | S )Nr   )version%Y-%m-%d %H:%M:%S)r   r   r   rU   rY   r   now	timestamprg   rl   strptimeZ__release_datetime__)rtrl   r   r   r   get_release_datetimey   s   
rr   c                 C   s   t t|  S r&   )r   r)   r(   r   r   r   get_endpoint   s   rs   c                 C   sb   d}t  }t| d}	 ||}|sn|| qW d    | S 1 s(w   Y  | S )Ni   rb)hashlibsha256openreadupdate	hexdigest)	file_pathBUFFER_SIZEZsha256_hashfdatar   r   r   compute_hash   s   


r   c                 C   s>   t | }||kst|  d| ||f }t| t|dS )zValidate the file hash is expected, if not, delete the file

    Args:
        file_path (str): The file to validate
        expected_sha256 (str): The expected sha256 hash

    Raises:
        FileIntegrityError: If file_path hash is not expected.

    zFile %s integrity check failed, expected sha256 signature is %s, actual is %s, the download may be incomplete, please try again.N)r   r   removeloggererrorr   )r{   Zexpected_sha256Zfile_sha256msgr   r   r   file_integrity_validation   s   

r   F	file_namepatternscommit_messagec              
   C   sb  t |tr|g}|d u rd|d  d| }| j}tj||}tj|rBt|ddd}| }W d    n1 s<w   Y  nd}|}	|D ]}
|
|	vrdt	|	dkr]|	
ds]|	d7 }	|	|
 d7 }	qH|	|krt|d	dd}td
| d|	  ||	 W d    n1 sw   Y  z| | W d S  ty } z|rn|W Y d }~d S d }~ww )NzAdd `r   z` patterns to rutf-8)encodingr   
wzWriting z file. Content: )r3   r4   Z	model_dirr   rC   rD   existsrw   rx   lenendswithr   debugwritepush	Exception)repor   r   r   Zignore_push_errorrepo_dirr{   r}   Zcurrent_contentcontentpatterner   r   r   add_content_to_file   sB   

r   ))secondr   <   )minuter   r   )houri     )dayiQ    )weeki:	 r   )monthi '    )yeari3Ntsc                 C   sn   t   |  }|dk rdS tD ]\}}}t|| }|dur#||kr# nq| d| |dkr2d dS d dS )	zOFormat timestamp in seconds into a human-readable string, relative to now.
       za few seconds agoNrS   r   r/   r   z ago)time_TIMESINCE_CHUNKSrY   )r   deltalabeldividerZ	max_valuer$   r   r   r   format_timesince   s   &r   rowsheadersc                 C   s   dd t g | |R  D }dt| j| }g }||j|  ||jdd |D   | D ]
}||j|  q0d|S )z
    Inspired by:

    - stackoverflow.com/a/8356620/593036
    - stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
    c                 S   s   g | ]}t d d |D qS )c                 s   s    | ]	}t t|V  qd S r&   )r   r4   )r.   xr   r   r   	<genexpr>   s    z&tabulate.<locals>.<listcomp>.<genexpr>)max)r.   colr   r   r   r0      s    ztabulate.<locals>.<listcomp>z{{:{}}} c                 S   s   g | ]}d | qS )-r   )r.   r   r   r   r   r0      r1   r   )zipr   formatr6   rD   )r   r   Z
col_widthsZ
row_formatlinesrowr   r   r   tabulate   s   
r   c                 C   s.   |   } | dv r
dS | dv rdS td| )N>   r   yes1onytr   >   false0offnonr}   r   zinvalid truth value )r"   
ValueError)valr   r   r   	strtobool   s   r   timeout	lock_filer   c                c   s   d}t | |d}t }	 t | }|d ur"||kr"tt| z|j|r.t||| n|d W nC tyM   td|  dt | dd Y n+ tyv } zdt|v rlt	d	|  t
| |d}W Y d }~qW Y d }~nd }~ww nqz*|V  W z|  W d S  ty   z
t|   W Y d S  ty   Y nw Y d S w z|  W w  ty   z	t|   W Y w  ty   Y Y w w w )
Nr   r   Tz!Still waiting to acquire lock on z (elapsed: z.1fz	 seconds)zuse SoftFileLock insteadzPFileSystem does not appear to support flock. Falling back to SoftFileLock for %s)r	   r   r   r4   acquireminr   infoNotImplementedErrorwarningr
   releaseOSErrorr   unlink)r   r   Zdefault_intervallock
start_timeZelapsed_timer   r   r   r   weak_file_lock  sh   
r   Asia/Shanghai
time_stamp	time_zonec              
   C   s  | sdS t | tr| S t | trzv| dr\d| vr#| dd d } n| dd d\}}|dd dd}| d| d} t| djt	d	d
}|d	krY|
t	|}|W S g d}|D ]}zt| |jt	|d
W   W S  ty~   Y qbw td|  d ty } z	td|  d|d}~ww t | trztj| t	d	d
t	|W S  ttfy } z	td|  d|d}~ww tdt|  d)a>  Convert a UNIX/string timestamp to a timezone-aware datetime object.
    Args:
        time_stamp: UNIX timestamp (int), ISO string, or datetime object
        time_zone: Target timezone for non-UTC timestamps (default: 'Asia/Shanghai')
    Returns:
        Timezone-aware datetime object or None if input is None
    NZr>   z.000000Zr   r   z%Y-%m-%dT%H:%M:%S.%fZUTC)tzinfo)z%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%M:%Sz%Y-%m-%d %H:%M:%S.%frm   zUnsupported timestamp format: ''zCannot parse 'zr' as a datetime. Expected formats: 'YYYY-MM-DDTHH:MM:SS[.ffffff]Z' (UTC) or 'YYYY-MM-DDTHH:MM:SS[.ffffff]' (local))tzzCannot convert 'z2' to datetime. Ensure it's a valid UNIX timestamp.zUnsupported type 'z"'. Expected int, str, or datetime.)r3   r   r4   r   r   ljustrp   rE   zoneinfoZZoneInfo
astimezoner   rU   fromtimestampr   	TypeErrortype)r   r   basefractiondtformatsfmtr   r   r   r   convert_timestamp1  s   	








r   
image_pathc                 C   s   ddl }ddl}tj| } tj| std|  tj| s(td|  |	| \}}|r6|
ds=td|  t| d}| }||d}W d   n1 sYw   Y  d	| d
| S )a+  
    Encode image file to base64 string.

    Args:
        image_path (str): Path to the image file

    Returns:
        str: Base64 encoded string with data URL prefix

    Raises:
        FileNotFoundError: If image file doesn't exist
        ValueError: If file is not a valid image format
    r   NzImage file not found: zPath is not a file: zimage/z"File is not a valid image format: rt   r   zdata:z;base64,)base64	mimetypesr   rC   
expanduserr   FileNotFoundErrorisfiler   
guess_typerA   rw   rx   	b64encodedecode)r   r   r   Z	mime_type_Z
image_fileZ
image_dataZbase64_datar   r   r   encode_image_to_base64  s   r   )Tr&   )NF)r   )9
contextlibru   r   r?   r   r   r   pathlibr   typingr   r   r   r   Zfilelockr   r	   r
   r   Zmodelscope.hub.constantsr   r   r   r   r   r   r   Zmodelscope.hub.errorsr   Zmodelscope.utils.loggerr   r   r   r%   r)   r4   r9   rH   rU   r\   rd   rf   rk   rr   rs   r   r   r   r   floatr   r   r   contextmanagerr   r   r   r   r   r   r   <module>   sp   $

	
	

(*	,
N