
    9i8                        S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
JrJrJr  S SKJrJrJrJr  S SKJrJrJrJrJrJrJr  S SKJr  S SKJr  \" 5       rS	 r S
 r!S/S jr"S\\#\\#   4   4S jr$S r%S\&S\#4S jr'S\#S\&4S jr(S\#S\#4S jr)S0S\\#   4S jjr*S r+S/S jr,S r-S\.4S jr/  S1S\#S\\#   S\\#   SS4S jjr0Sr1S \2S\#4S! jr3S"\\\\#\&4         S#\\#   S\#4S$ jr4S% r5\ Rl                  SS&.S'\\#\4   S(\\2   S\
\SS4   4S) jj5       r7 S2S*\\&\#\4   S+\#S\\   4S, jjr8S-\#S\#4S. jr9g)3    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                     [         U ;   a3  U R                  [         5      S   nU R                  [         5      S   nX4$ [        nU nX4$ )Nr      )r   splitr   )model_idgroup_or_ownernames      Z/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/hub/utils/utils.pymodel_id_to_group_owner_namer      sR    X%!(:;A>~~01!4  2    c                     [         R                  R                  U S5      R                  5       R	                  5       nUS:H  $ )N true)osenvirongetstriplower)var_namevalues     r   is_env_truer)   %   s2    JJNN8R(..0668EF?r   c                     [         [        R                  ;   a9  [        R                  " [         5      (       a  [        R                  " [         5      $ U (       a  [        $ [
        $ N)r   r"   r#   getenvr   r   cn_sites    r   
