# Appstore UI

这是一个基于 Qt 的图形化前端，复用仓库里现有的 `appstore` 后端能力：

- 用标签页分成“登录与包 / 商店信息 / 素材与版本 / 包与系统适配”，避免所有表单挤在一屏
- 账号密码登录
- 直接提取微信登录二维码并扫码登录，后台自动保存 session
- 选择单个包或整目录
- 文件和目录选择使用 Qt 中文子窗口，不再弹系统外部 chooser 壳子
- 解析 `deb / uab / layer` 包元数据并自动回填应用名、简介、详情、官网
- 自动检测图标/截图，必要时从包里尽力提取图标
- 截图预处理与基本校验
- 自动截图
- 同步能力缓存并自动勾选系统线
- 登录后从商店真实接口加载应用分类列表
- 地区按网页实际选项提供“`中国（包含港澳台）` / `其他地区`”
- 选择“`其他地区`”时自动生成英文文案并写入 `en_US`
- 系统版本按每个包分别配置，而不是全局统一勾选
- 记住最近使用过的分类、输出目录和资源目录
- 新应用首提
- 已有应用更新，并允许修改应用名、分类、官网、简介、详情
- 支持多个不同应用的包一起做批量已有应用更新
- 批量分组里支持逐组检测素材、自动截图、英文文案自动生成，以及“其他地区”对应的中英文多输入框
- 批量分组里如果唯一匹配到现有商店应用，会自动回填商店现有的分类、地区、中文文案和英文文案；切换目标应用时也会刷新为对应资料

## 运行

推荐使用 Qt6：

```bash
git clone https://github.com/guanzi008/appstore.git
cd appstore
python3 -m venv .venv
./.venv/bin/python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r appstore/requirements.txt PySide6
./.venv/bin/python -m ui.main
```

也兼容 `PyQt6` 或 `PyQt5`，只要系统里存在其中一个即可。

## 说明

- “微信扫码登录”会沿真实网页登录链路自动提取微信二维码，只展示二维码本身；扫码并在手机上确认后，会自动把 session 保存到 `appstore/cache/session-state/`。
- 应用启动时会优先检查上次缓存的 session 是否仍然有效；有效则直接恢复登录态并刷新校验时间，失效才需要重新登录。
- 我对过当前商店接口返回结构，应用详情里的多语言字段实际是 `app_lan_infos`，默认语言是 `default_lan=zh_CN`；当前批量分组页已经按这个结构拆成中文/英文两组输入。
- 分类会在登录后通过 `/store-dev-app/category` 实时加载；如果拉取失败，仍可回退到手动输入分类 ID。
- 地区和网页一致，当前固定为“`中国（包含港澳台）`”与“`其他地区`”两个选项，可多选。根据线上已有 `1,2` 区域应用的详情，当前会生成 `zh_CN + en_US` 两份文案。
- 新应用首提至少需要 1 个图标和 3 张有效截图。
- 已有应用更新默认也允许替换图标/截图；如果只想传包、基础信息和更新说明，可以取消“替换图标/截图”，这时不会再强制做素材预处理。
- 当一次选择多个不同应用或不同版本的包时，界面会自动进入“批量已有应用更新”模式：按 `包名 + 版本` 分组逐个提交，只更新包、更新说明和系统适配，不会统一替换图标/截图，也不会批量修改应用基础信息。
- 批量已有应用更新要求每个分组在商店里都能唯一匹配到一个现有应用；如果某个包名查不到应用，或者同包名匹配到多个应用，该分组会在最终报告里标记失败，但不会阻塞其他分组继续提交。
- 自动截图页支持填写提权密码、启动命令、desktop 文件、窗口标题、窗口类名。失败时会额外附带安装日志和 stderr 摘要，便于判断是提权安装、降级安装、Qt/xcb 运行时还是窗口匹配问题。
- 系统线默认根据 capability cache、包类型和架构逐包自动勾选，但仍建议人工确认。
