gcli2api / src /panel /version.py
a3216's picture
sync: github -> hf space
c50496f
"""
版本信息路由模块 - 处理 /version/* 相关的HTTP请求
"""
import os
from fastapi import APIRouter
from fastapi.responses import JSONResponse
from log import log
# 创建路由器
router = APIRouter(prefix="/version", tags=["version"])
@router.get("/info")
async def get_version_info(check_update: bool = False):
"""
获取当前版本信息 - 从version.txt读取
可选参数 check_update: 是否检查GitHub上的最新版本
"""
try:
# 获取项目根目录
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
version_file = os.path.join(project_root, "version.txt")
# 读取version.txt
if not os.path.exists(version_file):
return JSONResponse({
"success": False,
"error": "version.txt文件不存在"
})
version_data = {}
with open(version_file, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if '=' in line:
key, value = line.split('=', 1)
version_data[key] = value
# 检查必要字段
if 'short_hash' not in version_data:
return JSONResponse({
"success": False,
"error": "version.txt格式错误"
})
response_data = {
"success": True,
"version": version_data.get('short_hash', 'unknown'),
"full_hash": version_data.get('full_hash', ''),
"message": version_data.get('message', ''),
"date": version_data.get('date', '')
}
# 如果需要检查更新
if check_update:
try:
from src.httpx_client import get_async
# 直接获取GitHub上的version.txt文件
github_version_url = "https://raw.githubusercontent.com/su-kaka/gcli2api/refs/heads/master/version.txt"
# 使用统一的httpx客户端
resp = await get_async(github_version_url, timeout=10.0)
if resp.status_code == 200:
# 解析远程version.txt
remote_version_data = {}
for line in resp.text.strip().split('\n'):
line = line.strip()
if '=' in line:
key, value = line.split('=', 1)
remote_version_data[key] = value
latest_hash = remote_version_data.get('full_hash', '')
latest_short_hash = remote_version_data.get('short_hash', '')
current_hash = version_data.get('full_hash', '')
has_update = (current_hash != latest_hash) if current_hash and latest_hash else None
response_data['check_update'] = True
response_data['has_update'] = has_update
response_data['latest_version'] = latest_short_hash
response_data['latest_hash'] = latest_hash
response_data['latest_message'] = remote_version_data.get('message', '')
response_data['latest_date'] = remote_version_data.get('date', '')
else:
# GitHub获取失败,但不影响基本版本信息
response_data['check_update'] = False
response_data['update_error'] = f"GitHub返回错误: {resp.status_code}"
except Exception as e:
log.debug(f"检查更新失败: {e}")
response_data['check_update'] = False
response_data['update_error'] = str(e)
return JSONResponse(response_data)
except Exception as e:
log.error(f"获取版本信息失败: {e}")
return JSONResponse({
"success": False,
"error": str(e)
})