Add project metadata and docs
build-winui / winui (push) Has been cancelled

This commit is contained in:
QWQLwToo
2026-06-26 13:26:40 +08:00
parent e43a25ce71
commit f59190251d
32 changed files with 5492 additions and 1 deletions
+35
View File
@@ -0,0 +1,35 @@
name: build-winui
on:
workflow_dispatch:
push:
branches:
- main
- master
pull_request:
jobs:
winui:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
- name: Build MSIX package
shell: pwsh
run: .\scripts\build-winui.ps1 --target=msix --no-pause
- name: Upload installer artifacts
uses: actions/upload-artifact@v4
with:
name: ymhut-box-winui
path: |
installer_output/*.msix
installer_output/*.cer
installer_output/*.appinstaller
installer_output/update-info/**
+55
View File
@@ -0,0 +1,55 @@
# Misc
*.log
*.pyc
*.swp
.DS_Store
.history
.svn/
# IDE
*.iml
*.ipr
*.iws
.idea/
.vs/
# Flutter / Dart
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.pub/
.pub-cache/
/build/
/coverage/
**/doc/api/
**/ios/Flutter/.last_build_id
# .NET / C# build outputs
**/bin/
**/obj/
# Local outputs
/latest/
/installer_output/
/Release/
**/dist/
**/node_modules/
src/box-winUI/AppPackages/
server/update/build/
server/update/public/downloads/
server/unified-management/dist-release/
server/feedback-mailer/config.json
server/feedback-mailer/feedback-mailer.exe
server/feedback-mailer/storage/
server/unified-management/storage/
server/unified-management/**/storage/
# Android local config
android/local.properties
# Local tool state
.agents/
.cache/
.codex/
.codex_state/
.tmp/
+16
View File
@@ -0,0 +1,16 @@
<Project>
<PropertyGroup Condition="Exists('$(MSBuildThisFileDirectory)version.json')">
<_YMhutVersionJson>$([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)version.json'))</_YMhutVersionJson>
<YMhutVersion>$([System.Text.RegularExpressions.Regex]::Replace('$(_YMhutVersionJson)', '(?s).*&quot;version&quot;\s*:\s*&quot;([^&quot;]+)&quot;.*', '$1'))</YMhutVersion>
<YMhutBuild>$([System.Text.RegularExpressions.Regex]::Replace('$(_YMhutVersionJson)', '(?s).*&quot;build&quot;\s*:\s*&quot;?([0-9]+)&quot;?.*', '$1'))</YMhutBuild>
<YMhutPackageVersion>$(YMhutVersion).$(YMhutBuild)</YMhutPackageVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(YMhutVersion)' != '' and '$(YMhutBuild)' != ''">
<Version>$(YMhutVersion)</Version>
<PackageVersion>$(YMhutPackageVersion)</PackageVersion>
<AssemblyVersion>$(YMhutPackageVersion)</AssemblyVersion>
<FileVersion>$(YMhutPackageVersion)</FileVersion>
<InformationalVersion>$(YMhutPackageVersion)</InformationalVersion>
</PropertyGroup>
</Project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="local-feed" value="./.cache/nuget/feed" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
</configuration>
+44 -1
View File
@@ -1,2 +1,45 @@
# YMhut-box-C#
# YMhut Box
YMhut Box is now a native Windows toolbox built with **C# + .NET + WinUI 3**.
## Project Layout
- `src/box-winUI/` - WinUI 3 application shell, pages, services, packaging manifest
- `src/YMhut.Box.Core/` - settings, logging, HTTP/API, tool catalog and tool execution logic
- `src/YMhut.Box.Tests/` - MSTest unit tests for services, settings, catalog and tools
- `assets/` - icons, fonts, images and local reference data
- `installer/ymhut_box_winui.iss` - Inno Setup installer script
- `scripts/build-winui.ps1` - publish, MSIX and installer build pipeline
- `plan/` - migration plan and per-stage status
## Build
```bat
build.bat --target=publish
build.bat --target=msix
build.bat --target=both
```
Build outputs are written to:
- `build/winui/publish/`
- `latest/`
- `installer_output/`
The MSIX path uses a local self-signed certificate for sideloading. The EXE installer uses Inno Setup when `ISCC.exe` is installed or available on `PATH`.
## Test
```bat
dotnet restore YMhut.Box.Native.sln --configfile NuGet.Config --ignore-failed-sources
dotnet build src\box-winUI\YMhut.Box.WinUI.csproj -c Debug -p:Platform=x64 --no-restore
dotnet test src\YMhut.Box.Tests\YMhut.Box.Tests.csproj -c Debug --no-restore
```
## Release Baseline
- Self-contained `win-x64`
- MSIX + classic EXE installer
- App Installer update metadata
- Native WinUI pages for browser and media playback
- Tool catalog and execution fully registered in C#/.NET
+52
View File
@@ -0,0 +1,52 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMhut.Box.Core", "src\YMhut.Box.Core\YMhut.Box.Core.csproj", "{25D87E44-7581-4FD1-946D-EE9FE49878B7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMhut.Box.WinUI", "src\box-winUI\YMhut.Box.WinUI.csproj", "{C586701B-C064-4932-B72B-3EF280945D8B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMhut.Box.Tests", "src\YMhut.Box.Tests\YMhut.Box.Tests.csproj", "{42D509E8-C17A-4A10-B601-85C02A2D31E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMhut.Box.Worker", "src\YMhut.Box.Worker\YMhut.Box.Worker.csproj", "{F3DA45A5-9F98-44F5-92E7-F76E23A22C73}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMhut.Box.PluginHost", "src\YMhut.Box.PluginHost\YMhut.Box.PluginHost.csproj", "{B4FB36F5-7259-4308-8177-1901962789A4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMhut.Box.DownloadHost", "src\YMhut.Box.DownloadHost\YMhut.Box.DownloadHost.csproj", "{7B7ED3B8-7C6D-4B50-A54B-1FD80A0F097E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{25D87E44-7581-4FD1-946D-EE9FE49878B7}.Debug|x64.ActiveCfg = Debug|Any CPU
{25D87E44-7581-4FD1-946D-EE9FE49878B7}.Debug|x64.Build.0 = Debug|Any CPU
{25D87E44-7581-4FD1-946D-EE9FE49878B7}.Release|x64.ActiveCfg = Release|Any CPU
{25D87E44-7581-4FD1-946D-EE9FE49878B7}.Release|x64.Build.0 = Release|Any CPU
{C586701B-C064-4932-B72B-3EF280945D8B}.Debug|x64.ActiveCfg = Debug|x64
{C586701B-C064-4932-B72B-3EF280945D8B}.Debug|x64.Build.0 = Debug|x64
{C586701B-C064-4932-B72B-3EF280945D8B}.Release|x64.ActiveCfg = Release|x64
{C586701B-C064-4932-B72B-3EF280945D8B}.Release|x64.Build.0 = Release|x64
{42D509E8-C17A-4A10-B601-85C02A2D31E5}.Debug|x64.ActiveCfg = Debug|Any CPU
{42D509E8-C17A-4A10-B601-85C02A2D31E5}.Debug|x64.Build.0 = Debug|Any CPU
{42D509E8-C17A-4A10-B601-85C02A2D31E5}.Release|x64.ActiveCfg = Release|Any CPU
{42D509E8-C17A-4A10-B601-85C02A2D31E5}.Release|x64.Build.0 = Release|Any CPU
{F3DA45A5-9F98-44F5-92E7-F76E23A22C73}.Debug|x64.ActiveCfg = Debug|Any CPU
{F3DA45A5-9F98-44F5-92E7-F76E23A22C73}.Debug|x64.Build.0 = Debug|Any CPU
{F3DA45A5-9F98-44F5-92E7-F76E23A22C73}.Release|x64.ActiveCfg = Release|Any CPU
{F3DA45A5-9F98-44F5-92E7-F76E23A22C73}.Release|x64.Build.0 = Release|Any CPU
{B4FB36F5-7259-4308-8177-1901962789A4}.Debug|x64.ActiveCfg = Debug|Any CPU
{B4FB36F5-7259-4308-8177-1901962789A4}.Debug|x64.Build.0 = Debug|Any CPU
{B4FB36F5-7259-4308-8177-1901962789A4}.Release|x64.ActiveCfg = Release|Any CPU
{B4FB36F5-7259-4308-8177-1901962789A4}.Release|x64.Build.0 = Release|Any CPU
{7B7ED3B8-7C6D-4B50-A54B-1FD80A0F097E}.Debug|x64.ActiveCfg = Debug|Any CPU
{7B7ED3B8-7C6D-4B50-A54B-1FD80A0F097E}.Debug|x64.Build.0 = Debug|Any CPU
{7B7ED3B8-7C6D-4B50-A54B-1FD80A0F097E}.Release|x64.ActiveCfg = Release|Any CPU
{7B7ED3B8-7C6D-4B50-A54B-1FD80A0F097E}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
+19
View File
@@ -0,0 +1,19 @@
@echo off
setlocal
chcp 65001 >nul 2>&1
set "ROOT=%~dp0"
if "%ROOT:~-1%"=="\" set "ROOT=%ROOT:~0,-1%"
cd /d "%ROOT%"
echo ========================================
echo YMhut Box - WinUI 3 Build
echo ========================================
echo.
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%ROOT%\scripts\build-winui.ps1" %*
set "EXITCODE=%ERRORLEVEL%"
if not "%EXITCODE%"=="0" (
echo.
echo [ERROR] WinUI build failed with exit code %EXITCODE%.
)
exit /b %EXITCODE%
+19
View File
@@ -0,0 +1,19 @@
# Architecture
YMhut Box is split into a WinUI app and a reusable Core library.
## Layers
- `YMhut.Box.WinUI`: window shell, navigation, pages, App Installer update trigger and Windows integration.
- `YMhut.Box.Core`: settings, log, HTTP/API, local data, system snapshots, tool catalog and tool execution.
- `YMhut.Box.Tests`: MSTest coverage for migration-critical services and tool behavior.
## Services
The WinUI app builds a DI container in `AppServices.Configure()` and registers settings, logging, HTTP/API, update, data, system metrics, startup, window state and tool worker services.
Tool pages call `IToolWorkerService` and `ToolExecutor`; API-backed tools go through `IApiManager`, which owns endpoint resolution, timeout behavior, logging and cache boundaries.
## Tool Contract
Every tool is registered as an `IToolModule` with stable metadata. `ToolCatalog` is a static C# registry and no longer reads a runtime tool registry from another project.
+10
View File
@@ -0,0 +1,10 @@
# Contributing
## Add A Tool
1. Add metadata to `ToolCatalog`.
2. Add core execution logic to `ToolExecutor` or a dedicated service.
3. Add tests in `YMhut.Box.Tests`.
4. Verify the tool appears in `ToolboxPage`, opens in `ToolDetailPage`, and writes recent-tool history.
Use `IApiManager` for remote tools and keep parsing logic unit-testable.
+7
View File
@@ -0,0 +1,7 @@
# Migration Notes
YMhut Box 2.x migrates user settings into `%LOCALAPPDATA%\YMhut Box\WinUI\settings.json` on first launch.
The current release line runs as a native WinUI 3 app. Tool metadata, navigation, recent-tool records, settings, logs and update checks are handled by C#/.NET services.
Older app data is imported as a compatibility step and is not required for new installs.
+63
View File
@@ -0,0 +1,63 @@
# Plugin Specification For AI Implementers
This document is the compact contract for generating YMhut Box plugins with another AI agent.
## Build A Minimal Local Package
Create exactly the files needed for a runnable local package:
- `ymhut.plugin.json`
- `README.md`
- `index.html`
- `style.css`
- `main.js`
Keep UI code and core logic local. Do not load remote scripts as runtime dependencies. Remote HTTP APIs are allowed only through declared permissions and graceful failure states.
## Manifest Rules
- Use a stable `id` with letters, numbers, `.`, `-`, or `_`.
- Do not prefix the id with `plugin:`.
- Include at least one `ToolboxTool` or `NavPage` surface.
- Include every local file in `resources`, including `README.md`.
- Request only permissions the plugin actually uses.
- Explain every requested permission in `README.md`.
## Runtime Bridge
Use `window.ymhut` for host abilities:
- `output.*` for reports and summaries.
- `storage.*` for plugin-private state.
- `http.fetch` for http/https requests.
- `network.*` for host network diagnostics.
- `clipboard.*` and `file.*` only when clearly user initiated.
- `openExternal(url)` for links, which opens the YMhut safe browser by default.
- `openExternal(url, { target: "system" })` only for an explicit system-browser action.
## UI And Window Boundaries
The plugin page owns only its WebView content area. Do not mimic system title bars, cover host controls, or create invisible click layers. Avoid full-screen fixed overlays; if a modal is necessary, provide a visible close control and restore focus.
Design for both embedded and independent-window use. Use responsive grids, readable card density, clear loading states, empty states, and error states. The host output area should not be used as the primary UI.
## Security Constraints
Do not modify or override:
- `server/`
- built-in app assets
- developer/about identity
- built-in tool IDs
- paths outside the plugin directory
All plugin resources must resolve inside the plugin folder. File access must go through host file pickers; never assume arbitrary filesystem access.
## Acceptance Checklist
- Plugin scans without validation errors.
- README explains features, permissions, boundaries, and known failures.
- Main UI runs without network and shows a useful degraded state.
- Output writes do not hide the main UI.
- Links open in the safe browser by default.
- No remote scripts, no unbounded z-index overlays, no hidden click blockers.
+90
View File
@@ -0,0 +1,90 @@
# YMhut Box 插件开发说明
YMhut Box 插件是本地 WebView 插件包,用来扩展工具箱工具或插件页。插件运行在宿主隔离的 WebView 中,通过 `window.ymhut` Bridge 请求能力;插件不能直接访问应用核心资源、任意文件路径或系统浏览器。
## 最小插件包
```text
my-plugin/
ymhut.plugin.json
README.md
index.html
style.css
main.js
```
`README.md``README.txt``说明.md` 必须存在。`entry``resources` 和 surface 入口都必须留在插件目录内,不能使用 `../` 逃逸。
## manifest 核心字段
```json
{
"id": "hello-tools",
"name": "Hello Tools",
"version": "1.0.0",
"author": "you",
"description": "A local YMhut Box plugin",
"entry": "index.html",
"permissions": ["Output", "Log", "Storage", "OpenExternal"],
"surfaces": [
{
"kind": "ToolboxTool",
"id": "hello",
"name": "Hello",
"description": "Toolbox entry",
"entry": "index.html",
"category": "plugin"
}
],
"resources": ["index.html", "style.css", "main.js", "README.md"]
}
```
`id` 只允许字母、数字、点、短横线和下划线,不能以 `plugin:` 开头。工具箱挂载后的工具 ID 由宿主生成,格式是 `plugin:<pluginId>:<surfaceId>`
## 权限
权限默认关闭。manifest 只声明插件需要什么,用户仍要在插件页启用插件并授予权限。
- `Input`:读取或写入插件输入。
- `Output`:写入宿主输出区。
- `Log`:写入 `plugin:<pluginId>` 日志。
- `Storage`:访问插件私有 key-value 状态。
- `Http`:通过宿主请求 http/https。
- `Clipboard`:读写剪贴板文本。
- `FilePicker`:通过系统选择器打开或保存文件。
- `RunTool`:调用允许的内置工具。
- `OpenExternal`:打开 http/https 外链,默认进入安全浏览器。
- `NetworkDiagnostics`:请求本机网络诊断能力。
## Bridge
```js
await window.ymhut.output.set("report");
await window.ymhut.storage.set("lastRun", JSON.stringify(data));
await window.ymhut.http.fetch({ url: "https://example.com/api" });
await window.ymhut.openExternal("https://example.com");
await window.ymhut.openExternal("https://example.com", { target: "system" });
```
普通外链默认进入 YMhut Box 安全浏览器。系统浏览器只作为显式动作使用,并继续受 `OpenExternal` 权限控制。
## 窗口与输出
插件内容区承载主 UI;宿主输出区用于报告、日志摘要、复制结果和调试信息。不要用输出区做主交互,也不要在插件页面使用全屏 fixed 遮罩、透明点击层或超高 z-index 覆盖宿主控件。
插件需要适配主窗口内嵌和独立窗口内容区。建议使用响应式网格、可滚动表格和清晰空态;不要假设窗口固定尺寸。
## 安全边界
插件 WebView 只允许加载插件目录内本地资源。非本地导航会被拦截并交给安全浏览器。插件不能覆盖内置工具 ID、应用图标、开发者信息、关于页核心身份或内置 `Assets` 路径。
网络结果、排行榜和第三方数据都应标明不确定性,并在失败时显示降级状态。
## 常见问题
- 加载失败:检查 manifest、README、entry 和 resources 是否存在且路径合法。
- 权限拒绝:检查 manifest 是否声明权限,以及插件页是否已授权。
- 外链打不开:只支持绝对 http/https URL,默认安全浏览器。
- 输出区遮挡:将输出区用于报告,不要用它承载主 UI。
- 独立窗口异常:不要调用浏览器弹窗 API 创建系统浏览器窗口。
+10
View File
@@ -0,0 +1,10 @@
# Release Process
1. Update `version.json`.
2. Run `dotnet restore YMhut.Box.Native.sln --configfile NuGet.Config --ignore-failed-sources`.
3. Run `dotnet test src\YMhut.Box.Tests\YMhut.Box.Tests.csproj -c Release --no-restore`.
4. Run `build.bat --target=both`.
5. Verify `installer_output/*.msix`, `installer_output/*.appinstaller`, and the Inno Setup EXE.
6. Install, launch, upgrade and uninstall both MSIX and EXE packages.
The default signing path uses a self-signed certificate for sideload validation. Replace the certificate before public distribution if a commercial signing certificate is available.
+418
View File
@@ -0,0 +1,418 @@
; *** Inno Setup version 6.5.0+ Chinese Simplified messages ***
;
; To download user-contributed translations of this file, go to:
; https://jrsoftware.org/files/istrans/
;
; Note: When translating this text, do not add periods (.) to the end of
; messages that didn't have them already, because on those messages Inno
; Setup adds the periods automatically (appending a period would result in
; two periods being displayed).
;
; Maintained by Zhenghan Yang
; Email: 847320916@QQ.com
; Translation based on network resource
; The latest Translation is on https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation
;
[LangOptions]
; The following three entries are very important. Be sure to read and
; understand the '[LangOptions] section' topic in the help file.
LanguageName=简体中文
; If Language Name display incorrect, uncomment next line
; LanguageName=<7B80><4F53><4E2D><6587>
; About LanguageID, to reference link:
; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c
LanguageID=$0804
; About CodePage, to reference link:
; https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
LanguageCodePage=936
; If the language you are translating to requires special font faces or
; sizes, uncomment any of the following entries and change them accordingly.
;DialogFontName=
;DialogFontSize=9
;DialogFontBaseScaleWidth=7
;DialogFontBaseScaleHeight=15
;WelcomeFontName=Segoe UI
;WelcomeFontSize=14
[Messages]
; *** 应用程序标题
SetupAppTitle=安装
SetupWindowTitle=安装 - %1
UninstallAppTitle=卸载
UninstallAppFullTitle=%1 卸载
; *** Misc. common
InformationTitle=信息
ConfirmTitle=确认
ErrorTitle=错误
; *** SetupLdr messages
SetupLdrStartupMessage=现在将安装 %1。您想要继续吗?
LdrCannotCreateTemp=无法创建临时文件。安装程序已中止
LdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止
HelpTextNote=
; *** 启动错误消息
LastErrorMessage=%1。%n%n错误 %2: %3
SetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。
SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。
SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。
InvalidParameter=无效的命令行参数:%n%n%1
SetupAlreadyRunning=安装程序正在运行。
WindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。
WindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。
NotOnThisPlatform=此程序不能在 %1 上运行。
OnlyOnThisPlatform=此程序只能在 %1 上运行。
OnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中:%n%n%1
WinVersionTooLowError=此程序需要 %1 版本 %2 或更高。
WinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。
AdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。
PowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。
SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。
UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。
; *** 启动问题
PrivilegesRequiredOverrideTitle=选择安装程序模式
PrivilegesRequiredOverrideInstruction=选择安装模式
PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。
PrivilegesRequiredOverrideText2=%1 可以仅为您安装,或为所有用户安装(需要管理员权限)。
PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A)
PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项)
PrivilegesRequiredOverrideCurrentUser=仅为我安装(&M)
PrivilegesRequiredOverrideCurrentUserRecommended=仅为我安装(&M) (建议选项)
; *** 其他错误
ErrorCreatingDir=安装程序无法创建目录“%1”
ErrorTooManyFilesInDir=无法在目录“%1”中创建文件,因为里面包含太多文件
; *** 安装程序公共消息
ExitSetupTitle=退出安装程序
ExitSetupMessage=安装程序尚未完成。如果现在退出,将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗?
AboutSetupMenuItem=关于安装程序(&A)...
AboutSetupTitle=关于安装程序
AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4
AboutSetupNote=
TranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址:https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation
; *** 按钮
ButtonBack=< 上一步(&B)
ButtonNext=下一步(&N) >
ButtonInstall=安装(&I)
ButtonOK=确定
ButtonCancel=取消
ButtonYes=是(&Y)
ButtonYesToAll=全是(&A)
ButtonNo=否(&N)
ButtonNoToAll=全否(&O)
ButtonFinish=完成(&F)
ButtonBrowse=浏览(&B)...
ButtonWizardBrowse=浏览(&R)...
ButtonNewFolder=新建文件夹(&M)
; *** “选择语言”对话框消息
SelectLanguageTitle=选择安装语言
SelectLanguageLabel=选择安装时使用的语言。
; *** 公共向导文字
ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。
BeveledLabel=
BrowseDialogTitle=浏览文件夹
BrowseDialogLabel=在下面的列表中选择一个文件夹,然后点击“确定”。
NewFolderName=新建文件夹
; *** “欢迎”向导页
WelcomeLabel1=欢迎使用 [name] 安装向导
WelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。
; *** “密码”向导页
WizardPassword=密码
PasswordLabel1=这个安装程序有密码保护。
PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。
PasswordEditLabel=密码(&P)
IncorrectPassword=您输入的密码不正确,请重新输入。
; *** “许可协议”向导页
WizardLicense=许可协议
LicenseLabel=请在继续安装前阅读以下重要信息。
LicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。
LicenseAccepted=我同意此协议(&A)
LicenseNotAccepted=我不同意此协议(&D)
; *** “信息”向导页
WizardInfoBefore=信息
InfoBeforeLabel=请在继续安装前阅读以下重要信息。
InfoBeforeClickLabel=准备好继续安装后,点击“下一步”。
WizardInfoAfter=信息
InfoAfterLabel=请在继续安装前阅读以下重要信息。
InfoAfterClickLabel=准备好继续安装后,点击“下一步”。
; *** “用户信息”向导页
WizardUserInfo=用户信息
UserInfoDesc=请输入您的信息。
UserInfoName=用户名(&U)
UserInfoOrg=组织(&O)
UserInfoSerial=序列号(&S)
UserInfoNameRequired=您必须输入用户名。
; *** “选择目标目录”向导页
WizardSelectDir=选择目标位置
SelectDirDesc=您想将 [name] 安装在哪里?
SelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。
SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。
DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。
DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。
CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。
CannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。
InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或UNC路径:%n%n\\server\share
InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。
DiskSpaceWarningTitle=磁盘空间不足
DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗?
DirNameTooLong=文件夹名称或路径太长。
InvalidDirName=文件夹名称无效。
BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1
DirExistsTitle=文件夹已存在
DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗?
DirDoesntExistTitle=文件夹不存在
DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗?
; *** “选择组件”向导页
WizardSelectComponents=选择组件
SelectComponentsDesc=您想安装哪些程序组件?
SelectComponentsLabel2=选中您想安装的组件;取消您不想安装的组件。然后点击“下一步”继续。
FullInstallation=完全安装
; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
CompactInstallation=简洁安装
CustomInstallation=自定义安装
NoUninstallWarningTitle=组件已存在
NoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中:%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗?
ComponentSize1=%1 KB
ComponentSize2=%1 MB
ComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。
ComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。
; *** “选择附加任务”向导页
WizardSelectTasks=选择附加任务
SelectTasksDesc=您想要安装程序执行哪些附加任务?
SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。
; *** “选择开始菜单文件夹”向导页
WizardSelectProgramGroup=选择开始菜单文件夹
SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式?
SelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。
SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。
MustEnterGroupName=您必须输入一个文件夹名。
GroupNameTooLong=文件夹名或路径太长。
InvalidGroupName=无效的文件夹名字。
BadGroupName=文件夹名不能包含下列任何字符:%n%n%1
NoProgramGroupCheck2=不创建开始菜单文件夹(&D)
; *** “准备安装”向导页
WizardReady=准备安装
ReadyLabel1=安装程序准备就绪,现在可以开始安装 [name] 到您的电脑。
ReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置,点击“上一步”。
ReadyLabel2b=点击“安装”继续此安装程序。
ReadyMemoUserInfo=用户信息:
ReadyMemoDir=目标位置:
ReadyMemoType=安装类型:
ReadyMemoComponents=已选择组件:
ReadyMemoGroup=开始菜单文件夹:
ReadyMemoTasks=附加任务:
; *** TExtractionWizardPage 向导页面与 ExtractArchive
ExtractingLabel=正在解压文件...
ButtonStopExtraction=停止解压(&S)
StopExtraction=您确定要停止解压吗?
ErrorExtractionAborted=解压已中止
ErrorExtractionFailed=解压失败:%1
; *** 压缩文件解压失败详情
ArchiveIncorrectPassword=压缩文件密码不正确
ArchiveIsCorrupted=压缩文件已损坏
ArchiveUnsupportedFormat=不支持的压缩文件格式
; *** TDownloadWizardPage 向导页面和 DownloadTemporaryFile
DownloadingLabel2=正在下载文件...
ButtonStopDownload=停止下载(&S)
StopDownload=您确定要停止下载吗?
ErrorDownloadAborted=下载已中止
ErrorDownloadFailed=下载失败:%1 %2
ErrorDownloadSizeFailed=获取下载大小失败:%1 %2
ErrorProgress=无效的进度:%1 / %2
ErrorFileSize=文件大小错误:预期 %1,实际 %2
; *** “正在准备安装”向导页
WizardPreparing=正在准备安装
PreparingDesc=安装程序正在准备安装 [name] 到您的电脑。
PreviousInstallNotCompleted=先前的程序安装或卸载未完成,您需要重启您的电脑以完成。%n%n在重启电脑后,再次运行安装程序以完成 [name] 的安装。
CannotContinue=安装程序不能继续。请点击“取消”退出。
ApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。
ApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动这些应用程序。
CloseApplications=自动关闭应用程序(&A)
DontCloseApplications=不要关闭应用程序(&D)
ErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前,关闭所有在使用需要由安装程序更新的文件的应用程序。
PrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后,请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动?
; *** “正在安装”向导页
WizardInstalling=正在安装
InstallingLabel=安装程序正在安装 [name] 到您的电脑,请稍候。
; *** “安装完成”向导页
FinishedHeadingLabel=[name] 安装完成
FinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。
FinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。
ClickFinish=点击“完成”退出安装程序。
FinishedRestartLabel=为完成 [name] 的安装,安装程序必须重新启动您的电脑。要立即重启吗?
FinishedRestartMessage=为完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n要立即重启吗?
ShowReadmeCheck=是,我想查阅自述文件
YesRadio=是,立即重启电脑(&Y)
NoRadio=否,稍后重启电脑(&N)
; used for example as 'Run MyProg.exe'
RunEntryExec=运行 %1
; used for example as 'View Readme.txt'
RunEntryShellExec=查阅 %1
; *** “安装程序需要下一张磁盘”提示
ChangeDiskTitle=安装程序需要下一张磁盘
SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到,请输入正确的路径或点击“浏览”。
PathLabel=路径(&P)
FileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。
SelectDirectoryLabel=请指定下一张磁盘的位置。
; *** 安装阶段消息
SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。
AbortRetryIgnoreSelectAction=选择操作
AbortRetryIgnoreRetry=重试(&T)
AbortRetryIgnoreIgnore=忽略错误并继续(&I)
AbortRetryIgnoreCancel=关闭安装程序
RetryCancelSelectAction=选择操作
RetryCancelRetry=重试(&T)
RetryCancelCancel=取消(&C)
; *** 安装状态消息
StatusClosingApplications=正在关闭应用程序...
StatusCreateDirs=正在创建目录...
StatusExtractFiles=正在提取文件...
StatusDownloadFiles=正在下载文件...
StatusCreateIcons=正在创建快捷方式...
StatusCreateIniEntries=正在创建 INI 条目...
StatusCreateRegistryEntries=正在创建注册表条目...
StatusRegisterFiles=正在注册文件...
StatusSavingUninstall=正在保存卸载信息...
StatusRunProgram=正在完成安装...
StatusRestartingApplications=正在重启应用程序...
StatusRollback=正在撤销更改...
; *** 其他错误
ErrorInternal2=内部错误:%1
ErrorFunctionFailedNoCode=%1 失败
ErrorFunctionFailed=%1 失败;错误代码 %2
ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2.%n%3
ErrorExecutingProgram=无法执行文件:%n%1
; *** 注册表错误
ErrorRegOpenKey=打开注册表项时出错:%n%1\%2
ErrorRegCreateKey=创建注册表项时出错:%n%1\%2
ErrorRegWriteKey=写入注册表项时出错:%n%1\%2
; *** INI 错误
ErrorIniEntry=在文件“%1”中创建 INI 条目时出错。
; *** 文件复制错误
FileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐)
FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐)
SourceIsCorrupted=源文件已损坏
SourceDoesntExist=源文件“%1”不存在
SourceVerificationFailed=源文件验证失败: %1
VerificationSignatureDoesntExist=签名文件“%1”不存在
VerificationSignatureInvalid=签名文件“%1”无效
VerificationKeyNotFound=签名文件“%1”使用了未知密钥
VerificationFileNameIncorrect=文件名不正确
VerificationFileTagIncorrect=文件标签不正确
VerificationFileSizeIncorrect=文件大小不正确
VerificationFileHashIncorrect=文件哈希值不正确
ExistingFileReadOnly2=无法替换现有文件,它是只读的。
ExistingFileReadOnlyRetry=移除只读属性并重试(&R)
ExistingFileReadOnlyKeepExisting=保留现有文件(&K)
ErrorReadingExistingDest=尝试读取现有文件时出错:
FileExistsSelectAction=选择操作
FileExists2=文件已经存在。
FileExistsOverwriteExisting=覆盖已存在的文件(&O)
FileExistsKeepExisting=保留现有的文件(&K)
FileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)
ExistingFileNewerSelectAction=选择操作
ExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。
ExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O)
ExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐)
ExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)
ErrorChangingAttr=尝试更改下列现有文件的属性时出错:
ErrorCreatingTemp=尝试在目标目录创建文件时出错:
ErrorReadingSource=尝试读取下列源文件时出错:
ErrorCopying=尝试复制下列文件时出错:
ErrorDownloading=下载文件时出错:
ErrorExtracting=解压压缩文件时出错:
ErrorReplacingExistingFile=尝试替换现有文件时出错:
ErrorRestartReplace=重启并替换失败:
ErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错:
ErrorRegisterServer=无法注册 DLL/OCX%1
ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1
ErrorRegisterTypeLib=无法注册类库:%1
; *** 卸载显示名字标记
; used for example as 'My Program (32-bit)'
UninstallDisplayNameMark=%1 (%2)
; used for example as 'My Program (32-bit, All users)'
UninstallDisplayNameMarks=%1 (%2, %3)
UninstallDisplayNameMark32Bit=32 位
UninstallDisplayNameMark64Bit=64 位
UninstallDisplayNameMarkAllUsers=所有用户
UninstallDisplayNameMarkCurrentUser=当前用户
; *** 安装后错误
ErrorOpeningReadme=尝试打开自述文件时出错。
ErrorRestartingComputer=安装程序无法重启电脑,请手动重启。
; *** 卸载消息
UninstallNotFound=文件“%1”不存在。无法卸载。
UninstallOpenError=文件“%1”不能被打开。无法卸载。
UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载
UninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1)
ConfirmUninstall=您确认要完全移除 %1 及其所有组件吗?
UninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。
OnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。
UninstallStatusLabel=正在从您的电脑中移除 %1,请稍候。
UninstalledAll=已顺利从您的电脑中移除 %1。
UninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除,但您可以手动删除它们。
UninstalledAndNeedsRestart=为完成 %1 的卸载,需要重启您的电脑。%n%n立即重启电脑吗?
UninstallDataCorrupted=文件“%1”已损坏。无法卸载
; *** 卸载状态消息
ConfirmDeleteSharedFileTitle=删除共享的文件吗?
ConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗?%n%n如果删除这些文件,但仍有程序在使用这些文件,则这些程序可能出现异常。如果您不能确定,请选择“否”,在系统中保留这些文件以免引发问题。
SharedFileNameLabel=文件名:
SharedFileLocationLabel=位置:
WizardUninstalling=卸载状态
StatusUninstalling=正在卸载 %1...
; *** Shutdown block reasons
ShutdownBlockReasonInstallingApp=正在安装 %1。
ShutdownBlockReasonUninstallingApp=正在卸载 %1。
; The custom messages below aren't used by Setup itself, but if you make
; use of them in your scripts, you'll want to translate them.
[CustomMessages]
NameAndVersion=%1 版本 %2
AdditionalIcons=附加快捷方式:
CreateDesktopIcon=创建桌面快捷方式(&D)
CreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q)
ProgramOnTheWeb=%1 网站
UninstallProgram=卸载 %1
LaunchProgram=运行 %1
AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A)
AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联...
AutoStartProgramGroupDescription=启动:
AutoStartProgram=自动启动 %1
AddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗?
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+332
View File
@@ -0,0 +1,332 @@
#!/usr/bin/env python3
"""Download and spatially compress local solar-system texture assets.
The runtime uses 4096x2048 optimized images under the WinUI Assets folder.
Original 8K sources are archived outside the app assets so they are not copied
into the build output.
"""
from __future__ import annotations
import argparse
import json
import sys
import time
import urllib.request
from concurrent.futures import ThreadPoolExecutor, as_completed
from dataclasses import dataclass
from pathlib import Path
from shutil import copyfile
from PIL import Image, ImageEnhance, ImageFile, ImageFilter, ImageOps
ImageFile.MAXBLOCK = 128 * 1024 * 1024
ROOT = Path(__file__).resolve().parents[1]
SOURCE_DIR = ROOT / "assets" / "source-textures" / "solar"
OUTPUT_DIR = ROOT / "src" / "box-winUI" / "Assets" / "home-globe" / "textures" / "solar"
MANIFEST_PATH = OUTPUT_DIR / "solar-texture-manifest.json"
TARGET_SIZE = (4096, 2048)
USER_AGENT = "YMhutBoxTexturePipeline/1.0 (+local asset preparation)"
@dataclass(frozen=True)
class TextureJob:
body_id: str
source_name: str
output_name: str
url: str | None
credit: str
mode: str = "rgb"
quality: int = 94
contrast: float = 1.02
sharpness: float = 1.08
JOBS = [
TextureJob(
"mercury",
"8k_mercury.jpg",
"mercury.jpg",
"https://www.solarsystemscope.com/textures/download/8k_mercury.jpg",
"Solar System Scope 8K Mercury texture, NASA/JPL-derived public imagery.",
contrast=1.06,
sharpness=1.14,
),
TextureJob(
"venus",
"8k_venus_surface.jpg",
"venus.jpg",
"https://www.solarsystemscope.com/textures/download/8k_venus_surface.jpg",
"Solar System Scope 8K Venus surface texture, NASA/JPL-derived public imagery.",
contrast=1.04,
sharpness=1.1,
),
TextureJob(
"earth",
"8k_earth_daymap.jpg",
"earth.jpg",
"https://www.solarsystemscope.com/textures/download/8k_earth_daymap.jpg",
"Solar System Scope 8K Earth day map based on NASA Blue Marble imagery.",
contrast=1.03,
sharpness=1.1,
),
TextureJob(
"earth-clouds",
"8k_earth_clouds.jpg",
"earth-clouds.png",
"https://www.solarsystemscope.com/textures/download/8k_earth_clouds.jpg",
"Solar System Scope 8K Earth cloud map based on NASA imagery.",
mode="cloud-alpha",
quality=100,
contrast=1.18,
sharpness=1.08,
),
TextureJob(
"mars",
"8k_mars.jpg",
"mars.jpg",
"https://www.solarsystemscope.com/textures/download/8k_mars.jpg",
"Solar System Scope 8K Mars texture, NASA/JPL-derived public imagery.",
contrast=1.06,
sharpness=1.15,
),
TextureJob(
"jupiter",
"8k_jupiter.jpg",
"jupiter.jpg",
"https://www.solarsystemscope.com/textures/download/8k_jupiter.jpg",
"Solar System Scope high-resolution Jupiter texture, NASA/JPL-derived public imagery.",
contrast=1.04,
sharpness=1.12,
),
TextureJob(
"saturn",
"8k_saturn.jpg",
"saturn.jpg",
"https://www.solarsystemscope.com/textures/download/8k_saturn.jpg",
"Solar System Scope high-resolution Saturn texture, NASA/JPL-derived public imagery.",
contrast=1.04,
sharpness=1.12,
),
TextureJob(
"uranus",
"local_uranus_4k.png",
"uranus.jpg",
"local-png:src/box-winUI/Assets/home-globe/textures/solar/uranus.jpg",
"Local lossless 4K Uranus fallback source, retained because the public 8K direct link is unavailable.",
contrast=1.08,
sharpness=1.1,
),
TextureJob(
"neptune",
"local_neptune_4k.png",
"neptune.jpg",
"local-png:src/box-winUI/Assets/home-globe/textures/solar/neptune.jpg",
"Local lossless 4K Neptune fallback source, retained because the public 8K direct link is unavailable.",
contrast=1.08,
sharpness=1.1,
),
]
def download(url: str, destination: Path, force: bool) -> None:
if destination.exists() and destination.stat().st_size > 0 and not force:
return
destination.parent.mkdir(parents=True, exist_ok=True)
if url.startswith("local:"):
seed_path = ROOT / url.removeprefix("local:")
if not seed_path.exists():
raise FileNotFoundError(seed_path)
copyfile(seed_path, destination)
mb = destination.stat().st_size / 1024 / 1024
print(f"Archived local fallback {destination.name}: {mb:.2f} MB")
return
if url.startswith("local-png:"):
seed_path = ROOT / url.removeprefix("local-png:")
if not seed_path.exists():
raise FileNotFoundError(seed_path)
with Image.open(seed_path) as image:
image.convert("RGB").save(destination, "PNG", optimize=True, compress_level=9)
mb = destination.stat().st_size / 1024 / 1024
print(f"Archived lossless local fallback {destination.name}: {mb:.2f} MB")
return
tmp = destination.with_suffix(destination.suffix + ".part")
last_error: Exception | None = None
for attempt in range(1, 5):
request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
try:
with urllib.request.urlopen(request, timeout=180) as response:
total = int(response.headers.get("Content-Length") or 0)
loaded = 0
started = time.monotonic()
with tmp.open("wb") as out:
while True:
chunk = response.read(1024 * 512)
if not chunk:
break
out.write(chunk)
loaded += len(chunk)
if total:
percent = loaded / total * 100
sys.stdout.write(f"\rDownloading {destination.name}: {percent:5.1f}%")
sys.stdout.flush()
elapsed = max(time.monotonic() - started, 0.001)
if tmp.stat().st_size == 0:
raise RuntimeError("downloaded file is empty")
tmp.replace(destination)
mb = destination.stat().st_size / 1024 / 1024
print(f"\rDownloaded {destination.name}: {mb:.2f} MB in {elapsed:.1f}s")
return
except Exception as exc:
last_error = exc
wait_seconds = min(18, attempt * 4)
print(f"\nRetrying {destination.name} after {type(exc).__name__}: attempt {attempt}/4")
time.sleep(wait_seconds)
raise RuntimeError(f"download failed for {destination.name}") from last_error
def resize_source(image: Image.Image, target_size: tuple[int, int]) -> Image.Image:
image = ImageOps.exif_transpose(image)
if image.size != target_size:
image = image.resize(target_size, Image.Resampling.LANCZOS)
return image
def enhance_rgb(image: Image.Image, job: TextureJob) -> Image.Image:
image = image.convert("RGB")
if job.contrast != 1:
image = ImageEnhance.Contrast(image).enhance(job.contrast)
if job.sharpness != 1:
image = ImageEnhance.Sharpness(image).enhance(job.sharpness)
return image.filter(ImageFilter.UnsharpMask(radius=0.9, percent=80, threshold=2))
def build_cloud_alpha(image: Image.Image, job: TextureJob) -> Image.Image:
image = enhance_rgb(image, job)
luminance = image.convert("L")
alpha = ImageEnhance.Contrast(luminance).enhance(1.35)
white = Image.new("RGB", image.size, (255, 255, 255))
rgba = Image.merge("RGBA", (*white.split(), alpha))
return rgba
def source_path_for(job: TextureJob) -> Path:
return SOURCE_DIR / job.source_name
def output_path_for(job: TextureJob) -> Path:
return OUTPUT_DIR / job.output_name
def optimize(job: TextureJob) -> dict[str, object]:
source_path = SOURCE_DIR / job.source_name
output_path = OUTPUT_DIR / job.output_name
print(f"Optimizing {job.body_id}: {source_path.name} -> {output_path.name}")
with Image.open(source_path) as original:
source_size = original.size
source_mode = original.mode
source_raw_bytes = source_size[0] * source_size[1] * max(len(original.getbands()), 3)
image = resize_source(original, TARGET_SIZE)
if job.mode == "cloud-alpha":
image = build_cloud_alpha(image, job)
output_path.parent.mkdir(parents=True, exist_ok=True)
image.save(output_path, "PNG", optimize=True, compress_level=9)
else:
image = enhance_rgb(image, job)
output_path.parent.mkdir(parents=True, exist_ok=True)
image.save(
output_path,
"JPEG",
quality=job.quality,
optimize=True,
progressive=True,
subsampling=0,
)
return {
"id": job.body_id,
"sourceUrl": job.url,
"sourceCredit": job.credit,
"sourceArchivePath": str(source_path.relative_to(ROOT)).replace("\\", "/"),
"sourceBytes": source_path.stat().st_size,
"sourceImageSize": {"width": source_size[0], "height": source_size[1], "mode": source_mode},
"sourceRawBytes": source_raw_bytes,
"optimizedPath": str(output_path.relative_to(ROOT)).replace("\\", "/"),
"optimizedBytes": output_path.stat().st_size,
"optimizedImageSize": {"width": TARGET_SIZE[0], "height": TARGET_SIZE[1]},
"compression": "spatial Lanczos resize to 4096x2048 plus high-quality JPEG/PNG optimization",
}
def write_manifest(entries: list[dict[str, object]]) -> None:
total_source_bytes = sum(int(entry["sourceBytes"]) for entry in entries)
total_source_raw_bytes = sum(int(entry["sourceRawBytes"]) for entry in entries)
total_optimized_bytes = sum(int(entry["optimizedBytes"]) for entry in entries)
manifest = {
"version": 1,
"generatedAt": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
"policy": {
"sourceArchive": "Original high-resolution sources are local but outside WinUI copied assets.",
"runtimeAssets": "Runtime textures are local 4096x2048 spatially compressed images.",
"minimumSourceRawBytes": 60 * 1024 * 1024,
},
"totals": {
"sourceBytes": total_source_bytes,
"sourceRawBytes": total_source_raw_bytes,
"optimizedBytes": total_optimized_bytes,
"sourceBytesMB": round(total_source_bytes / 1024 / 1024, 2),
"sourceRawBytesMB": round(total_source_raw_bytes / 1024 / 1024, 2),
"optimizedBytesMB": round(total_optimized_bytes / 1024 / 1024, 2),
},
"sources": [
"https://www.solarsystemscope.com/textures/",
"https://visibleearth.nasa.gov/collection/1484/blue-marble",
"https://maps.jpl.nasa.gov/tmaps/",
],
"textures": entries,
}
MANIFEST_PATH.write_text(json.dumps(manifest, indent=2, ensure_ascii=False), encoding="utf-8")
raw_mb = manifest["totals"]["sourceRawBytesMB"]
source_mb = manifest["totals"]["sourceBytesMB"]
optimized_mb = manifest["totals"]["optimizedBytesMB"]
print(f"Source archive: {source_mb:.2f} MB downloaded")
print(f"Source raw pixels: {raw_mb:.2f} MB before spatial compression")
print(f"Optimized runtime: {optimized_mb:.2f} MB")
if total_source_raw_bytes < manifest["policy"]["minimumSourceRawBytes"]:
raise RuntimeError("Source raw texture budget is below 60 MB")
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--force", action="store_true", help="redownload and rebuild all textures")
parser.add_argument("--download-workers", type=int, default=4, help="parallel download workers")
args = parser.parse_args()
workers = max(1, min(args.download_workers, len(JOBS)))
with ThreadPoolExecutor(max_workers=workers) as executor:
futures = {
executor.submit(download, job.url or "", source_path_for(job), args.force): job
for job in JOBS
}
for future in as_completed(futures):
job = futures[future]
try:
future.result()
except Exception as exc:
raise RuntimeError(f"Failed to download {job.source_name}") from exc
entries = [optimize(job) for job in JOBS]
write_manifest(entries)
if __name__ == "__main__":
main()
+90
View File
@@ -0,0 +1,90 @@
{
"api_keys": {
"uapipro": ""
},
"app_version": "2.0.5",
"build": "3",
"channel": "stable",
"title": "YMhut Box 2.0.5.3",
"message": "本版本重点提升启动稳定性、插件扫描、首页太阳系同步、反馈提交、设置外观和安装包体积体验。",
"release_notes": "修复启动后首页偶发白屏、顶部搜索框自动抢焦点、插件扫描失败后页面不可用、反馈页按钮导致布局抖动等问题;新增反馈后台留档与状态查看、窗口材质设置、轻量安装包通道,并优化日志中文展示。",
"category_list": [
{
"icon": "monitor",
"id": "system",
"name": "系统工具"
},
{
"icon": "code",
"id": "developer",
"name": "开发工具"
},
{
"icon": "image",
"id": "image",
"name": "图像工具"
}
],
"detected_product": "YMhut Box",
"detected_packages": {
"YMhut Box": [
{
"version": "2.0.5.3",
"extension": "exe",
"fileName": "YMhut_Box_WinUI_Setup_2.0.5.3.exe",
"downloadPath": "/downloads/YMhut_Box_WinUI_Setup_2.0.5.3.exe",
"size": "待发布",
"sizeBytes": 0,
"updateDate": "2026-06-05",
"updateTime": "2026-06-05 00:00:00"
},
{
"version": "2.0.5.3",
"extension": "exe",
"fileName": "YMhut_Box_WinUI_Setup_2.0.5.3_Light.exe",
"downloadPath": "/downloads/YMhut_Box_WinUI_Setup_2.0.5.3_Light.exe",
"size": "待发布",
"sizeBytes": 0,
"updateDate": "2026-06-05",
"updateTime": "2026-06-05 00:00:00"
}
]
},
"download_mirrors": [
{
"enabled": true,
"id": "primary",
"name": "官方直连",
"sha256": "",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.5.3.exe"
},
{
"enabled": true,
"id": "light",
"name": "轻量安装包",
"sha256": "",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.5.3_Light.exe"
}
],
"download_url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.5.3.exe",
"home_notes": "v2.0.5.3 聚焦稳定性和体积体验:启动首页会先显示骨架并异步加载太阳系,插件页优先展示已有结果并后台刷新,反馈页可生成本地加密反馈包并查看处理状态,设置页新增窗口材质选项,同时新增轻量安装包通道。",
"last_update_notes": {
"v2.0.5 稳定性": "延续 WinUI 稳定性、日志性能和插件系统可用性优化。",
"v2.0.5 安装目录": "继续保留必要运行时文件并清理旧版残留,本版本进一步加入轻量安装包通道。",
"v2.0.5 插件系统": "插件扫描和宿主恢复继续完善,本版本进一步降低扫描失败对页面的影响。"
},
"last_updated": "2026-06-05T00:00:00Z",
"tool_metadata": {},
"update_notes": {
"启动与首页": "修复应用启动后首页偶发白屏;首页太阳系同步统一收口成功、失败和超时状态,并优化左下角同步提示。",
"插件稳定性": "插件页优先显示已有扫描结果,后台刷新插件状态;扫描异常时保留可用列表并提供重试。",
"反馈中心": "反馈页支持本地生成加密反馈包、提交后查看反馈编号和处理状态;服务端后台可查看反馈单、发送记录和处理后的文本内容。",
"设置外观": "设置页新增窗口背景材质和局部材质选项,支持云母、云母 Alt、亚克力和纯色回退,并可持久保存。",
"搜索与标题栏": "顶部搜索框不再自动获取焦点;顶部可拖拽区域扩展到更大范围,避开搜索框和窗口按钮。",
"安装包": "保留完整离线包,同时新增轻量安装包通道;发布流程会减少重复资源并归纳不必要的 PRI 文件。",
"日志展示": "日志列表、详情、复制可见日志和反馈包摘要增强中文展示,保留原始日志字段便于排查。",
"界面细节": "修复反馈页点击发送、仅生成反馈包等按钮后页面宽度异常变化的问题,并适配新的下载图标。"
}
}
+133
View File
@@ -0,0 +1,133 @@
{
"api_keys": {
"uapipro": ""
},
"app_version": "2.0.5",
"category_list": [
{
"icon": "monitor",
"id": "system",
"name": "系统工具"
},
{
"icon": "globe",
"id": "network",
"name": "网络工具"
},
{
"icon": "image",
"id": "graphics",
"name": "图像工具"
}
],
"detected_packages": {
"YMhut Box": [
{
"version": "2.0.5",
"extension": "exe",
"fileName": "YMhut_Box_WinUI_Setup_2.0.5.exe",
"downloadPath": "/downloads/YMhut_Box_WinUI_Setup_2.0.5.exe",
"size": "待发布",
"sizeBytes": 0,
"updateDate": "2026-05-30",
"updateTime": "2026-05-30 17:12:58"
},
{
"version": "2.0.4",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.4.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.4.exe",
"size": "108.19 MB",
"sizeBytes": 113447344,
"updateDate": "2026-05-25",
"updateTime": "2026-05-25 12:36:16"
},
{
"version": "2.0.3",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.3.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.3.exe",
"size": "49.44 MB",
"sizeBytes": 51840827,
"updateDate": "2026-05-20",
"updateTime": "2026-05-20 04:29:09"
},
{
"version": "2.0.2",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.2.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.2.exe",
"size": "49.96 MB",
"sizeBytes": 52381778,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 11:29:54"
},
{
"version": "2.0.1",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.1.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.1.exe",
"size": "49.80 MB",
"sizeBytes": 52219648,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 01:14:36"
}
],
"YmhutBox": [
{
"version": "2.0.0",
"extension": "exe",
"fileName": "YmhutBox Setup 2.0.0.exe",
"downloadPath": "/downloads/YmhutBox Setup 2.0.0.exe",
"size": "44.75 MB",
"sizeBytes": 46921883,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 01:14:15"
},
{
"version": "1.3.2",
"extension": "exe",
"fileName": "YmhutBox Setup 1.3.2.exe",
"downloadPath": "/downloads/YmhutBox Setup 1.3.2.exe",
"size": "79.84 MB",
"sizeBytes": 83719658,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 01:13:58"
}
]
},
"detected_product": "YMhut Box",
"download_mirrors": [
{
"enabled": true,
"id": "primary",
"name": "官方直连",
"sha256": "",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.5.exe"
}
],
"download_url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.5.exe",
"home_notes": "v2.0.5 聚焦 WinUI 版本稳定性、安装目录归档、日志性能和插件系统可用性。安装目录继续保留必要运行时文件,资源数据和语言资源按归档方案封装;日志页首屏快速显示并在后台分批补齐;插件系统支持扫描恢复、独立窗口承载和内置 IPCheck 示例插件。",
"last_update_notes": {
"v2.0.4 WinUI 迁移": "迁移到 C#/.NET/WinUI 3 原生桌面应用,建立设置、日志、HTTP/API、更新、窗口状态和系统指标等服务层。",
"v2.0.4 发布体系": "补齐 MSIX/App Installer 与 Inno Setup 发布脚本,形成 WinUI 发布基线。",
"v2.0.4 工具执行": "用静态 C# 工具目录和原生工具执行器替换旧运行时桥接路径。"
},
"last_updated": "2026-05-30T09:12:58Z",
"tool_metadata": {
"ipcheck-demo": {
"name": "IPCheck 网络检测示例插件",
"category": "network",
"status": "built-in-plugin"
}
},
"update_notes": {
"安装目录归档": "发布目录继续采用必需运行时文件保留原名、可归档资源合并封装的策略;数据资源合并为自定义资源包,语言资源按语言打包为 bin,并清理旧版安装残留。",
"安装与启动稳定性": "增强安装引导程序对旧安装目录的识别和清理,修复 MSIX 证书信任流程后的安装问题,并优化 exe 引导启动后的白屏崩溃路径。",
"日志系统": "日志页首屏只加载当天前 30 条,进入页面后由后台任务分批加载剩余日志;列表改为虚拟化渲染,搜索、日期和级别筛选会取消旧查询并重启加载,减少大量日志下的卡顿。",
"插件系统": "插件刷新明确等同扫描插件目录,宿主异常后可清理状态并重新扫描;插件工具支持独立子窗口 WebView2 承载,内置 IPCheck 风格网络检测示例插件。",
"界面与交互": "修复插件页面卡片布局、工具箱插件分类顺位、日志筛选栏布局、语言切换重启确认弹窗和工具来源展示规则。",
"数据与隐私": "远程工具结果不再展示来源 URL,仅保留来源站点名称、类型和获取时间;工具默认示例参数不再使用 ,改用中性示例域名。"
}
}
+95
View File
@@ -0,0 +1,95 @@
{
"api_keys": {
"uapipro": ""
},
"app_version": "2.0.6.2",
"build": "2",
"channel": "stable",
"title": "YMhut Box 2.0.6.2",
"message": "本版本重点修复覆盖安装后白屏退出、用户目录 runtime 占用、语言包膨胀和设置页初始化问题,并继续完善 WinUI 3 工具型工作台体验。",
"message_md": "# YMhut Box 2.0.6.2\n\n本版本继续收尾 WinUI 3 工具型工作台:修复覆盖安装/直启稳定性、用户目录 runtime 残留、自检结果页卡顿、排行榜/资讯显示、中文日志和设置页初始化问题,并新增安装器输出框、Markdown 公告、媒体播放器与随机放映室增强、价格/指标图表化展示。",
"release_notes": "修复 EXE/latest 直启和覆盖安装后因语言资源布局导致的白屏退出;发布布局改为纯 lang\\zh-CN 与 lang\\en-US,移除多余语言包和旧 resources\\lang 压缩依赖;启动与自检链路禁止在用户数据目录保存 Runtime/runtime/Runtimes/runtimes 等运行时副本,旧残留会在启动和安装时清理;完善启动自检、安装完整性检查、服务状态结果页、工具箱与工具详情布局、结果/原始输出渲染、排行榜/资讯结构化显示、设置页控制中心和系统概况实时图表;修复设置页初始化失败、中文模式英文漏出、部分日志英文展示、天气胶囊图标缺失以及关闭确认记住选择等问题。",
"release_notes_md": "## Bug 修复\n\n- 修复 EXE/latest 直启和覆盖安装后因语言资源布局导致的白屏退出,失败时写入清晰日志并显示可读错误。\n- 杜绝用户数据目录生成 Runtime/runtime/Runtimes/runtimes 或完整程序 payload 副本,旧残留会在启动和安装时清理。\n- 修复自检结果页加载大量历史明细时卡顿或短暂无响应的问题,改为确认后摘要优先、明细按需加载。\n- 修复中文模式下部分日志仍显示英文的问题,错误码、HTTP 状态和反馈状态仍保留必要原文。\n- 修复排行榜、热榜和资讯类工具被“已隐藏远程地址,仅展示脱敏来源名称”提示干扰后无法生成卡片的问题,同时继续隐藏远程 URL。\n- 修复设置页初始化失败、关闭确认记住选择、天气胶囊部分状态缺少动画图标等问题。\n\n## 支持增强\n\n- 发布布局统一为纯 `lang\\zh-CN` / `lang\\en-US`,移除多余语言包、根目录 culture 目录和旧 `resources\\lang` 压缩依赖。\n- 客户端公告、首页公告、关于页更新弹窗和更新日志弹窗支持 Markdown 标题、列表、表格、代码与链接,解析失败时回退纯文本。\n- 随机放映室支持远程媒体重定向解析,并为图片、视频、音频加载提供进度提示。\n- 数据类工具增强价格/指标结果展示,黄金价格等结果可同时显示摘要、表格和趋势折线图。\n\n## 新增能力\n\n- 安装引导程序在提取文件阶段新增只读输出框,展示旧版本清理、payload 提取、依赖检查和安装收尾进度。\n- 新增启动/安装完整性自检结果入口,服务状态页可确认后查看结果、复制摘要和导出 JSON。\n- 媒体播放器补齐播放列表、常用播放控制、倍速、音量、全屏、图片/视频/音频混播和常见系统解码格式入口。\n- 随机放映室迁移旧版展示思路,改为图片、视频、音频三段式远程媒体浏览。\n\n## 体验重构\n\n- 工具箱与工具详情页继续向高密度 WinUI 工具工作台收束,结果区固定提供“结果”和“原始输出”。\n- 设置控制中心增加分页滚动提示,系统概况图表补齐网格、坐标和实时信息。\n- 主题继续参考 Microsoft Store 与 Windows 媒体播放器的中性 Fluent 风格,不使用渐变,蓝色为主强调,橙/红仅用于警示。\n- 随机放映室和播放器 UI 更接近 Win11 媒体体验,加载、失败、保存、全屏等状态更清晰。",
"category_list": [
{
"icon": "monitor",
"id": "system",
"name": "系统工具"
},
{
"icon": "code",
"id": "developer",
"name": "开发工具"
},
{
"icon": "image",
"id": "image",
"name": "图像工具"
}
],
"detected_product": "YMhut Box",
"detected_packages": {
"YMhut Box": [
{
"version": "2.0.6.2",
"extension": "exe",
"fileName": "YMhut_Box_WinUI_Setup_2.0.6.2.exe",
"downloadPath": "/downloads/YMhut_Box_WinUI_Setup_2.0.6.2.exe",
"size": "待发布",
"sizeBytes": 0,
"updateDate": "2026-06-14",
"updateTime": "2026-06-14 00:00:00"
},
{
"version": "2.0.6.2",
"extension": "exe",
"fileName": "YMhut_Box_WinUI_Setup_2.0.6.2_Light.exe",
"downloadPath": "/downloads/YMhut_Box_WinUI_Setup_2.0.6.2_Light.exe",
"size": "待发布",
"sizeBytes": 0,
"updateDate": "2026-06-14",
"updateTime": "2026-06-14 00:00:00"
}
]
},
"download_mirrors": [
{
"enabled": true,
"id": "primary",
"name": "官方直连",
"sha256": "",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.6.2.exe"
},
{
"enabled": true,
"id": "light",
"name": "轻量安装包",
"sha256": "",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.6.2_Light.exe"
}
],
"download_url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.6.2.exe",
"home_notes": "v2.0.6.2 聚焦安装布局、启动稳定性和 WinUI 工作台体验:覆盖安装会清理旧程序布局和 runtime 残留,用户目录只保留设置、日志、缓存和轻量状态;语言资源只保留中英双语并归入 lang;工具箱、工具详情、结果渲染、排行榜/资讯卡片、设置控制中心、系统概况和服务状态页继续向原生 Fluent 工具软件风格收束。",
"last_update_notes": {
"v2.0.5.3 稳定性": "延续启动首页、插件扫描、反馈中心和日志展示修复;本版本进一步处理覆盖安装、语言资源和用户目录 runtime 残留。",
"v2.0.5.3 安装包体积": "上一版新增轻量安装包通道;本版本继续收束语言包和旧资源布局,避免无关文件混入发布目录。",
"v2.0.5.3 设置外观": "上一版加入窗口材质设置;本版本继续完善设置页控制中心、系统概况实时图表和中文本地化。"
},
"last_updated": "2026-06-14T00:00:00Z",
"tool_metadata": {},
"update_notes": {
"启动与覆盖安装": "修复覆盖安装后启动白屏或应用自行退出的问题;旧压缩语言布局不再回退复制到用户目录,失败时写入清晰日志并显示可读错误。",
"用户目录瘦身": "用户数据目录不再生成 Runtime、runtime、Runtimes 或 runtimes 文件夹;启动、自检和安装器都会清理旧 runtime 残留,避免大型运行时副本占用本机存储。",
"语言资源布局": "发布布局统一为纯 lang,保留 lang\\zh-CN 与 lang\\en-US;移除其他语言包、根目录 culture 目录和 resources\\lang 压缩残留。",
"启动自检": "迁移并改造旧版启动初始化思路:快速预检负责用户目录、设置、数据库、下载队列、安装根和关键资源;月度完整性检查在窗口可用后后台运行。",
"自检结果页": "服务状态页新增启动自检与安装完整性入口;查看结果前增加确认提示和加载进度,历史先加载摘要,用户选择后再读取完整明细,降低大量结果渲染造成的卡顿。",
"排行榜与资讯": "修复部分排行榜、热榜和资讯类工具因“已隐藏远程地址,仅展示脱敏来源名称”提示混入结构化解析而无法显示卡片内容的问题,同时继续隐藏远程地址。",
"工具箱与工具详情": "工具箱改为更高密度的原生 WinUI 工作台布局;工具内容区域按功能类型优化输入、结果、原始输出、复制、搜索和导出体验。",
"设置页": "修复设置页初始化失败;控制中心分页限制为 5 项可视并增加动态上下箭头提示;系统概况加入网格坐标、暗色绘图区和更多实时系统信息。",
"主题与视觉": "主题改为微软商店/媒体播放器式中性 Fluent 风格,移除渐变主视觉,蓝色作为主强调色,橙红仅用于更新、警告和风险行为。",
"天气胶囊": "补齐阴天、未知、离线等状态的基础图标和轻量动效,遵守关闭动画与高对比度设置。",
"本地化与日志": "修复工具箱与安全、风险确认、默认工具范围、设置弹窗和高频日志的中文模式英文漏出;反馈码和原始错误信息仍保留必要英文。"
}
}
+89
View File
@@ -0,0 +1,89 @@
{
"api_keys": {
"uapipro": ""
},
"app_version": "2.0.6.3",
"build": "3",
"channel": "stable",
"title": "YMhut Box 2.0.6.3",
"message": "本版本聚焦工具远程请求、QQ 信息查询、榜单资讯展示、工具页面布局和窗口拖动体验。远程工具请求更稳定,敏感接口地址继续隐藏,QQ 信息工具可展示新版接口返回的头像和资料字段。",
"message_md": "# YMhut Box 2.0.6.3\n\n本版本继续打磨工具工作台:远程工具请求更稳,QQ 信息查询升级到新版资料源,榜单和资讯外链可进入应用内安全浏览器,宽屏工具箱展示更多工具卡片,窗口拖动过程减少动画和重排。",
"release_notes": "升级 QQ 信息查询:按新版文档适配昵称、个性签名、头像、年龄、性别、QID、QQ 等级、VIP、注册时间和最后更新时间等字段;请求地址作为敏感信息隐藏,响应中的头像等公开链接可展示。优化远程工具请求:延长普通远程工具请求策略,超时和网络失败转为友好状态,不再直接显示 HttpClient.Timeout 英文异常。优化榜单与资讯展示:排行榜、热榜和资讯结果保留公开外链,默认通过应用内安全浏览器打开。优化工具箱布局:宽屏/最大化时减少右侧预览占位,把空间让给更多工具卡片。优化窗口拖动:进入拖动时启用轻量模式,降低 WebView 动画、悬浮刷新和不必要布局重算。补充面向用户的当前版本日志与总版本日志。",
"release_notes_md": "## 工具增强\n\n- QQ 信息查询按新版接口文档重做字段映射,支持昵称、个性签名、头像、年龄、性别、QID、QQ 等级、邮箱、VIP、SVIP、QQ 大会员、注册时间和最后更新时间。\n- QQ 信息查询的请求地址继续作为敏感信息隐藏;接口返回的头像等公开链接会作为图片结果展示。\n- 今日热榜、B 站热榜、知乎热榜、电影票房和资讯类结果保留公开外链,默认通过应用内安全浏览器打开。\n\n## 稳定性与体验\n\n- 远程工具请求使用更长的工具请求策略,GET 类请求支持一次短退避重试。\n- 超时、取消和网络失败会显示友好状态卡,不再把 `HttpClient.Timeout` 原始英文异常直接暴露给用户。\n- 宽屏/最大化工具箱减少右侧详情预览占位,优先展示更多工具卡片。\n- 窗口拖动时进入轻量模式,降低 WebView 动效、悬浮刷新和不必要布局重算,拖动更顺。\n\n## 结果展示\n\n- 排行榜和资讯卡片继续使用结构化结果块,支持排名、摘要、指标和外链。\n- 工具结果中的普通公开链接默认进入安全浏览器;显式“系统浏览器打开”入口才外跳。\n- 补齐当前版本公告与总版本日志,方便用户在更新页直接理解本次变化。",
"category_list": [
{
"icon": "data",
"id": "tools",
"name": "工具增强"
},
{
"icon": "shield",
"id": "privacy",
"name": "隐私与安全"
},
{
"icon": "monitor",
"id": "experience",
"name": "体验优化"
}
],
"detected_product": "YMhut Box",
"detected_packages": {
"YMhut Box": [
{
"version": "2.0.6.3",
"extension": "exe",
"fileName": "YMhut_Box_WinUI_Setup_2.0.6.3.exe",
"downloadPath": "/downloads/YMhut_Box_WinUI_Setup_2.0.6.3.exe",
"size": "待发布",
"sizeBytes": 0,
"updateDate": "2026-06-23",
"updateTime": "2026-06-23 00:00:00"
},
{
"version": "2.0.6.3",
"extension": "exe",
"fileName": "YMhut_Box_WinUI_Setup_2.0.6.3_Light.exe",
"downloadPath": "/downloads/YMhut_Box_WinUI_Setup_2.0.6.3_Light.exe",
"size": "待发布",
"sizeBytes": 0,
"updateDate": "2026-06-23",
"updateTime": "2026-06-23 00:00:00"
}
]
},
"download_mirrors": [
{
"enabled": true,
"id": "primary",
"name": "官方直连",
"sha256": "",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.6.3.exe"
},
{
"enabled": true,
"id": "light",
"name": "轻量安装包",
"sha256": "",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.6.3_Light.exe"
}
],
"download_url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.6.3.exe",
"home_notes": "v2.0.6.3 聚焦工具工作台体验:QQ 信息查询适配新版资料源,远程工具超时改为友好状态,榜单/资讯公开链接默认进入应用内安全浏览器,宽屏工具箱展示更多工具卡片,拖动窗口时启用轻量模式减少卡顿。",
"last_update_notes": {
"v2.0.6.2 稳定性": "上一版本重点修复安装和启动稳定性;本版本继续收口工具远程请求、结果展示和窗口拖动体验。",
"v2.0.6.2 工具展示": "上一版本完善工具工作台和结构化结果;本版本强化榜单、资讯、QQ 信息和公开外链展示。"
},
"last_updated": "2026-06-23T00:00:00Z",
"tool_metadata": {},
"update_notes": {
"QQ 信息查询": "适配新版 QQ 信息接口字段,支持头像、昵称、个性签名、等级、VIP、注册时间和最后更新时间展示;请求地址隐藏,头像链接可展示。",
"远程请求": "普通远程工具请求策略延长,GET 请求支持一次短重试;超时和网络失败显示友好状态卡。",
"榜单资讯": "排行榜和资讯结果保留公开外链,默认通过应用内安全浏览器打开。",
"工具箱布局": "宽屏和最大化时减少右侧详情预览占位,工具网格优先展示更多卡片。",
"拖动体验": "窗口拖动期间启用轻量模式,减少 WebView 动画、悬浮刷新和布局重算。",
"版本日志": "补齐当前版本公告并更新总版本日志,方便用户从更新页理解本次变化。"
}
}
+116
View File
@@ -0,0 +1,116 @@
{
"api_keys": {
"uapipro": ""
},
"app_version": "2.0.4",
"category_list": [
{
"icon": "monitor",
"id": "system",
"name": "系统工具"
},
{
"icon": "globe",
"id": "network",
"name": "网络工具"
},
{
"icon": "image",
"id": "graphics",
"name": "图像工具"
}
],
"detected_packages": {
"YMhut Box": [
{
"version": "2.0.4",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.4.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.4.exe",
"size": "108.19 MB",
"sizeBytes": 113447344,
"updateDate": "2026-05-25",
"updateTime": "2026-05-25 12:36:16"
},
{
"version": "2.0.3",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.3.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.3.exe",
"size": "49.44 MB",
"sizeBytes": 51840827,
"updateDate": "2026-05-20",
"updateTime": "2026-05-20 04:29:09"
},
{
"version": "2.0.2",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.2.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.2.exe",
"size": "49.96 MB",
"sizeBytes": 52381778,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 11:29:54"
},
{
"version": "2.0.1",
"extension": "exe",
"fileName": "YMhut_Box_Setup_2.0.1.exe",
"downloadPath": "/downloads/YMhut_Box_Setup_2.0.1.exe",
"size": "49.80 MB",
"sizeBytes": 52219648,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 01:14:36"
}
],
"YmhutBox": [
{
"version": "2.0.0",
"extension": "exe",
"fileName": "YmhutBox Setup 2.0.0.exe",
"downloadPath": "/downloads/YmhutBox Setup 2.0.0.exe",
"size": "44.75 MB",
"sizeBytes": 46921883,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 01:14:15"
},
{
"version": "1.3.2",
"extension": "exe",
"fileName": "YmhutBox Setup 1.3.2.exe",
"downloadPath": "/downloads/YmhutBox Setup 1.3.2.exe",
"size": "79.84 MB",
"sizeBytes": 83719658,
"updateDate": "2026-05-01",
"updateTime": "2026-05-01 01:13:58"
}
]
},
"detected_product": "YMhut Box",
"download_mirrors": [
{
"enabled": true,
"id": "primary",
"name": "官方直连",
"sha256": "2f321abc223d7e217b455049bbc2e9576948013053ba83e513fcf969e9441030",
"type": "direct",
"url": "https://update.ymhut.cn/downloads/YMhut_Box_Setup_2.0.4.exe"
}
],
"download_url": "https://update.ymhut.cn/downloads/YMhut_Box_Setup_2.0.4.exe",
"home_notes": "v2.0.3 主要修复 Windows 安装包构建与安装流程,安装包统一输出到 installer_output,并切换为 Inno Setup 7 优先构建;同时移除旧 MSIX 注册路径,降低安装后出现“注册失败”的概率。",
"last_update_notes": {
"v2.0.2 UI 与工具": "优化工具箱、设置页、服务状态页、反馈提示和工具页面布局,修复部分工具检查与数据源误报。",
"v2.0.2 安装包": "补齐 Flutter Windows Release 打包流程,修复缺少 DLL、快捷方式图标与安装后启动路径相关问题。",
"v2.0.2 脚本": "统一 run、debug、build 入口到 Dart 脚本,增强 UTF-8 控制台输出与 Windows 构建环境检测。"
},
"last_updated": "2026-05-20T04:16:00Z",
"tool_metadata": {
},
"update_notes": {
"发布信息": "更新中心公告、更新日志和上期更新内容已对齐到 2.0.3,便于客户端展示当前版本更新说明。",
"安装器": "安装包默认只输出到根目录 installer_output 文件夹;构建脚本优先使用 Inno Setup 7,并保留 Inno Setup 6 作为兼容回退。",
"安装稳定性": "安装流程改为稳定的 Flutter exe 安装模式,禁用旧版 MSIX 应用注册路径,避免安装结束后出现注册失败。"
}
}
+192
View File
@@ -0,0 +1,192 @@
{
"schema_version": 1,
"product": "YMhut Box",
"latest_version": "2.0.6.3",
"latest_notice_file": "2.0.6.3.json",
"last_updated": "2026-06-23T00:00:00Z",
"latest": {
"version": "2.0.6.3",
"build": "3",
"channel": "stable",
"title": "YMhut Box 2.0.6.3",
"message": "QQ 信息查询升级、远程工具请求友好化、榜单资讯外链进入安全浏览器、工具箱宽屏布局和窗口拖动体验优化。",
"release_date": "2026-06-23",
"download_url": "https://update.ymhut.cn/downloads/YMhut_Box_WinUI_Setup_2.0.6.3.exe",
"release_notes": "本版本升级 QQ 信息查询,适配新版接口返回的头像、昵称、个性签名、等级、会员状态和时间字段;敏感请求地址继续隐藏,头像等公开响应链接可展示。远程工具请求使用更长策略并支持一次短重试,超时和网络失败显示友好状态。榜单、资讯和公开链接默认通过应用内安全浏览器打开。宽屏工具箱减少右侧详情预览占位,窗口拖动期间启用轻量模式,降低 WebView 动效和布局重算。",
"message_md": "# YMhut Box 2.0.6.3\n\n本版本继续打磨工具工作台:QQ 信息查询升级到新版资料源,远程工具请求更稳,榜单和资讯外链默认进入应用内安全浏览器,宽屏工具箱展示更多工具卡片,窗口拖动过程减少动画和重排。",
"release_notes_md": "## 工具增强\n\n- QQ 信息查询按新版接口文档重做字段映射,支持头像、昵称、个性签名、QQ 等级、邮箱、VIP、SVIP、QQ 大会员、注册时间和最后更新时间。\n- QQ 信息查询的请求地址继续作为敏感信息隐藏;接口返回的头像等公开链接会作为图片结果展示。\n- 今日热榜、B 站热榜、知乎热榜、电影票房和资讯类结果保留公开外链,默认通过应用内安全浏览器打开。\n\n## 稳定性与体验\n\n- 远程工具请求使用更长的工具请求策略,GET 类请求支持一次短退避重试。\n- 超时、取消和网络失败会显示友好状态卡,不再把 `HttpClient.Timeout` 原始英文异常直接暴露给用户。\n- 宽屏/最大化工具箱减少右侧详情预览占位,优先展示更多工具卡片。\n- 窗口拖动时进入轻量模式,降低 WebView 动效、悬浮刷新和不必要布局重算,拖动更顺。"
},
"versions": [
{
"version": "2.0.6.3",
"channel": "stable",
"release_date": "2026-06-23",
"notice_file": "2.0.6.3.json",
"summary": "QQ 信息查询升级、远程工具请求友好化、榜单资讯外链进入安全浏览器、工具箱宽屏布局和窗口拖动体验优化。",
"highlights": [
"QQ 信息查询适配新版接口字段,支持头像、昵称、个性签名、QQ 等级、VIP、注册时间和最后更新时间展示。",
"敏感请求地址继续隐藏;接口返回的头像等公开链接可在结果中展示。",
"远程工具请求策略延长,GET 请求支持一次短退避重试,超时和网络失败转为友好状态卡。",
"排行榜、热榜和资讯结果保留公开外链,默认通过应用内安全浏览器打开。",
"宽屏和最大化工具箱减少右侧详情预览占位,优先展示更多工具卡片。",
"窗口拖动期间启用轻量模式,降低 WebView 动效、悬浮刷新和布局重算。",
"补齐当前版本公告并更新总版本日志,方便用户在更新页查看本次变化。"
],
"categories": {
"qq_profile": "QQ 信息工具按新版文档展示资料字段和头像图片,同时隐藏敏感请求地址。",
"remote_tools": "远程工具请求更稳,超时、取消和网络失败显示友好状态。",
"links": "榜单、资讯和公开链接默认进入应用内安全浏览器。",
"toolbox": "宽屏工具箱减少详情预览占位,提升工具卡片密度。",
"performance": "拖动窗口时进入轻量模式,降低动画和重排。",
"release_notes": "新增当前版本公告并更新总版本日志。"
}
},
{
"version": "2.0.6.2",
"channel": "stable",
"release_date": "2026-06-14",
"notice_file": "2.0.6.2.json",
"summary": "覆盖安装启动修复、纯 lang 中英双语布局、用户目录 runtime 清理、启动自检、Markdown 公告、媒体播放器、随机放映室和 WinUI 工具工作台体验更新。",
"highlights": [
"修复 EXE/latest 直启与覆盖安装后白屏退出,启动失败时写入清晰日志并显示可读错误。",
"发布布局统一为 lang/zh-CN 与 lang/en-US,移除旧资源和多余语言包残留。",
"用户数据目录不再生成 Runtime/runtime/Runtimes/runtimes 副本,启动、自检和安装器会清理旧残留。",
"新增启动快速预检与安装完整性检查,结果可在服务状态页查看、复制摘要并导出 JSON。",
"工具箱、工具详情和执行结果区升级为更高密度的原生 WinUI 工作台布局。",
"修复排行榜、热榜和资讯类工具因远程地址脱敏提示混入解析导致卡片无法生成的问题。",
"设置页、天气胶囊、系统概况、中文本地化和日志展示继续完善。",
"媒体播放器补齐常见格式入口,随机放映室支持图片、视频、音频三段式浏览和远程媒体重定向加载。"
],
"categories": {
"startup": "修复覆盖安装、latest 直启和启动错误提示。",
"storage": "清理用户目录 runtime 残留,降低存储占用。",
"language": "统一中英双语资源布局。",
"toolbox": "工具箱与结果区改为高密度 WinUI 工作台。",
"media": "增强媒体播放器和随机放映室。",
"notices": "公告、关于页和更新日志支持 Markdown。"
}
},
{
"version": "2.0.5.3",
"channel": "stable",
"release_date": "2026-06-05",
"notice_file": "2.0.5.3.json",
"summary": "启动首页、插件稳定性、反馈中心、设置材质、安装包体积和日志展示更新。",
"highlights": [
"修复启动后首页偶发白屏,并优化太阳系同步成功、失败和超时状态。",
"插件页优先显示已有结果,扫描失败时保留可用列表并提示重试。",
"反馈页生成本地加密反馈包,服务端后台可查看反馈单、发送记录和处理状态。",
"设置页新增窗口背景材质和局部材质选项,可持久保存。",
"顶部搜索框不再自动抢焦点,标题栏拖拽区域更完整。",
"保留完整离线包,同时新增轻量安装包通道并减少重复资源。"
],
"categories": {
"startup": "修复首页启动白屏并优化加载状态。",
"plugins": "增强插件宿主快照和扫描失败恢复。",
"feedback": "完善本地反馈包、加密提交、后台留档和状态查询。",
"appearance": "新增云母、亚克力和纯色回退材质设置。",
"packaging": "新增轻量安装包通道并整理重复资源。",
"logging": "增强日志中文展示和反馈包摘要。"
}
},
{
"version": "2.0.5",
"channel": "stable",
"release_date": "2026-05-30",
"notice_file": "2.0.5.json",
"summary": "WinUI 稳定性、安装目录归档、日志性能和插件系统可用性更新。",
"highlights": [
"安装目录采用资源归档方案,保留 .NET/WinUI 必需运行时文件并清理旧残留。",
"日志页首屏加载 30 条,剩余日志后台分批加载,列表改为虚拟化渲染。",
"插件扫描、宿主恢复、独立子窗口承载和内置 IPCheck 示例插件得到完善。",
"修复语言切换确认、来源信息展示、工具默认参数和多个页面布局问题。"
],
"categories": {
"installer": "安装引导、旧目录清理、资源归档和启动稳定性增强。",
"logging": "大量日志读取、搜索和展示性能优化。",
"plugins": "插件扫描恢复、独立窗口承载和示例插件完善。",
"ui": "日志筛选栏、插件卡片、工具箱分类和语言切换交互修复。",
"privacy": "工具结果隐藏来源 URL,默认示例参数使用中性域名。"
}
},
{
"version": "2.0.4",
"channel": "stable",
"release_date": "2026-05-25",
"notice_file": "example.json",
"summary": "WinUI 3 原生版本发布基线。",
"highlights": [
"迁移 Windows 发布线到 C#/.NET/WinUI 3。",
"新增设置、日志、HTTP/API、更新、窗口状态、启动项和系统指标服务层。",
"用静态 C# 工具目录和原生工具执行器替换旧运行时桥接。",
"补齐 MSIX/App Installer 和 Inno Setup 发布脚本。"
],
"categories": {
"runtime": "建立 WinUI 3 原生运行基线。",
"services": "补齐应用核心服务层。",
"packaging": "增加 Windows 安装包和更新发布流程。"
}
},
{
"version": "2.0.3",
"channel": "stable",
"release_date": "2026-05-20",
"notice_file": "",
"summary": "安装包构建与安装流程修复。",
"highlights": [
"安装包统一输出到 installer_output。",
"优先使用 Inno Setup 7 构建,并保留 Inno Setup 6 兼容回退。",
"调整旧 MSIX 注册路径,降低安装后注册失败概率。"
],
"categories": {
"installer": "修复 Windows 安装包构建和安装流程。",
"release": "整理安装产物输出目录。"
}
},
{
"version": "2.0.2",
"channel": "stable",
"release_date": "2026-05-01",
"notice_file": "",
"summary": "UI、工具页和 Windows 打包流程优化。",
"highlights": [
"优化工具箱、设置页、服务状态页、反馈提示和工具页面布局。",
"修复部分工具检查与数据源报错。",
"补齐 Windows Release 打包流程、缺失 DLL、快捷方式图标和安装后启动路径问题。",
"统一 run/debug/build 脚本入口并增强 UTF-8 控制台输出。"
],
"categories": {
"ui": "优化主要页面布局和交互。",
"tools": "修复部分工具和数据源问题。",
"build": "增强 Windows 构建脚本和环境检测。"
}
},
{
"version": "2.0.1",
"channel": "stable",
"release_date": "2026-05-01",
"notice_file": "",
"summary": "2.0.0 后的安装包和桌面发布修正版本。",
"highlights": [
"维护 Windows exe 安装包索引。",
"作为 2.0.x 桌面发布线的早期稳定性修正版本。"
],
"categories": {
"installer": "维护安装包发布。"
}
},
{
"version": "2.0.0",
"channel": "stable",
"release_date": "2026-05-01",
"notice_file": "",
"summary": "2.x Windows 桌面版本发布起点。",
"highlights": [
"建立 2.x 版本线的 Windows 桌面安装包基线。"
],
"categories": {
"release": "2.x 发布线起始版本。"
}
}
]
}
+4
View File
@@ -0,0 +1,4 @@
此文件夹根据项目根目录version.json存放相应版本的更新文件,其中example.json就是目前远程文件,请你根据情况不更改参数,但是可以更改参数内容。
你每次更新新增创建一个版本的更新文件,请你在total.json将每个版本日志总结完善。
2.0.0之前的版本是electron和tauri项目版本,你可以不写2.0.0之前版本说明。
+5
View File
@@ -0,0 +1,5 @@
{
"version": "2.0.7",
"build": "05",
"channel": "stable"
}
File diff suppressed because one or more lines are too long
+230
View File
@@ -0,0 +1,230 @@
\# AI全网最新资讯 - API 对接文档
\## 接口概览
该接口用于获取最近24小时内的全网AI最新资讯。内容涵盖模型发布/更新、开发工具/框架、学术研究/论文、公司/商业动态、应用案例/创意、技术问题讨论、伦理/安全等7个方面。数据缓存24小时,首次访问扣费,24小时内同一Key再次访问不重复扣费。
\## 请求地址
`https://api.pearapi.ai/api/latest\_ai\_consultative`
\## 请求方式
GET
\## 返回格式
JSON
\## 权限/付费要求
\- \*\*接口类型\*\*:免费接口
\- \*\*付费策略\*\*:首次请求扣费,24小时内同一Key重复请求不扣费。
\## 请求参数说明
| 参数名 | 是否必填 | 用途 |
| :--- | :--- | :--- |
| `key` | 是 | API Key值,用于身份验证。 |
\## 默认请求示例
```json
{
&#x20; "key": "xxx"
}
```
实际请求时,请将 `xxx` 替换为有效的API Key。
\## 返回字段说明
| 字段路径 | 类型 | 说明 |
| :--- | :--- | :--- |
| `code` | integer | 状态码。例如:200表示成功。 |
| `msg` | string | 状态信息。例如:“获取最新AI咨询成功”。 |
| `cache` | string | 是否命中缓存。 |
| `data` | object | 返回内容主体,包含所有分类的资讯数据。 |
| `data.image\_url` | string | AI报道的封面图片链接。 |
| `data.models\_and\_releases` | array | 模型发布/更新分类下的资讯列表。 |
| `data.models\_and\_releases\[].created\_at` | string | 资讯发布时间。 |
| `data.models\_and\_releases\[].title` | string | 资讯文章标题。 |
| `data.models\_and\_releases\[].summary` | string | 资讯文章详情摘要。 |
| `data.models\_and\_releases\[].source` | string | 资讯来源平台。 |
| `data.models\_and\_releases\[].url` | string | 资讯原文链接地址。 |
| `data.tools\_and\_frameworks` | array | 开发工具/框架分类下的资讯列表。元素结构与 `models\_and\_releases` 相同。 |
| `data.research\_and\_papers` | array | 学术研究/论文分类下的资讯列表。元素结构与 `models\_and\_releases` 相同。 |
| `data.industry\_and\_business` | array | 公司/商业动态分类下的资讯列表。元素结构与 `models\_and\_releases` 相同。 |
| `data.applications\_and\_use\_cases` | array | 应用案例/创意分类下的资讯列表。元素结构与 `models\_and\_releases` 相同。 |
| `data.technical\_discussions` | array | 技术问题讨论分类下的资讯列表。元素结构与 `models\_and\_releases` 相同。 |
| `data.ethics\_and\_safety` | array | 伦理/安全分类下的资讯列表。元素结构与 `models\_and\_releases` 相同。 |
| `data.models\_and\_architectures` | array | 未提供说明。 |
| `data.engineering\_and\_tools` | array | 未提供说明。 |
| `data.papers\_and\_research` | array | 未提供说明。 |
| `data.industry\_news` | array | 未提供说明。 |
| `api\_source` | string | 返回数据来源说明。 |
\## 返回示例
```json
{
&#x20; "code": 200,
&#x20; "msg": "获取最新AI咨询成功",
&#x20; "cache": true,
&#x20; "data": {
&#x20; "image\_url": "https://api.pearapi.ai/cache/images/2026-01-04/f658f4a2-8319-49b3-859d-4b5955c49e86.jpg",
&#x20; "models\_and\_releases": \[
&#x20; {
&#x20; "created\_at": "2026-01-04 15:06:49",
&#x20; "title": "Kimi 发布新模型 kiwi-do 并在 LM Arena 开启测试",
&#x20; "summary": "Kimi 旗下的新模型 kiwi-do 正式在 Chatbot Arena (lmarena) 平台上线并开启公开测试。该模型旨在通过竞技场实测收集用户反馈,以评估其在真实对话和复杂指令遵循方面的性能表现。这一动态显示了 Kimi 在模型迭代上的持续发力,通过公开竞技场测试有助于提升其在全球主流模型排名中的透明度与认可度。",
&#x20; "source": "linux.do",
&#x20; "url": "https://linux.do/t/topic/1403800"
&#x20; }
&#x20; ],
&#x20; "tools\_and\_frameworks": \[
&#x20; "省略"
&#x20; ],
&#x20; "research\_and\_papers": \[
&#x20; "省略"
&#x20; ],
&#x20; "industry\_and\_business": \[
&#x20; "省略"
&#x20; ],
&#x20; "applications\_and\_use\_cases": \[
&#x20; "省略"
&#x20; ],
&#x20; "technical\_discussions": \[
&#x20; "省略"
&#x20; ],
&#x20; "ethics\_and\_safety": \[
&#x20; "省略"
&#x20; ],
&#x20; "models\_and\_architectures": \[],
&#x20; "engineering\_and\_tools": \[],
&#x20; "papers\_and\_research": \[],
&#x20; "industry\_news": \[]
&#x20; },
&#x20; "api\_source": "官方API网:https://api.pearapi.ai/"
}
```
\## 对接注意事项
1\. \*\*Key验证\*\*:所有请求都必须携带有效的 `key` 参数,否则请求将被拒绝。
2\. \*\*缓存机制\*\*:接口数据缓存24小时。在缓存有效期内,使用相同的 `key` 再次请求将直接返回缓存数据,不会产生新的扣费。
3\. \*\*数据分类\*\*:返回的 `data` 对象中包含多个分类数组,每个数组内的元素结构均与示例中的 `models\_and\_releases` 数组元素一致(包含 `created\_at`, `title`, `summary`, `source`, `url` 字段)。
4\. \*\*空数组\*\*:示例中 `models\_and\_architectures``engineering\_and\_tools` 等字段可能返回空数组,表示该时段内无对应分类的资讯。
\## 给AI助手的实现建议
1\. \*\*请求构建\*\*:使用HTTP GET方法,将 `key` 作为查询参数附加到URL上。例如:`https://api.pearapi.ai/api/latest\_ai\_consultative?key=你的Key`
2\. \*\*错误处理\*\*:建议检查返回的 `code` 字段。若 `code` 不为200,应根据 `msg` 字段内容进行错误提示。
3\. \*\*数据解析\*\*:解析JSON响应后,优先处理 `data` 对象下的 `models\_and\_releases``tools\_and\_frameworks` 等数组字段。遍历每个数组中的元素,提取 `title``summary``source``url``created\_at` 等信息进行展示。
4\. \*\*缓存判断\*\*:可以通过 `cache` 字段判断返回的数据是否为缓存数据,用于日志记录或调试。
5\. \*\*付费逻辑\*\*:无需在客户端实现复杂的付费逻辑,只需正常调用接口即可。服务端会自动处理首次扣费和缓存期内免扣费的策略。
@@ -0,0 +1,178 @@
\### 接口概览
本接口用于获取各大平台今日热榜的排行数据。不传入任何参数时,将返回支持的平台列表(如 36氪、哔哩哔哩、知乎等)。传入指定平台标题后,可获取该平台的热点排行详情。
\### 请求地址
`https://api.pearapi.ai/api/dailyhot/`
\### 请求方式
GET
\### 返回格式
JSON
\### 权限/付费要求
免费接口,无需付费或特殊权限。
\### 请求参数说明
| 参数名 | 是否必填 | 用途 |
| :--- | :--- | :--- |
| `title` | 是 | 平台标题,用于指定要获取热榜的平台,例如“哔哩哔哩”。不传入此参数时,接口返回所有支持的平台列表。 |
\### 默认请求示例
```json
{
&#x20; "title": "哔哩哔哩"
}
```
对应的实际请求 URL 示例为:
`https://api.pearapi.ai/api/dailyhot/?title=哔哩哔哩`
\### 返回字段说明
| 字段路径 | 类型 | 描述 |
| :--- | :--- | :--- |
| `code` | integer | 状态码,表示请求结果 |
| `name` | string | 平台名称,如“哔哩哔哩” |
| `title` | string | 热点标题 |
| `type` | string | 榜单名称,如“热门视频” |
| `description` | string | 平台描述 |
| `link` | string | 来源目标链接 |
| `total` | integer | 获取到的热点数量 |
| `updateTime` | string | 数据更新时间 |
| `formCache` | string | 是否从缓存中获取(“是”或“否”) |
| `data` | string | 返回的热点数据列表,内部包含多个热点对象 |
| `data\[].id` | integer | 热点ID |
| `data\[].desc` | string | 热点描述 |
| `data\[].cover` | string | 热点封面图片链接 |
| `data\[].hot` | string | 热点热度数值 |
| `data\[].timestamp` | string | 热点时间戳 |
| `data\[].url` | string | 热点链接 |
| `data\[].mobileUrl` | string | 热点手机端链接 |
\### 返回示例
由于原配置中未提供示例结果,以下为根据字段结构构造的典型返回示例:
```json
{
&#x20; "code": 200,
&#x20; "name": "哔哩哔哩",
&#x20; "title": "哔哩哔哩热门视频",
&#x20; "type": "热门视频",
&#x20; "description": "哔哩哔哩弹幕视频网热门内容",
&#x20; "link": "https://www.bilibili.com/",
&#x20; "total": 50,
&#x20; "updateTime": "2025-04-10 12:00:00",
&#x20; "formCache": "否",
&#x20; "data": \[
&#x20; {
&#x20; "id": 1,
&#x20; "desc": "这是一个热门视频的简介",
&#x20; "cover": "https://example.com/cover.jpg",
&#x20; "hot": "123456",
&#x20; "timestamp": "2025-04-10 11:30:00",
&#x20; "url": "https://www.bilibili.com/video/example",
&#x20; "mobileUrl": "https://m.bilibili.com/video/example"
&#x20; }
&#x20; ]
}
```
\### 对接注意事项
1\. \*\*参数传递\*\*`title` 参数必须通过 URL 查询字符串传递,如 `?title=哔哩哔哩`
2\. \*\*平台名称\*\*`title` 的值需与接口返回的平台列表中的名称完全一致,包括大小写和标点符号。
3\. \*\*返回结构\*\*:当不传入 `title` 时,返回的数据结构可能与传入 `title` 时不同,建议先测试无参数请求以获取平台列表。
4\. \*\*数据时效性\*\*`updateTime``formCache` 字段可判断数据是否为最新,建议根据业务需求决定是否信任缓存数据。
\### 给 AI 助手的实现建议
1\. \*\*请求构建\*\*:使用 HTTP GET 方法,将 `title` 参数附加到 URL 后。如果用户未提供 `title`,则直接请求基础 URL。
2\. \*\*错误处理\*\*:检查返回的 `code` 字段,非 200 时视为请求失败,需提示用户或重试。
3\. \*\*数据解析\*\*`data` 字段是一个数组,需遍历处理每个热点对象,提取 `id``desc``cover``hot``timestamp``url``mobileUrl` 等字段。
4\. \*\*平台列表获取\*\*:若用户未指定平台,可先调用无参数接口获取平台列表,再引导用户选择。
5\. \*\*编码问题\*\*:URL 中的中文字符(如“哔哩哔哩”)需进行 URL 编码,确保请求正确。
+102
View File
@@ -0,0 +1,102 @@
\### 接口概览
该接口用于获取今天日期所发生的历史事件数据。
\### 请求地址
`https://api.pearapi.ai/api/lsjt/`
\### 请求方式
GET
\### 返回格式
JSON
\### 权限/付费要求
免费接口(无权限或付费要求)
\### 请求参数说明
| 参数名 | 是否必填 | 用途 |
| :--- | :--- | :--- |
| `type` | 否 | 指定返回数据的格式。可选值:`text`(返回纯文本),`json`(返回JSON数据)。 |
\### 默认请求示例
```json
{
&#x20; "type": "json"
}
```
对应的实际请求URL为:`https://api.pearapi.ai/api/lsjt/?type=json`
\### 返回字段说明
| 字段路径 | 类型 | 说明 |
| :--- | :--- | :--- |
| `code` | 字符串 | 状态码 |
| `msg` | 字符串 | 状态信息 |
| `time` | 字符串 | 时间(时间戳) |
| `data` | 字符串 | 返回内容(历史事件数据的具体内容) |
\### 返回示例
未提供。
\### 对接注意事项
1\. `type` 参数不是必填项,如果不传,将使用默认格式(具体默认格式请参考接口实际表现,文档未明确)。
2\. 返回的 `data` 字段为字符串类型,其内容格式取决于请求时 `type` 参数的值。如果请求 `type``json`,则 `data` 字段可能包含一个JSON格式的字符串,需要进一步解析。
3\. 接口返回的 `code` 字段用于判断请求是否成功,建议在代码中对其进行校验。
\### 给 AI 助手的实现建议
1\. \*\*请求构建\*\*:使用标准 HTTP GET 请求,将 `type` 参数作为查询字符串(Query String)附加在 URL 后。
2\. \*\*响应处理\*\*:首先将整个响应体解析为 JSON 对象。
3\. \*\*数据校验\*\*:检查解析后的 JSON 对象中的 `code` 字段,确认请求是否成功。
4\. \*\*数据提取\*\*:从 JSON 对象中提取 `data` 字段。注意,`data` 字段本身是一个字符串,如果请求的 `type``json`,你需要再次尝试将 `data` 字段的值解析为 JSON 对象,以便获取结构化的历史事件列表。
+182
View File
@@ -0,0 +1,182 @@
\### 接口概览
本接口用于查询城际之间的出行路线信息,包括路线、距离、耗时、油费、过桥费、总费用及路况等详细数据。
\### 请求地址
`https://api.pearapi.ai/api/citytravelroutes/`
\### 请求方式
GET
\### 返回格式
JSON
\### 权限/付费要求
免费接口,无需付费或特殊权限。
\### 请求参数说明
| 参数名 | 是否必填 | 用途 |
| :--- | :--- | :--- |
| from | 是 | 出发地,例如“广州” |
| to | 是 | 目的地,例如“深圳” |
\### 默认请求示例
```json
{
&#x20; "from": "广州",
&#x20; "to": "深圳"
}
```
对应的实际请求 URL 示例为:`https://api.pearapi.ai/api/citytravelroutes/?from=广州\&to=深圳`
\### 返回字段说明
| 字段路径 | 类型 | 说明 |
| :--- | :--- | :--- |
| code | integer | 状态码 |
| msg | string | 状态信息 |
| from | string | 出发地 |
| to | string | 目的地 |
| data | string | 返回内容(可能包含路线列表或详细信息的字符串) |
| corese | string | 路线描述 |
| distance | string | 总距离 |
| time | string | 总耗时 |
| fuelcosts | string | 油费 |
| bridgetoll | string | 过桥费 |
| totalcost | string | 总费用 |
| roadconditions | string | 路况 |
\### 返回示例
原始接口配置中未提供返回示例(`example\_result` 字段为空),因此无法提供。请在实际对接时根据接口返回进行解析。
\### 对接注意事项
1\. \*\*参数传递方式\*\*:请求参数必填,通过 URL 查询字符串(Query String)的方式传递。
2\. \*\*编码问题\*\*:请求参数中的中文(如“广州”、“深圳”)需要进行 URL 编码(例如 UTF-8 编码)。
3\. \*\*返回数据结构\*\*:返回的 JSON 对象中,`data` 字段类型为字符串,可能包含结构化的文本信息,解析时需注意。
4\. \*\*字段类型\*\*`distance``time``fuelcosts``bridgetoll``totalcost` 等字段虽然定义为字符串,但通常包含数字和单位(如“120公里”、“1.5小时”),提取数值时需进行字符串处理。
\### 给 AI 助手的实现建议
1\. \*\*请求构建\*\*:使用 HTTP GET 方法,将 `from``to` 参数作为 URL 的查询参数附加到基础 URL 后。
2\. \*\*参数编码\*\*:务必对 `from``to` 参数的值进行 URL 编码,以正确处理中文和特殊字符。
3\. \*\*响应处理\*\*:将返回的 JSON 字符串解析为对象(如 Python 的 `json` 模块,JavaScript 的 `JSON.parse`)。
4\. \*\*错误处理\*\*:检查返回的 `code` 字段值,判断请求是否成功。建议实现超时和重试机制。
5\. \*\*数据提取\*\*:对于 `distance``time` 等字段,如果需要纯数值,可以使用正则表达式提取数字部分。例如,从“120公里”中提取“120”。
6\. \*\*示例代码(Python\*\*
&#x20; ```python
&#x20; import requests
&#x20; import json
&#x20; def query\_city\_travel\_routes(from\_location, to\_location):
&#x20; url = "https://api.pearapi.ai/api/citytravelroutes/"
&#x20; params = {
&#x20; "from": from\_location,
&#x20; "to": to\_location
&#x20; }
&#x20; try:
&#x20; response = requests.get(url, params=params)
&#x20; response.raise\_for\_status() # 检查请求是否成功
&#x20; data = response.json()
&#x20; if data.get("code") == 200: # 假设成功状态码为200
&#x20; return data
&#x20; else:
&#x20; print(f"接口返回错误: {data.get('msg')}")
&#x20; return None
&#x20; except requests.exceptions.RequestException as e:
&#x20; print(f"请求失败: {e}")
&#x20; return None
&#x20; # 使用示例
&#x20; result = query\_city\_travel\_routes("广州", "深圳")
&#x20; if result:
&#x20; print(json.dumps(result, ensure\_ascii=False, indent=2))
+258
View File
@@ -0,0 +1,258 @@
\---
title: "查询 QQ 信息"
locale: zh-CN
canonical: https://uapis.cn/docs/api-reference/get-social-qq-userinfo
source: https://uapis.cn/docs/api-reference/get-social-qq-userinfo.md
\---
\# 查询 QQ 信息
\*\*分类:\*\* 社交
通过 QQ 号查询用户资料,返回头像、昵称、个性签名、等级和 VIP 信息。
\## 功能概述
这个接口适合用在用户资料展示、头像卡片、账号绑定结果展示等场景。若用户把 QQ 等级设为隐藏,`qq\_level` 会返回 `null`
\## 数据字段说明
\- \*\*基础信息\*\*: 昵称、个性签名、头像、年龄、性别
\- \*\*联系信息\*\*: QQ 邮箱、个性域名(QID
\- \*\*等级信息\*\*: QQ 等级、VIP 状态和等级
\- \*\*时间信息\*\*: 注册时间、最后更新时间
\## API 端点
\*\*方法:\*\* GET
\*\*路径:\*\* /social/qq/userinfo
\*\*完整API地址:\*\* https://uapis.cn/api/v1/social/qq/userinfo
\*\*文档页面:\*\* https://uapis.cn/docs/api-reference/get-social-qq-userinfo
\## 响应
\### 200 / 请求成功
成功响应,返回QQ用户的详细信息
```json
{
&#x20; // QQ号
&#x20; "qq": "10001",
&#x20; // 用户昵称
&#x20; "nickname": "小明",
&#x20; // 个性签名
&#x20; "long\_nick": "今天天气真不错",
&#x20; // 头像URL
&#x20; "avatar\_url": "http://q.qlogo.cn/g?b=qq\&nk=10001\&s=640",
&#x20; // 年龄
&#x20; "age": 25,
&#x20; // 性别
&#x20; "sex": "男",
&#x20; // QQ个性域名
&#x20; "qid": "xiaoming2024",
&#x20; // QQ等级。用户隐藏时返回 null
&#x20; "qq\_level": 64,
&#x20; // 地理位置(省市)
&#x20; "location": "广东 深圳",
&#x20; // QQ邮箱
&#x20; "email": "10001@qq.com",
&#x20; // 是否为VIP用户
&#x20; "is\_vip": true,
&#x20; // 是否为年费VIP用户
&#x20; "is\_years\_vip": true,
&#x20; // 是否为SVIP用户
&#x20; "is\_svip": false,
&#x20; // 是否为QQ大会员用户
&#x20; "is\_big\_club": true,
&#x20; // 会员开通状态
&#x20; "vip\_status": 1,
&#x20; // 会员类型
&#x20; "vip\_type": 3,
&#x20; // VIP等级
&#x20; "vip\_level": 7,
&#x20; // QQ大会员等级
&#x20; "big\_club\_level": 1,
&#x20; // 黄钻等级(可选)
&#x20; "yellow\_diamond\_level": 10,
&#x20; // 绿钻等级(可选)
&#x20; "green\_diamond\_level": 9,
&#x20; // 腾讯影视会员等级(可选)
&#x20; "video\_vip\_level": 7,
&#x20; // 情侣/恋人类会员等级(可选)
&#x20; "lover\_vip\_level": 2,
&#x20; // 部分特权图标状态
&#x20; "privilege\_icons": {
&#x20; // VIP图标是否点亮
&#x20; "vip": true,
&#x20; // SVIP图标是否点亮
&#x20; "svip": false,
&#x20; // 年费VIP图标是否点亮
&#x20; "years\_vip": true,
&#x20; // QQ大会员图标是否点亮
&#x20; "big\_club": true
&#x20; },
&#x20; // 注册时间(ISO 8601格式)
&#x20; "reg\_time": "2008-03-15T10:30:00Z",
&#x20; // 最后更新时间(ISO 8601格式)
&#x20; "last\_updated": "2024-08-14T15:45:30Z"
}
```
\### 400 / 错误的请求
缺少或无效的qq参数
```json
{
&#x20; "code": "INVALID\_ARGUMENT",
&#x20; "details": {},
&#x20; "message": "Missing or invalid 'qq' parameter."
}
```
\### 404 / 未找到
获取QQ用户信息失败或用户不存在
```json
{
&#x20; "code": "NOT\_FOUND",
&#x20; "details": {},
&#x20; "message": "Failed to retrieve QQ user info, user may not exist."
}
```
\## 查询参数
\- \*\*`qq`\*\* (string) - 必填
&#x20; 需要查询的QQ号
&#x20; 示例:`10001`
&#x20; 提示:纯数字的QQ号。
@@ -0,0 +1,180 @@
好的,这是为您整理的猫眼电影实时票房排行接口对接文档,可直接用于指导AI编程助手进行开发。
\### 猫眼电影实时票房排行 - 接口对接文档
\#### 接口概览
本接口用于获取猫眼电影最新的实时票房排行数据,返回当天热门电影的票房、排片、上座率等关键指标。
\#### 请求地址
`https://api.pearapi.ai/api/maoyan/`
\#### 请求方式
GET
\#### 返回格式
JSON
\#### 权限/付费要求
免费接口,无需付费或特殊权限。
\#### 请求参数说明
无。该接口为GET请求,无需任何请求参数。
\#### 默认请求示例
```json
{}
```
\#### 返回字段说明
返回数据为JSON对象,包含顶层字段和嵌套在`data`字段中的数组。`data`字段是一个数组,每个元素代表一部电影的票房数据。
| 字段路径 | 类型 | 说明 |
| :--- | :--- | :--- |
| `code` | integer | 状态码,通常200表示成功。 |
| `msg` | string | 状态信息,例如“success”。 |
| `time` | string | 当前时间。 |
| `data` | array | 票房排行列表,包含多个电影对象。 |
| `data\[].top` | integer | 排行,例如1、2、3。 |
| `data\[].movieName` | string | 电影名。 |
| `data\[].releaseInfo` | string | 上映天数,例如“上映6天”。 |
| `data\[].sumBoxDesc` | string | 总票房,例如“2.53亿”。 |
| `data\[].boxRate` | string | 票房占比,例如“42.5%”。 |
| `data\[].showCount` | integer | 排场次数。 |
| `data\[].showCountRate` | string | 排片占比,例如“35.2%”。 |
| `data\[].avgShowView` | string | 场均人次。 |
| `data\[].avgSeatView` | string | 上座率,例如“12.3%”。 |
\#### 返回示例
由于原始配置中未提供示例结果,以下是根据字段说明构造的示例,实际返回数据可能略有差异。
```json
{
&#x20; "code": 200,
&#x20; "msg": "success",
&#x20; "time": "2024-05-20 14:30:00",
&#x20; "data": \[
&#x20; {
&#x20; "top": 1,
&#x20; "movieName": "示例电影A",
&#x20; "releaseInfo": "上映6天",
&#x20; "sumBoxDesc": "2.53亿",
&#x20; "boxRate": "42.5%",
&#x20; "showCount": 123456,
&#x20; "showCountRate": "35.2%",
&#x20; "avgShowView": "45",
&#x20; "avgSeatView": "12.3%"
&#x20; },
&#x20; {
&#x20; "top": 2,
&#x20; "movieName": "示例电影B",
&#x20; "releaseInfo": "上映13天",
&#x20; "sumBoxDesc": "1.87亿",
&#x20; "boxRate": "28.1%",
&#x20; "showCount": 98765,
&#x20; "showCountRate": "28.5%",
&#x20; "avgShowView": "38",
&#x20; "avgSeatView": "10.1%"
&#x20; }
&#x20; ]
}
```
\#### 对接注意事项
1\. \*\*无参数请求\*\*:直接对请求地址发起GET请求即可,无需拼接任何查询参数。
2\. \*\*数据解析\*\*:请注意`data`字段是一个数组,需要遍历获取每部电影的排行数据。
3\. \*\*字段类型\*\*`showCount`为整数类型,其余数字相关字段(如`boxRate``showCountRate`)为字符串类型,其中可能包含“%”等符号,在需要进行数学计算时需先进行字符串处理。
\#### 给AI助手的实现建议
1\. \*\*发起请求\*\*:使用HTTP客户端库(如Python的`requests`、JavaScript的`axios``fetch`)对 `https://api.pearapi.ai/api/maoyan/` 发起一个不带任何body和params的GET请求。
2\. \*\*错误处理\*\*:检查返回的`code`字段是否为200。如果不是,可以根据`msg`字段进行错误提示。
3\. \*\*数据提取\*\*:成功获取数据后,从返回的JSON对象中提取`data`数组,然后遍历该数组,按需求提取`top``movieName``sumBoxDesc`等字段。
4\. \*\*数据展示\*\*:由于`boxRate``showCountRate`等字段是包含百分号的字符串,如果需要在图表中展示或进行排序,建议先转换为浮点数。