o
    )j$M                     @   s  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 e Zdd	 Zd
d ZdoddZ dee!ee! f fddZ"		dpdeee!  deee!  dee! 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(dqd!ee! fd"d#Z)d$d% Z*dod&d'Z+		drd(ee! d)e,de!fd*d+Z-d,d- Z.de,fd.d/Z/		0dsd1e!d2ee! d3ee! ddfd4d5Z0d6Z1d7e2de!fd8d9Z3d:eeee!e%f   d;ee! de!fd<d=Z4d>d? Z5e j6dd@dAee!ef dBee2 de
eddf fdCdDZ7	EdtdFee%e!ef dGe!dee fdHdIZ8i dJdKdLdMdNdOdPdQdRdSdTdSdUdVdWdXdYdZd[d\d]d^d_d^d`dadbdcdddedfdgdhdidjdkiZ9dle!de!fdmdnZ:dS )u    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)
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   [/var/www/html/Deteccion_Ine/venv/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   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>7       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_patterns2   s"   
	

r9   allow_file_patternallow_patternsreturnc                    s  g }| r	| |  |r| | |sdS g }|D ]>}t|}dD ]}||}|dkr0t||}q |d| }|d}	|	dkrV|d|	  t fdddD sV|  q|s[dS t|dkre|d S d	d
 |D }
g }t|
 D ]}tt|dkr||d  qr |sdS d	|S )aZ  Extract common directory prefix from include patterns for server-side filtering.

    Only processes allow/include patterns (ignore/exclude is irrelevant for prefix).
    Returns None if no meaningful prefix can be extracted.

    Algorithm:
    1. Merge allow_file_pattern and allow_patterns into one list
    2. For each pattern, find position of first wildcard char (* ? [)
    3. Extract text before that position, then take directory part (up to last '/')
    4. Find longest common directory prefix (path-segment-aware)
    5. Return None if no valid common prefix

    Examples:
        ['TacExo/*'] -> 'TacExo'
        ['data/train/*.parquet'] -> 'data/train'
        ['data/train/*', 'data/valid/*'] -> 'data'
        ['*.safetensors'] -> None
        ['TacExo/*', 'OtherDir/*'] -> None (no common prefix)
        ['data/*/train.csv'] -> 'data'
    N)*?[/r   c                 3   s    | ]}| v V  qd S r%   r   )r.   cZdir_partr   r   	<genexpr>x   s    z-extract_root_from_patterns.<locals>.<genexpr>r   c                 S   s   g | ]}| d qS )rA   )r   )r.   dr   r   r   r0      s    z.extract_root_from_patterns.<locals>.<listcomp>)
r7   lenfindminrfindanyr6   zipsetjoin)r:   r;   patternsZextracted_dirspatternZfirst_wildcardwcposprefixZlast_sepsplit_pathsZcommon_segmentssegmentsr   rC   r   extract_root_from_patternsE   sF   






rU   c                 C   sD   t jdr| dd}n| dd}tj|d |dd}|S )Nwin\   rA   r   .Z___)sysplatform
startswithrsplitr   pathrM   replace)	directoryr   partsZmasked_directoryr   r   r   get_model_masked_directory   s
   rb   
size_bytesc                 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   rX    )mathintfloorlogpowround)rc   rm   Z	size_nameipr/   r   r   r   convert_readable_size   s   ru   folder_pathc                 C   s2   d}t | dD ]}| r|| j7 }q	|S )Nr   r=   )r   rglobis_filestatst_size)rv   Z
total_sizer^   r   r   r   get_folder_size   s   r{   c                 C   s   t t| dS )Nrv   )ru   r{   r|   r   r   r   get_readable_folder_size   s   r}   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hubNrA   )r   homejoinpathr   r&   r^   rM   )r   Zdefault_cache_dir	base_pathr   r   r   get_cache_dir   s   r   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   rn   rr   r   now	timestampr~   r   strptimeZ__release_datetime__)rtr   r   r   r   get_release_datetime   s   
r   c                 C   s   t t|  S r%   )r   r)   r'   r   r   r   get_endpoint   s   r   cli_endpointr(   c                 C   sN   | du r	t |dS |  d}|st |dS |ds%|ds%t| }|S )a  Resolve the ModelScope API endpoint with automatic scheme completion.

    Priority (highest to lowest):
        1. ``cli_endpoint`` (explicit CLI --endpoint argument)
        2. Environment variable ``MODELSCOPE_DOMAIN``
        3. Built-in default (https://www.modelscope.cn)

    Scheme auto-completion:
        If the resolved value does not start with ``http://`` or ``https://``,
        ``https://`` is prepended automatically so that callers may pass bare
        domain names such as ``modelscope.ai``.

    Args:
        cli_endpoint: Value from the CLI ``--endpoint`` flag.  When *None*,
            the function falls back to :func:`get_endpoint`.
        cn_site: Forwarded to :func:`get_endpoint` when *cli_endpoint* is
            *None*.  ``True`` selects the Chinese site, ``False`` the
            international site.

    Returns:
        A fully-qualified endpoint URL, e.g. ``https://www.modelscope.cn``.
    Nr'   rA   zhttp://zhttps://)r   r    rstripr\   r   )r   r(   Zendpointr   r   r   resolve_endpoint   s   

r   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| dS 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

    Returns:
        bool: True if the file is valid, False otherwise
    zFile %s integrity check failed, expected sha256 signature is %s, actual is %s, the download may be incomplete, please try again.FT)r   r   removeloggererror)r   Zexpected_sha256Zfile_sha256msgr   r   r   file_integrity_validation  s   


r   F	file_namerN   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   r^   rM   existsr   r   rF   endswithr   debugwritepush	Exception)repor   rN   r   Zignore_push_errorrepo_dirr   r   Zcurrent_contentcontentrO   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 agoNrl   r   r/   r   z ago)time_TIMESINCE_CHUNKSrr   )r   deltalabeldividerZ	max_valuer#   r   r   r   format_timesinceN  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%   )rF   r4   )r.   xr   r   r   rD   b  s    z&tabulate.<locals>.<listcomp>.<genexpr>)max)r.   colr   r   r   r0   b  s    ztabulate.<locals>.<listcomp>z{{:{}}} c                 S   s   g | ]}d | qS )-r   )r.   r   r   r   r   r0   f  r1   r   )rK   rF   formatr6   rM   )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>   1yesonytr   r   >   offnfalseno0r   r   zinvalid truth value )r!   
ValueError)valr   r   r   	strtoboolm  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 ni tyM   td|  dt | dd Y nQ tyq } zdt|v rlt	d	|  t
| |d}W Y d }~q d }~w ty } z |jtjtjtjfv rt	d
|j|  t
| |d}W Y d }~q 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 %szCEncountered OSError (errno=%d) on %s, Falling back to SoftFileLock.)r	   r   r   r4   acquirerH   r   infoNotImplementedErrorwarningr
   OSErrorerrnoZESTALEENOENTZ	EREMOTEIOreleaser   unlink)r   r   Zdefault_intervallock
start_timeZelapsed_timer   r   r   r   weak_file_lockv  s|   

!r   Asia/Shanghai
time_stamp	time_zonec           	   
   C   s  ddl }| 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|	d
d}|d
kr]|
|	|}|W S g d}|D ]}zt| |j|	|dW   W S  ty   Y qfw td|  d ty } z	td|  d|d}~ww t| trztj| |	d
d
|	|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
    r   NZrY   r@   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.%fr   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.)zoneinfor3   r   r4   r   r   ljustr   r_   ZZoneInfo
astimezoner   rn   fromtimestampr   	TypeErrortype)	r   r   r   baseZfractiondtformatsfmtr   r   r   r   convert_timestamp  s   	








r   z.webpz
image/webpz.avifz
image/avifz.heicz
image/heicz.heifz
image/heifz.jpgz
image/jpegz.jpegz.pngz	image/pngz.gifz	image/gifz.bmpz	image/bmpz.svgzimage/svg+xmlz.tiffz
image/tiffz.tifz.icozimage/x-iconz.mp4z	video/mp4z.webmz
video/webmz.avizvideo/x-msvideoz.movzvideo/quicktimez.mkvzvideo/x-matroskamedia_file_pathc                 C   s   ddl }ddl}tj| } tj| std|  tj| s(td|  |	| \}}|s>t
tj| d  }|sGtd|  t| d}| }||d}W d   n1 scw   Y  d	| d
| S )aB  
    Encode image or video file to base64 string.

    Args:
        media_file_path (str): Path to the image or video file

    Returns:
        str: Base64 encoded string with data URL prefix

    Raises:
        FileNotFoundError: If image/video file doesn't exist
        ValueError: If file is not a valid format
    r   NzImage file not found: zPath is not a file: r   zFile is not a valid format: r   r   zdata:z;base64,)base64	mimetypesr   r^   
expanduserr   FileNotFoundErrorisfiler   
guess_type_FALLBACK_MIME_TYPESr   splitextr!   r   r   	b64encodedecode)r   r   r   Z	mime_type_Z
media_fileZ
image_dataZbase64_datar   r   r   encode_media_to_base64  s&   r	  )T)NNr%   )NT)NF)r   );
contextlibr   r   r   rZ   r   r   pathlibr   typingr   r   r   r   filelockr   r	   r
   r   Zmodelscope.hub.constantsr   r   r   r   r   r   r   Zmodelscope.utils.loggerr   r   r   r$   r)   r4   r9   rU   rb   rn   ru   r{   r}   r   r   r   boolr   r   r   r   r   floatr   r   r   contextmanagerr   r   r  r	  r   r   r   r   <module>   s   $

	


O
	

#
(*	6
Q	
