1010 GITHUB_ARCHIVE_BASE ,
1111 GITHUB_RELEASE_API ,
1212 NIGHTLY_TAG ,
13+ PRERELEASE_TAG_REGEX ,
1314)
1415from astrbot .core .utils .astrbot_path import get_astrbot_path
1516from astrbot .core .utils .io import download_file
1617
1718from .zip_updator import (
18- PRERELEASE_TAG_REGEX ,
19+ FetchReleaseError ,
1920 ReleaseInfo ,
2021 RepoZipUpdator ,
2122)
@@ -169,7 +170,7 @@ async def get_releases_with_nightly(self) -> list[dict]:
169170 nightly_release_url = f"{ self .GITHUB_RELEASE_API } /tags/{ self .NIGHTLY_TAG } "
170171 try :
171172 nightly_releases = await self .fetch_release_info (nightly_release_url )
172- except Exception as e :
173+ except ( FetchReleaseError , TimeoutError , OSError ) as e :
173174 logger .warning (
174175 "获取 nightly 发布信息失败,跳过 nightly。"
175176 f"url={ nightly_release_url } , error_type={ type (e ).__name__ } , detail={ e } " ,
@@ -184,7 +185,29 @@ async def get_releases_with_nightly(self) -> list[dict]:
184185 releases .insert (0 , nightly_release )
185186 return releases
186187
187- def _parse_update_target (
188+ async def _resolve_nightly_target (self ) -> tuple [str , str ]:
189+ nightly_release_url = f"{ self .GITHUB_RELEASE_API } /tags/{ self .NIGHTLY_TAG } "
190+ fallback = (
191+ self .NIGHTLY_TAG ,
192+ f"{ self .GITHUB_ARCHIVE_BASE } /refs/tags/{ self .NIGHTLY_TAG } .zip" ,
193+ )
194+ try :
195+ nightly_releases = await self .fetch_release_info (nightly_release_url )
196+ except (FetchReleaseError , TimeoutError , OSError ) as e :
197+ logger .warning (
198+ "获取 nightly 发布信息失败,使用归档地址。"
199+ f"url={ nightly_release_url } , error_type={ type (e ).__name__ } , detail={ e } " ,
200+ )
201+ return fallback
202+
203+ if not nightly_releases :
204+ return fallback
205+
206+ nightly_release = nightly_releases [0 ]
207+ zip_url = nightly_release .get ("zipball_url" , fallback [1 ])
208+ return self .NIGHTLY_TAG , zip_url
209+
210+ async def _resolve_update_target (
188211 self ,
189212 latest : bool ,
190213 version : str | None ,
@@ -198,31 +221,6 @@ def _parse_update_target(
198221 )
199222
200223 if latest :
201- return "latest" , ""
202-
203- if not version_str :
204- raise AstrBotUpdateError ("invalid_target" , "未指定有效的更新目标。" )
205-
206- if version_str .lower () == self .NIGHTLY_TAG :
207- return "nightly" , self .NIGHTLY_TAG
208-
209- if version_str .startswith ("v" ):
210- return "tag" , version_str
211-
212- if len (version_str ) != 40 :
213- raise AstrBotUpdateError (
214- "invalid_target" , "commit hash 长度不正确,应为 40"
215- )
216- return "commit" , version_str
217-
218- async def _resolve_update_target (
219- self ,
220- latest : bool ,
221- version : str | None ,
222- ) -> tuple [str , str ]:
223- kind , value = self ._parse_update_target (latest , version )
224-
225- if kind == "latest" :
226224 releases = await self .get_releases ()
227225 latest_release = next (
228226 (
@@ -240,38 +238,34 @@ async def _resolve_update_target(
240238 raise AstrBotUpdateError ("up_to_date" , "当前已经是最新版本。" )
241239 return latest_version , latest_release ["zipball_url" ]
242240
243- if kind == "nightly" :
244- releases = await self .get_releases_with_nightly ()
245- nightly_release = next (
246- (
247- item
248- for item in releases
249- if item .get ("tag_name" , "" ).lower () == self .NIGHTLY_TAG
250- ),
251- None ,
252- )
253- if nightly_release is not None :
254- return self .NIGHTLY_TAG , nightly_release ["zipball_url" ]
255- return self .NIGHTLY_TAG , (
256- f"{ self .GITHUB_ARCHIVE_BASE } /refs/tags/{ self .NIGHTLY_TAG } .zip"
257- )
241+ if not version_str :
242+ raise AstrBotUpdateError ("invalid_target" , "未指定有效的更新目标。" )
243+
244+ if version_str .lower () == self .NIGHTLY_TAG :
245+ return await self ._resolve_nightly_target ()
258246
259- if kind == "tag" :
247+ if version_str . startswith ( "v" ) :
260248 releases = await self .get_releases ()
261249 for data in releases :
262- if data .get ("tag_name" ) == value :
263- return value , data ["zipball_url" ]
250+ if data .get ("tag_name" ) == version_str :
251+ return version_str , data ["zipball_url" ]
264252 raise AstrBotUpdateError (
265253 "file_not_found" ,
266- f"未找到版本号为 { value } 的更新文件。" ,
254+ f"未找到版本号为 { version_str } 的更新文件。" ,
267255 )
268256
269- return value , f"{ self .GITHUB_ARCHIVE_BASE } /{ value } .zip"
257+ if len (version_str ) != 40 :
258+ raise AstrBotUpdateError (
259+ "invalid_target" ,
260+ "commit hash 长度不正确,应为 40" ,
261+ )
262+ return version_str , f"{ self .GITHUB_ARCHIVE_BASE } /{ version_str } .zip"
270263
271264 async def update (self , reboot = False , latest = True , version = None , proxy = "" ) -> None :
272265 if os .environ .get ("ASTRBOT_CLI" ) or os .environ .get ("ASTRBOT_LAUNCHER" ):
273- raise Exception (
274- "Error: You are running AstrBot via CLI, please use `pip` or `uv tool upgrade` to update AstrBot."
266+ raise AstrBotUpdateError (
267+ "invalid_environment" ,
268+ "Error: You are running AstrBot via CLI, please use `pip` or `uv tool upgrade` to update AstrBot." ,
275269 ) # 避免版本管理混乱
276270
277271 try :
0 commit comments