
    9i5                        S r 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rSSKJrJ	r	J
r
  SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJrJr  SS
KJrJrJrJr  SSKJr  SSK J!r!   " S S\"5      r#S r$S,S jr%S r&S r'S r(S r)S r*S r+S r,S r-S r.S r/S r0\SS4S\1S\2S\34S  jjr4S! r5S"\\3\\3   4   4S# jr6S-S$ jr7S% r8S& r9S'\\3\!\:\4   S(\14S) jr;   S.S'\\3\!\:\4   S*\\1   S\\3   S\\2   S(\"4
S+ jjr<g)/uj   
本文件实现了常用的工具函数

Authors: xiangyiqing(xiangyiqing@baidu.com)
Date:    2023/07/24
    N)datetimetimezone	timedelta)log)FileIntegrityError)DEFAULT_MAX_WORKERSwrapstqdm)ThreadPoolExecutoras_completed)ListUnionBinaryIOOptional)VERSION)Pathc                   $    \ rS rSrSrS rS rSrg)Dict"   z
dict classc                 j    U R                  US 5      n[        U[        5      (       a  [        U5      $ U$ N)get
isinstancedictr   selfkeyvalues      W/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/aistudio_sdk/utils/util.py__getattr__Dict.__getattr__$   s-    d#(55tE{@5@    c                     X U'   g r    r   s      r!   __setattr__Dict.__setattr__(   s	    S	r$   r&   N)__name__
__module____qualname____firstlineno____doc__r"   r'   __static_attributes__r&   r$   r!   r   r   "   s    Ar$   r   c                 F    [        U [        5      (       a  [        U 5      $ U $ )zL
Params
    :resp: dict, response from AIStudio
Rerurns
    AIStudio object
)r   r   r   )resps    r!   convert_to_dict_objectr1   ,   s      $DzKr$   c                     U UUUS.$ )u[  
构造错误响应信息。

Params:
    sdk_code (str): SDK错误码，标识错误类型。
    msg (str): 错误描述信息。
    biz_code (str, optional): 业务层面的错误码，透传自上游接口。
    log_id (str, optional): 与错误相关的日志ID，透传自上游接口。

Returns:
    dict: 格式化好的错误信息。
)
error_code	error_msgbiz_codelog_idr&   )sdk_codemsgr5   r6   s       r!   err_respr9   9   s     	 r$   c                 f    [         R                  " SSU [         R                  S9n [        U 5      nU$ )u   检测host合法性z
^https?:// )flags)resub
IGNORECASEis_valid_domain)hostresults     r!   is_valid_hostrC   N   s-     66-T?DT"F Mr$   c                     g)u   检测域名合法性Tr&   )domains    r!   r@   r@   Y   s    r$   c                    [         R                  " 5       n[        U S5       n UR                  S5      nU(       d  OUR	                  U5        M,  SSS5        UR                  5       $ ! , (       d  f       UR                  5       $ = f)u   将文件计算为sha256值rb   Nhashlibsha256openreadupdate	hexdigest)	file_pathsha256_hashfiledatas       r!   calculate_sha256rT   `   st    .."K	i	$99U#Dt$	  
   "" 
	   ""s   .A((
Bc                  t    [        [        SS95      n [        R                  " U 5      nUR	                  SS9nU$ )uH   
# 生成 ISO 8601日期时间格式
# 例如"2023-09-12T11:29:45.703Z"
   )hoursmilliseconds)timespec)r   r   r   now	isoformat)zonerZ   formatted_dates      r!   gen_ISO_format_datestrr^   n   s7     IA&'D
,,t
C]]N];Nr$   c                 6   [         R                  " 5       n [        U S5       n UR                  S5      nU(       d  OUR	                  U5        M,  SSS5        UR                  5       nU$ ! , (       d  f       N = f! [
         a    [        SU  S35         gf = f)u   将文件计算为md5值rG   i   Nz
The file 'z' does not exist.)rJ   md5rL   rM   rN   FileNotFoundErrorprintrO   )rP   md5_hashrR   rS   md5_hexs        r!   gen_MD5re   {   s    {{}H
)T"dyy%	  #   "GN #"  
9+%678s.   A< .A+A< +
A95A< 9A< <BBc                 r    U R                  S5      n[        R                  " U5      R                  S5      nU$ )u   将字符串计算为base64utf-8)encodebase64	b64encodedecode)original_string
bytes_database64_encodeds      r!   
gen_base64ro      s5     !''0J%%j188ANr$   c                    SU  SU 3n[         R                  " SSSS9 nUR                  U5        UR                  n[        R
                  " U5        SSS5         [        WS5       n[        R                  " UR                  5       5      R                  S	5      nSSS5        W[        R                  R                  U5      (       a  [        R                  " U5        $ $ ! , (       d  f       N= f! , (       d  f       N\= f! [        R                  R                  W5      (       a  [        R                  " U5        f f = f)
u?   生成指定内容的文件并进行base64编码字符串返回z6version https://git-lfs.github.com/spec/v1
oid sha256:z
size Fwz.txt)deletemodesuffixNrG   rg   )tempfileNamedTemporaryFilewritenamer   debugrL   ri   rj   rM   rk   ospathexistsremove)rK   sizecontenttmptmp_pathfencodeds          r!   $create_sha256_file_and_encode_base64r      s    GxwW[V\]G		$	$EF	Ks		'88		( 
L
 (D!Q&&qvvx077@G "77>>(##IIh $ 
L	K "! 77>>(##IIh $s/   4C!D (4C2	D !
C/2
D <D =E c                     [        U S5       nUR                  5       n[        R                  " U5      nSSS5        WR	                  S5      $ ! , (       d  f       N= f)u'   读取文件内容并进行Base64编码rG   Nrg   )rL   rM   ri   rj   rk   )filenamerR   contentsencoded_contentss       r!   file_to_base64r      sK    	h	99;!++H5 
 ""7++ 
	s   'A
Ac           	      ~   [         R                  " US[         R                  5      n[        R                  " U 5       Hm  u  p4nUR                  U S5      nU HO  nUR                  [        R                  R                  X75      [        R                  R                  Xg5      5        MQ     Mo     UR                  5         g)u   
压缩指定文件夹
:param dirpath: 目标文件夹路径
:param out_full_name: 压缩文件保存路径 xxxx.zip
:return: 无
rq   r;   N)
zipfileZipFileZIP_DEFLATEDrz   walkreplacerw   r{   joinclose)dirpathout_full_namezip_objr{   dirnames	filenamesfpathr   s           r!   zip_dirr      s     oomS'2F2FGG%'WWW%5!	Wb)!HMM"'',,t6U8UV "	 &6 MMOr$   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)z
hash
rH   rG   NrI   )rP   BUFFER_SIZErQ   r   rS   s        r!   compute_hashr      s{     K.."K	i	!66+&Dt$	  
   "" 
	   ""s   .A**
Bc                     [        U 5      nX!:X  dF  [        R                  " U 5        SU < SU< SU< S3n[        R                  " U5        [        U5      e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

Raises:
    FileIntegrityError: If file_path hash is not expected.

zFile z6 integrity check failed, expected sha256 signature is z, actual is z3, the download may be incomplete, please try again.N)r   rz   r}   r   errorr   )rP   expected_sha256file_sha256r8   s       r!   file_integrity_validationr      sM     y)K)
		) 5 			# %% *r$   Fmax_workersdisable_tqdm	tqdm_descc                    ^ ^^ UU U4S jnU$ )aF  
A decorator to execute a function in a threaded manner using ThreadPoolExecutor.

Args:
    max_workers (int): The maximum number of threads to use.
    disable_tqdm (bool): disable progress bar.
    tqdm_desc (str): Desc of tqdm.

Returns:
    function: A wrapped function that executes with threading and a progress bar.


c                 8   >^  [        T 5      UU UU4S j5       nU$ )Nc           
        > / n[        SSS[        U 5      T=(       d    S[        U 5       S3T	S9 n[        TS9 nU  Vs0 s H  nUR                  " T
U/UQ70 UD6U_M     nn[	        U5       H3  nUR                  S5        UR                  UR                  5       5        M5     S S S 5        S S S 5        U$ s  snf ! , (       d  f       N= f! , (       d  f       U$ = f)	NT   r   zProcessing z items)
unit_scaleunit_divisorinitialtotaldescdisable)r      )r   lenr   submitr   rN   appendrB   )iterableargskwargsresultspbarexecutoritemfuturesfuturer   funcr   r   s            r!   wrapper3thread_executor.<locals>.decorator.<locals>.wrapper  s    G#!%h-"ICM?&&I( 'K@H %-$,D !dDTDVDdJ$,   #/w"7Av}}7 #8 A( N A@ ( Ns5   
CB= "B8"AB=&C8B==
C	C
Cr	   )r   r   r   r   r   s   ` r!   	decorator"thread_executor.<locals>.decorator   s     	t	 
	2 r$   r&   )r   r   r   r   s   ``` r!   thread_executorr      s    "< r$   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$ )u   
目录
win\   /r   .___)sysplatform
startswithrsplitrz   r{   r   r   )	directorymodel_idpartsmasked_directorys       r!   get_model_masked_directoryr      si     ||u%%  q)  a(ww||E!Hh.>.>sE.JK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 )u   
处理规则
N,)r   strlistsplitstripr   extend)r   outputssss       r!   convert_patternsr   -  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                     U(       a  SU 3nOS[         R                  " SSS9 3nSU[        [        5      S.nU (       a  UR	                  U 5        U$ )u   
填充header
ztoken AISTUDIO_ACCESS_TOKENr;   )defaultzapplication/json)zContent-TypeAuthorizationzSDK-Version)rz   getenvr   r   rN   )paramstokenauthheaderss       r!   header_fillr   C  sV     w		"92FGH*7|G
 vNr$   c                 <   [        U SSS9 nUR                  5       nSSS5        [        R                  " SW[        R                  [        R
                  -  5      nU(       a  UR                  S5      R                  5       $ [        S5      e! , (       d  f       Nv= f)u   
获取yaml
rrg   )encodingNz^---\s*(.*?)\s*---r   u+   未找到两个 '---' 分隔的 YAML 内容)	rL   rM   r=   searchDOTALL	MULTILINEgroupr   
ValueError)rP   r   r   matchs       r!   extract_yaml_blockr   U  ss     
iw	/1&&( 
0 II+Wbii",,6NOE{{1~##%%FGG 
0	/s   B
Bc                 J    [         R                  R                  U 5      nUS:H  $ )u   
判断文件名
z	README.md)rz   r{   basename)rP   	file_names     r!   is_readme_mdr   d  s#       +I##r$   file_path_or_objreturnc                    [        U [        [        45      (       a%  [        U 5      nUR                  5       R                  $ [        U [
        5      (       a  [        U 5      $ [        U [        R                  5      (       aS  U R                  5       nU R                  S[        R                  5        U R                  5       nU R                  U5        U$ [        S5      e)z

get size
r   zCUnsupported type: must be string, Path, bytes, or io.BufferedIOBase)r   r   r   statst_sizebytesr   ioBufferedIOBasetellseekrz   SEEK_END	TypeError)r   rP   current_positionr~   s       r!   get_file_sizer  l  s     "S$K00)*	~~'''	$e	,	,#$$	$b&7&7	8	8+002a-$$&./Q
 	
r$   buffer_size_mbc           
         SSK Jn  [        U 5      nUS:  aS  SnSn[        U [        [
        45      (       a.  [        U [
        5      (       a  U O
[        U 5      nUR                  nSU S3nUS-  S-  n[        R                  " 5       n	/ n
U" USS	S	S
UUS9n[        U [        [
        45      (       a  [        U S5       nUR                  U5      =n(       ax  U
R                  [        R                  " U5      R                  5       5        U	R                  U5        UR                  [        U5      5        UR                  U5      =n(       a  Mx  SSS5        U	R                  5       n	UnGOA[        U [        5      (       aO  U	R                  U 5        U	R                  5       n	U
R                  U	5        [        U 5      nUR                  U5        O[        U [         R"                  5      (       a  U R                  U5      =n(       ax  U
R                  [        R                  " U5      R                  5       5        U	R                  U5        UR                  [        U5      5        U R                  U5      =n(       a  Mx  U	R                  5       n	UnOUR%                  5         ['        S5      eUR%                  5         U U	UU[        U
5      U
S.$ ! , (       d  f       GN= f)z
calculate hash
r   r   i   @Fz
Large Filez[Validating Hash for ]r   TB)r   r   r   dynamic_ncolsunitr   r   rG   Nz5Input must be str, Path, bytes or a io.BufferedIOBase)r   	file_hash	file_size
chunk_size
chunk_numschunk_hash_list)	tqdm.autor   r  r   r   r   rx   rJ   rK   rL   rM   r   rO   rN   r   r   r   r   r   r   )r   r  r   r   r   r
  rx   r{   buffer_sizer	  r  progressr   
byte_chunkfinal_chunk_sizes                  r!   get_file_hashr    s    ./I%%&d44'1 $(( ((#-12B-C 99D+D63	 4'$.K IOH "S$K00"D)Q !{ 33*3&&w~~j'A'K'K'MN  ,J0 !"{ 33*3 *
 '')	&	$e	,	,)*'')	y)/0()	$b&7&7	8	8,11+>>j>""7>>*#=#G#G#IJZ(OOC
O, -11+>>j> '')	& 	CE 	E NN -&/** = *)s   =BK
K)NN)Nr;   )r   z[Calculating]T)=r-   ru   r   rz   r   r=   ri   rJ   r   r   r   r   aistudio_sdkr   aistudio_sdk.errorsr   aistudio_sdk.configr   	functoolsr
   r  r   concurrent.futuresr   r   typingr   r   r   r   aistudio_sdk.constant.versionr   pathlibr   r   r   r1   r9   rC   r@   rT   r^   re   ro   r   r   r   r   r   intboolr   r   r   r   r   r   r   r   r  r  r&   r$   r!   <module>r     sj    
 	 	 	   2 2   2 3   ? 2 2 1 4 
*#
* 0,"#&* (;).%)/ /"&/"/d
c49n 5 ,$H$
E#tUH*D$E 
# 
. %&.#'	ICuh67ISMI }I 4.	I
 
Ir$   