|
| 1 | +import tkinter as tk |
| 2 | +import webbrowser |
| 3 | +from tkinter import messagebox |
| 4 | + |
| 5 | +import requests |
| 6 | + |
| 7 | +from MoocMain.log import Logger |
| 8 | + |
| 9 | +logger = Logger(__name__).get_log() |
| 10 | + |
| 11 | +# 配置 |
| 12 | +REPO = "11273/mooc-work-answer" |
| 13 | + |
| 14 | + |
| 15 | +def version_greater_than(v1, v2): |
| 16 | + # 去除版本号中的前缀 'v' |
| 17 | + v1_parts = map(int, v1.lstrip('v').split('.')) |
| 18 | + v2_parts = map(int, v2.lstrip('v').split('.')) |
| 19 | + |
| 20 | + # 使用 zip_longest 以确保处理不同长度的版本号 |
| 21 | + from itertools import zip_longest |
| 22 | + for v1_part, v2_part in zip_longest(v1_parts, v2_parts, fillvalue=0): |
| 23 | + if v1_part > v2_part: |
| 24 | + return True |
| 25 | + elif v1_part < v2_part: |
| 26 | + return False |
| 27 | + |
| 28 | + return False |
| 29 | + |
| 30 | + |
| 31 | +def get_latest_release(repo): |
| 32 | + """从 GitHub API 获取最新发布信息。""" |
| 33 | + url = f'https://api.github.com/repos/{repo}/releases/latest' |
| 34 | + try: |
| 35 | + response = requests.get(url) |
| 36 | + response.raise_for_status() |
| 37 | + return response.json() |
| 38 | + except requests.RequestException as e: |
| 39 | + logger.warn(f"获取发布信息时出错: {e}") |
| 40 | + return None |
| 41 | + |
| 42 | + |
| 43 | +def open_download_url(asset_url): |
| 44 | + """打开默认浏览器以下载新版本。""" |
| 45 | + webbrowser.open(asset_url) |
| 46 | + logger.debug(f"浏览器已打开: {asset_url}。") |
| 47 | + |
| 48 | + |
| 49 | +def show_update_prompt(asset_url): |
| 50 | + """显示更新提示弹窗。""" |
| 51 | + root = tk.Tk() |
| 52 | + root.withdraw() # 隐藏主窗口 |
| 53 | + |
| 54 | + if messagebox.askyesno("更新可用", "检测到新版本,是否下载?"): |
| 55 | + open_download_url(asset_url) |
| 56 | + |
| 57 | + root.destroy() |
| 58 | + |
| 59 | + |
| 60 | +def check_for_updates(app_version): |
| 61 | + if app_version == 'dev': |
| 62 | + logger.debug("开发环境,不检查更新。") |
| 63 | + return |
| 64 | + |
| 65 | + logger.info("检查更新中,请稍后...") |
| 66 | + release_info = get_latest_release(REPO) |
| 67 | + if not release_info: |
| 68 | + return |
| 69 | + |
| 70 | + latest_version = release_info['tag_name'] |
| 71 | + asset_html_url = release_info['html_url'] |
| 72 | + |
| 73 | + if version_greater_than(latest_version, app_version): |
| 74 | + # if 'assets' in release_info and release_info['assets']: |
| 75 | + # asset = release_info['assets'][0] |
| 76 | + # asset_browser_download_url = asset['browser_download_url'] |
| 77 | + # asset_name = asset['name'] |
| 78 | + # |
| 79 | + # logger.info(f"最新版本: {latest_version}, 文件: {asset_name}, 手动前往下载: {asset_browser_download_url}") |
| 80 | + # show_update_prompt(asset_browser_download_url) |
| 81 | + # else: |
| 82 | + # logger.warn("最新发布中没有找到资源。") |
| 83 | + # 不直接下载文件,使用进入页面查看新版更新信息 |
| 84 | + show_update_prompt(asset_html_url) |
| 85 | + else: |
| 86 | + logger.info("当前已是最新版本。") |
0 commit comments