get_domainr/   *   s<    BJJ&2995F+G+Gyy*++((--r   	raw_inputc                 T   S n[        U [        5      (       ab  [        5       nSU ;   a0  U R                  S5       Vs/ s H  o"R	                  5       PM     nnU$ UR                  U R	                  5       5         U$ [        U [        5      (       a  [        5       nU  H  n[        U[        5      (       d  M  SU;   a@  UR                  UR                  S5       Vs/ s H  o3R	                  5       PM     sn5        M`  UR                  UR	                  5       5        M     U$ s  snf s  snf )N,)
isinstancestrlistr   r%   appendextend)r0   outputssss       r   convert_patternsr;   3   s    F)S!!))2)=>)=Aggi)=F> M MM)//+, M 
It	$	$A!S!!!8MM"E"88:"EFMM!''),  M ? #Fs   D D%
c                     [         R                  R                  S5      (       a  U R                  SS5      nOU R                  SS5      n[        R
                  R                  US   UR                  SS5      5      nU$ )Nwin\   /r   .___)sysplatform
startswithrsplitr"   pathjoinreplace)	directoryr   partsmasked_directorys       r   get_model_masked_directoryrM   H   sg    
||u%%  q)  a(ww||E!Hh.>.>sE.JKr   
size_bytesreturnc                     SS K nU S:X  a  gSn[        UR                  UR                  U S5      5      5      nUR	                  SU5      n[        X-  S5      nU SX#    3$ )Nr   0B)	BKBMBGBTBPBEBZBYBi   r?    )mathintfloorlogpowround)rN   r\   	size_nameipr9   s         r   convert_readable_sizere   R   sc    QEIDJJtxx
D123AqAjna AS),  r   folder_pathc                     Sn[        U 5      R                  S5       H6  nUR                  5       (       d  M  XR                  5       R                  -  nM8     U$ )Nr   *)r   rglobis_filestatst_size)rf   
total_sizerG   s      r   get_folder_sizern   ]   sH    J[!'',<<>>))+---J - r   c                 &    [        [        U S95      $ )Nrf   )re   rn   rp   s    r   get_readable_folder_sizerq   f   s     [!IJJr   r   c                    [         R                  " 5       R                  SS5      n[        R                  " S[        R
                  R                  US5      5      nU c  U$ [        R
                  R                  X S-   5      $ )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
modelscopeMODELSCOPE_CACHEhubr@   )r   homejoinpathr"   r,   rG   rH   )r   default_cache_dir	base_paths      r   get_cache_dirrz   j   sj     		,,X|D		,'',,'8%@BI (9 #bggllc>/# #r   c                  2   [         [        R                  ;   a7  [        [	        [
        R                  " 5       R                  5       5      5      n U $ SSKJ	n  [        [	        [
        R                  " UR                  S5      R                  5       5      5      n U $ )Nr   )version%Y-%m-%d %H:%M:%S)r   r"   r#   r]   ra   r   now	timestamprs   r|   strptime__release_datetime__)rtr|   s     r   get_release_datetimer   y   ss    rzz)x||~//123 I 	'!!'">">"577@y{DE Ir   c                 &    [         [        U 5      -   $ r+   )r   r/   r-   s    r   get_endpointr      s     :g#666r   c                    Sn[         R                  " 5       n[        U S5       n UR                  U5      nU(       d  OUR	                  U5        M,  S S S 5        UR                  5       $ ! , (       d  f       UR                  5       $ = f)Ni   rb)hashlibsha256openreadupdate	hexdigest)	file_pathBUFFER_SIZEsha256_hashfdatas        r   compute_hashr      sy    K.."K	i	!66+&Dt$	  
   "" 
	   ""s   .A**
Bc                     [        U 5      nX!:X  d;  [        R                  " U 5        SU < SU< SU< S3n[        R	                  U5        gg)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
zFile z6 integrity check failed, expected sha256 signature is z, actual is z3, the download may be incomplete, please try again.FT)r   r"   removeloggererror)r   expected_sha256file_sha256msgs       r   file_integrity_validationr      s@     y)K)
		)5Sr   	file_namepatternscommit_messagec                    [        U[        5      (       a  U/nUc  SUS    SU 3nU R                  n[        R                  R                  XQ5      n[        R                  R                  U5      (       a%  [        USSS9 nUR                  5       nS S S 5        OSnWn	U H;  n
X;  d  M
  [        U	5      S:  a  U	R                  S5      (       d  U	S-  n	X S3-  n	M=     X:w  a@  [        US	SS9 n[        R                  S
U SU	 35        UR                  U	5        S S S 5         U R                  U5        g ! , (       d  f       N= f! , (       d  f       N2= f! [         a  nU(       a   S nAg UeS nAff = f)NzAdd `r   z` patterns to rutf-8)encodingr    
wzWriting z file. Content: )r3   r4   	model_dirr"   rG   rH   existsr   r   lenendswithr   debugwritepush	Exception)repor   r   r   ignore_push_errorrepo_dirr   r   current_contentcontentpatternes               r   add_content_to_filer      sT   
 (C  : !^I;G ~~HX1I	ww~~i  )S73qffhO 43 G!7|a(8(8(>(>4"~%G	  !)S73qLL8I;.>wiHIGGG 4		.!% 43 43
  G	s6   D80-E	&E 8
E	
E
E7$E20E22E7))secondr   <   )minuter   r   )houri     )dayiQ    )weeki:	 r   )monthi '    )yeari3Ntsc                     [         R                   " 5       U -
  nUS:  a  g[         H  u  p#n[        X-  5      nUc  M  XT::  d  M    O   W SW US:  a  S S3$ S S3$ )zOFormat timestamp in seconds into a human-readable string, relative to now.
       za few seconds agor[   r   r9   r    z ago)time_TIMESINCE_CHUNKSra   )r   deltalabeldivider	max_valuer(   s         r   format_timesincer      st     IIK"Erz"%6!	eo& U%7 &7 WAeWEAIS6d;;26d;;r   rowsheadersc           	         [        / U QUP76  Vs/ s H  n[        S U 5       5      PM     nnS[        U5      -  R                  " U6 n/ nUR	                  UR                  " U6 5        UR	                  UR                  " U Vs/ s H  nSU-  PM
     sn6 5        U  H!  nUR	                  UR                  " U6 5        M#     SR                  U5      $ s  snf s  snf )zy
Inspired by:

- stackoverflow.com/a/8356620/593036
- stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
c              3   J   #    U  H  n[        [        U5      5      v   M     g 7fr+   )r   r4   ).0xs     r   	<genexpr>tabulate.<locals>.<genexpr>   s     /3ac#a&kk3s   !#z{{:{}}} -r   )zipmaxr   formatr6   rH   )r   r   col
col_widths
row_formatlinesr   rows           r   tabulater      s     <?;N;Ng;NO;NC#/3//;NJOs7|+33Z@JE	LL""G,-	LL""j$AjS1Wj$ABCZ&&,- 99U P %Bs   CCc                 \    U R                  5       n U S;   a  gU S;   a  g[        SU < 35      e)N>   1tyonyesr!   r   >   0r   nnoofffalser   zinvalid truth value )r&   
ValueError)vals    r   	strtoboolr      s8    
))+C
22
33
+C73
44r   timeout	lock_filer   c             #   \  #    Sn[        XS9n[        R                  " 5       n [        R                  " 5       U-
  nUb  XQ:  a  [        [        U 5      5      e UR	                  U(       a  [        X!U-
  5      OUS9    Uv    UR                  5         g ! [         a6    [        R                  SU  S[        R                  " 5       U-
  S S35         OJ[         a>  nS[        U5      ;   a%  [        R                  SU 5        [        XS9n S nAM   S nAOS nAff = fM  ! [         a.     [        U 5      R                  5          g ! [         a      g f = ff = f!  UR                  5         f ! [         a.     [        U 5      R                  5          f ! [         a      f f = ff = f= f7f)	Nr   r   z!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   default_intervallock
start_timeelapsed_timer   s          r   weak_file_lockr     s    
 I8DJ
yy{Z/<#:#i.))	LL ,.DE 0  2 	
	LLN%  	KK3I;k$))+XbJbcfIggpq # 	)SV3f $IH 4	 8  	Y&&( 		LLN 	Y&&( 	s   AF,$B =F,?E D  F,=DF,	D.DF,DF, 
E+EF,
EEF,EEF,F)E.-F).
F&9FF)
F"	F&F)!F"	"F&&F))F,
time_stamp	time_zonec                 <   U (       d  g[        U [        5      (       a  U $ [        U [        5      (       Ga   U R                  S5      (       a  SU ;  a	  U SS S-   n O3U SS R	                  S5      u  p#USS R                  SS5      nU SU S3n [        R                  " U S5      R                  [        R                  " S	5      S
9nUS	:w  a%  UR                  [        R                  " U5      5      nU$ / SQnU H<  n [        R                  " U U5      R                  [        R                  " U5      S
9s  $    [        SU  S35      e[        U [        5      (       aM   [        R                  " U [        R                  " S	5      S9R                  [        R                  " U5      5      $ [        S[!        U 5       S35      e! [         a     M  f = f! [         a  n[        SU  S35      UeSnAff = f! [        [        4 a  n[        SU  S35      UeSnAff = f)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ZrA   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.)r3   r   r4   r   r   ljustr   rI   zoneinfoZoneInfo
astimezoner   r]   fromtimestampr   	TypeErrortype)r   r   basefractiondtformatsfmtr   s           r   convert_timestampr  2  sT     *h''*c""*	""3''j(!+CR:!=J &0_%:%:3%?ND'|11!S9H$(68*A!6J&&z'>@@G2:2C2CE2J AH AL  %x'8'8'CDB	 #C!'00& !!(0A0A)0L!MN # !5j\CE E 
J	$	$	))x00799C%%i0:22  j!1 22TU
 	
1 & ! !  	  -b c 	 G$ 	":,.`a	sa   B<G 4	G >7G5G 8G AG6 
GG GG 
G3G..G36HHHmedia_file_pathc                 $   SSK nSSKn[        R                  R	                  U 5      n [        R                  R                  U 5      (       d  [        SU  35      e[        R                  R                  U 5      (       d  [        SU  35      eUR                  U 5      u  p4U(       d  [        SU  35      e[        U S5       nUR                  5       nUR                  U5      R                  S5      nSSS5        SU S	W 3$ ! , (       d  f       N= f)
a  
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: zFile is not a valid format: r   r   zdata:z;base64,)base64	mimetypesr"   rG   
expanduserr   FileNotFoundErrorisfiler   
guess_typer   r   	b64encodedecode)r  r  r  	mime_type_
media_file
image_database64_datas           r   encode_media_to_base64r     s      gg((9O77>>/**"88I JKK77>>/**//@ABB ''8LI77HIJJ 
ot	$
__&
&&z299'B 
%
 9+Xk]33 
%	$s    1D
D)Tr+   )NF)zAsia/Shanghai):
contextlibr   r"   rC   r   r  r   pathlibr   typingr   r   r   r   filelockr	   r
   r   r   modelscope.hub.constantsr   r   r   r   r   r   r   modelscope.hub.errorsr   modelscope.utils.loggerr   r   r   r)   r/   r4   r;   rM   r]   re   rn   rq   rz   r   r   r   boolr   r   r   floatr   r   r   contextmanagerr   r  r    r   r   <module>r,     s     	 
     3 3 B B= = = 5 .	 
.c49n 5 *!c !c !  K# K# K#HSM #	7	#T 0 9=*/	%#&%"&s)% )1% 59	%P	 
< 
<3 
<4U38_-. c s $5  /3(eCI. ($UO( ",d":;( (X (7K
%S((:"; K
!$K
;CH;MK
\%4C %4C %4r   