Compare commits

..
1 Commits
Author SHA1 Message Date
RoyirinRosmontis 863d6ccc57 新增功能:
- 检查更新改为基于 Gitea 仓库 releases API:版本取 release 的 tag_name(v0.1.0 式),下载取 exe 附件链接;语义化版本比较(v0.2.0 > v0.1.0)
- config.json 移除 update_url(latest_version.json 不再使用),默认检查地址为仓库 API;CDN 上的 latest_version.json 可下线
2026-08-23 14:45:54 +08:00
+29 -10
View File
@@ -590,6 +590,24 @@ def _set_local_port(port):
_settings_save(data)
log(f"代理转发端口已保存: {port}(下次开启代理生效)")
def _ver_tuple(v):
"""版本号转数字元组:'v0.1.0' -> (0, 1, 0),无法解析的段按 0 处理。"""
parts = []
for p in str(v).strip().lstrip("vV").split("."):
try:
parts.append(int(p))
except ValueError:
parts.append(0)
return tuple(parts)
def _version_newer(latest, current):
"""latest 是否比 current 新(逐段数字比较,位数不同补 0)。"""
lt, ct = _ver_tuple(latest), _ver_tuple(current)
n = max(len(lt), len(ct))
lt += (0,) * (n - len(lt))
ct += (0,) * (n - len(ct))
return lt > ct
# 以下模块级取值需在 _data_path 定义之后执行
VERSION = _config_val("version", "999908162319")
_TLS_LOCAL_PORT = _port_val() # 本地转发器监听端口(设置 > 内置 config > 1080)
@@ -2019,10 +2037,11 @@ class MainWindow(QWidget):
if domain == "???":
log("更新检查: 未配置节点(nodes.json 域名为空),跳过")
return
# 更新链接优先取 config.json 的 update_url,缺失时回退到域名拼接
url = _config_val("update_url", "")
# 基于 Gitea 仓库 releases API 检查更新;config.json 无 update_url 时用默认地址
url = str(_config_val("update_url", "") or "").strip()
if not url:
url = f"https://{domain}/latest_version.json"
url = ("https://git.bu4.ren/api/v1/repos/RoyirinRosmontis/"
"Private-Proxy/releases/latest")
log("正在检查更新...")
# 显式走本地转发器隧道,不依赖系统代理状态:默认 opener 读注册表代理设置
# (异常退出残留 127.0.0.1 代理 -> 连接被拒),不识别 PAC 的 AutoConfigURL,
@@ -2037,12 +2056,12 @@ class MainWindow(QWidget):
finally:
_release_forwarder(started_here)
info = json.loads(data)
log("客户端认证成功")
self._latest_version = info.get("latest_version", "")
self._download_url = info.get("download_url", "")
log(f"当前版本: {VERSION},最新版本: {self._latest_version}")
if VERSION.startswith("9999"):
log("您当前正在使用 Lite 版")
# 基于 Gitea 仓库 releases API:版本取 tag_name,下载取 exe 附件链接
self._latest_version = str(info.get("tag_name") or "")
assets = info.get("assets") or []
self._download_url = (assets[0].get("browser_download_url") or ""
if assets else "")
log(f"当前版本: {VERSION},最新版本: {self._latest_version or '未知'}")
except Exception as e:
log(f"更新检查失败: {e}")
self._latest_version = ""
@@ -2053,7 +2072,7 @@ class MainWindow(QWidget):
def _on_update_done(self):
"""更新检查完成后恢复按钮;发现新版本时弹窗询问是否下载。"""
self.btn_toggle.setEnabled(True)
if self._latest_version and self._latest_version > VERSION:
if self._latest_version and _version_newer(self._latest_version, VERSION):
reply = QMessageBox.question(
self, "发现新版本",
f"当前版本: {VERSION}\n最新版本: {self._latest_version}\n\n是否下载更新?",