22import json
33import os
44import sys
5+ from datetime import datetime
56
67import requests
78from dotenv import find_dotenv , load_dotenv
89from toolsy .logger import init_colored_logger
910
11+ from agents .matmaster_agent .utils .job_utils import mapping_status
1012from scripts .constant import FILE_TOKEN_API , JOB_DETAIL_API
1113
1214load_dotenv (find_dotenv ())
1315
1416logger = init_colored_logger (__name__ )
1517
1618
17- def download_file (url , output_path ):
18- """下载文件并显示进度"""
19- response = requests .get (url , stream = True )
20- response .raise_for_status ()
19+ def get_duration (create_time , update_time ):
20+ """
21+ 计算两个时间戳之间的时间差,格式化为时-分-秒
2122
23+ Args:
24+ create_time (str): 创建时间,ISO 8601格式
25+ update_time (str): 更新时间,ISO 8601格式
26+
27+ Returns:
28+ str: 时间差,格式为"时-分-秒"
29+ """
30+ # 解析时间字符串为datetime对象
31+ create_dt = datetime .fromisoformat (create_time )
32+ update_dt = datetime .fromisoformat (update_time )
33+
34+ # 计算时间差
35+ time_diff = update_dt - create_dt
36+
37+ # 提取总秒数
38+ total_seconds = int (time_diff .total_seconds ())
39+
40+ # 计算小时、分钟、秒
41+ hours = total_seconds // 3600
42+ minutes = (total_seconds % 3600 ) // 60
43+ seconds = total_seconds % 60
44+
45+ # 格式化为时-分-秒
46+ return f"{ hours :02d} :{ minutes :02d} :{ seconds :02d} "
47+
48+
49+ def download_file (response , output_path ):
2250 total_size = int (response .headers .get ('content-length' , 0 ))
2351 downloaded_size = 0
2452
@@ -31,15 +59,7 @@ def download_file(url, output_path):
3159 progress = (downloaded_size / total_size ) * 100
3260 print (f"\r Download progress: { progress :.1f} %" , end = '' , flush = True )
3361
34-
35- def check_url_status (url ):
36- """检查URL的HTTP状态码"""
37- try :
38- response = requests .head (url , timeout = 10 ) # 使用HEAD方法,只获取头部信息
39- return response .status_code
40- except requests .exceptions .RequestException as e :
41- print (f"Warning: Failed to check URL status: { e } " )
42- return None
62+ print ()
4363
4464
4565def main ():
@@ -59,34 +79,40 @@ def main():
5979 os .remove (args .output )
6080
6181 # 调用API获取job信息
62- logger .info (f"Fetching job information for ID: { args .job_id } " )
82+ logger .info (f"Job ID: { args .job_id } " )
6383
6484 try :
6585 response = requests .get (
6686 f"{ JOB_DETAIL_API } /{ args .job_id } ?accessKey={ os .getenv ('MATERIALS_ACCESS_KEY' )} "
6787 )
6888 response .raise_for_status ()
69- data = response .json ()
89+ job_info = response .json ()
7090 except requests .exceptions .RequestException as e :
7191 logger .error (f"Error: Failed to fetch data from API: { e } " )
7292 sys .exit (1 )
7393 except json .JSONDecodeError as e :
7494 logger .error (f"Error: Failed to parse JSON response: { e } " )
7595 sys .exit (1 )
7696
77- logger .info (f"\n { json .dumps (data , indent = 2 , ensure_ascii = False )} " )
97+ logger .debug (f"\n { json .dumps (job_info , indent = 2 , ensure_ascii = False )} " )
7898
99+ create_time = job_info ['data' ]['createTime' ]
100+ update_time = job_info ['data' ]['updateTime' ]
101+ duration = get_duration (create_time , update_time )
102+ job_status = mapping_status (job_info ['data' ]['status' ])
103+ job_name = job_info ['data' ]['jobName' ]
104+ logger .info (f"{ job_name } [{ job_status } ] -- { duration } " )
79105 # 解析JSON获取resultUrl
80- if data .get ('code' ) == 0 :
81- result_url = data .get ('data' , {}).get ('resultUrl' , '' )
82- elif data .get ('code' ) == 6020 :
83- logger .error (f"API returned error code: { data .get ('code' )} " )
106+ if job_info .get ('code' ) == 0 :
107+ result_url = job_info .get ('data' , {}).get ('resultUrl' , '' )
108+ elif job_info .get ('code' ) == 6020 :
109+ logger .error (f"API returned error code: { job_info .get ('code' )} " )
84110 sys .exit (- 1 )
85111 else :
86112 result_url = ''
87- logger .error (f"API returned error code: { data .get ('code' )} " )
113+ logger .error (f"API returned error code: { job_info .get ('code' )} " )
88114
89- # 获取log文件的token(可选操作)
115+ # 获取log文件的token
90116 token_data = {'filePath' : 'log' , 'jobId' : args .job_id }
91117
92118 try :
@@ -99,8 +125,6 @@ def main():
99125 except requests .exceptions .RequestException :
100126 pass # 忽略token获取错误,因为这不是主要功能
101127
102- logger .info (f"\n { json .dumps (token_data , indent = 2 )} " )
103-
104128 log_token = token_data .get ('data' , {}).get ('token' , '' )
105129 log_path = token_data .get ('data' , {}).get ('path' , '' )
106130 log_host = token_data .get ('data' , {}).get ('host' , '' )
@@ -109,29 +133,37 @@ def main():
109133 if log_host and log_path and log_token :
110134 log_url = f"{ log_host } /api/download/{ log_path } ?token={ log_token } "
111135
112- # 检查log URL的状态
113- status_code = check_url_status (log_url )
136+ log_response = requests .get (log_url , timeout = 10 )
137+ status_code = log_response .status_code
138+
114139 if status_code :
115140 if status_code == 400 :
116141 logger .error ('Warning: Log URL returned 400 Bad Request' )
117142 elif status_code == 200 :
118- logger .info (f"\n log_url: { log_url } " )
143+ download_file (log_response , 'log' )
144+ logger .info ('Download `log` completed successfully' )
119145 else :
120146 logger .error (f"Log URL returned status code: { status_code } " )
121147 else :
122148 print ('\n Incomplete log information - cannot construct log URL' )
123149
150+ if job_status in ['Running' , 'Finished' ]:
151+ return
152+
124153 # 下载结果文件
125154 if result_url and result_url != 'null' :
126- print (f"\n Found resultUrl: { result_url } " )
127- print (f"\n Downloading to: { args .output } " )
155+ logger .info (f"Job Result Downloading to: { args .output } " )
128156
129157 try :
130- download_file (result_url , args .output )
158+ result_response = requests .get (result_url , stream = True )
159+ result_response .raise_for_status ()
160+ download_file (result_response , args .output )
131161
132162 if os .path .exists (args .output ) and os .path .getsize (args .output ) > 0 :
133163 file_size = os .path .getsize (args .output )
134- print (f"Download completed successfully! File size: { file_size } bytes" )
164+ logger .info (
165+ f"Download completed successfully! File size: { file_size } bytes"
166+ )
135167 else :
136168 print ("Error: Download failed - file is empty or doesn't exist" )
137169 sys .exit (1 )
0 commit comments