Repository navigation
Releases: luckwalter/JavSP-fork
Release list
JavSP-fork v0.4.8
JavSP-fork v0.4.8 — 五大翻译通道全量加固
一次性把 Google / 百度 / Bing / Claude / OpenAI 兼容(含本地 Ollama、LM Studio)五个通道
各自的历史缺陷集中修掉,并把散落各处的「是否走代理」收敛成一个用户可手动选择的开关。
随后又跑了一轮安全与性能审查,把查出的 7 项缺陷(B-014 ~ B-020)一并修完。
⚠️ 测试状态(务必先读)
本版本改动面较大,维护者没有能力对所有通道做端到端实机验证 —— 百度 / Bing / Claude
等通道需要付费账号或额度,目前暂时测不了。已完成的是离线验证:
- 回归测试 108 项全部通过(原 66 项 + 新增 42 项),全部 mock、不联网;
- 仅 Google 通道做过真实连通性验证。
也就是说:除 Google 外的四个通道,修复效果是「按官方文档与代码缺陷推导」的结果,
还没有真机跑通记录。
📮 欢迎反馈各通道实测结果(最好带 log)
无论成功失败,都欢迎开 issue 反馈,这直接决定后续修复优先级。请带上:
| 要提供什么 | 说明 |
|---|---|
| 引擎 + 关键配置 | 如 baidu、bing(region=eastasia)、claude(model=...)、openai(url=局域网 Ollama) |
| 目标语种 / 是否勾选「使用统一代理」 | 这两项决定走哪条分支 |
| 界面报错原文 | 设置页「测试」按钮的返回结果即可 |
| 日志片段 | 桌面版:运行目录 JavSP.log;Docker:docker logs javsp。logger 名 javsp.web.translate |
脱敏提醒:贴配置和 log 前请先自行替换
app_id/api_key/ 代理地址 / 局域网 IP。
各通道要点
- Google:429 退避不再全局累加(旧实现一次限流后所有后续请求都被拖长);
错误码不再KeyError;非 JSON 响应(拦截页)转为可读报错。 - 百度:错误码汉化(
54003: Invalid Access Limit→ 「访问频率受限(QPS 超限)…」);
QPS 节流改为锁内预约时间槽(旧实现多线程下形同虚设),新增qps配置;
无trans_result时不再静默产出空译文。 - Bing:女优名用动态词典保护 + XML 属性转义;新增
region配置(单服务资源必填,
否则 401001 无从排查);空响应不再IndexError;NFO 原文断句不再被词典标记污染。 - Claude / OpenAI:Claude 默认模型从已被官方硬退役的
claude-3-haiku-20240307
换成claude-haiku-4-5-20251001,model可自行指定;OpenAI 兼容端api_key可留空
(本地 Ollama / LM Studio 不需要鉴权)。 - 共性:长文本按引擎上限自动分段再拼接;新增 sqlite 翻译缓存(key 含引擎+模型+语种+
prompt+文本,换模型/改提示词自动失效,只缓存成功结果);「使用统一代理」开关通用化,
对所有引擎一视同仁。 - 设置页:新增「测试」按钮 —— 用尚未保存的界面配置真实跑一次翻译,保存前即可
确认引擎/密钥/端点/代理是否配对。
第二轮加固(B-014 ~ B-020)
| 编号 | 问题 | 修法 |
|---|---|---|
| B-014 | 「测试」端点可被当作回显型 SSRF 与配额消耗器;pydantic 报错会回显含 api_key 的输入 |
URL 只允许 http(s)、屏蔽云元数据地址、同客户端 3 秒最小间隔、报错只回显字段位置与原因 |
| B-015 | Bing 女优名标记互为子串时嵌套,产出畸形 XML | 按长度降序 + 一次性正则替换 |
| B-016 | Google 成功路径固定 sleep(4) 且按段计;429 退避无总预算 |
改引擎级 2 秒节流(线程共享);退避加 120 秒累计预算 |
| B-017 | Google 单段 6000 字节 → URL 膨胀到约 18K 字符 | 上限收紧到 1800 字节 |
| B-018 | 异常信息里带出完整 URL(百度 appid/sign 在查询串上) |
统一抹掉 URL 查询串并截断 |
| B-019 | 翻译缓存无条数上限;清理后不 VACUUM,占用字节纹丝不动 |
上限 20000 + 淘汰最旧;清理后 VACUUM |
| B-020 | 分段拼接丢换行,百度段落语义丢失 | 百度按换行拼接,Google / Bing 保持空串 |
B-014 取舍:没有禁掉私有 / 回环网段 —— 禁掉会直接废掉本地与局域网 Ollama 这个核心
场景,只挡云元数据地址。要真正防「别人用你的额度」,请设置JAVSP_AUTH_PASSWORD开启认证。
升级说明
- 旧配置无需改动即可升级:所有新字段都有兼容默认值。
- Docker:
docker load镜像 tar.gz 后重建容器即可(配置在挂载卷,不受影响)。 - Windows:下载 zip 覆盖安装目录(
config.yml与会话不会被覆盖)。 ⚠️ v0.4.5 之前的版本内置升级助手有缺陷,从那些版本点「立即升级」会失败,
需手动下载 zip 覆盖一次,之后即可正常一键升级。
资产
| 文件 | 说明 |
|---|---|
JavSP-0.4.8-windows.zip |
Windows 桌面版(便携,解压即用) |
javsp-fork-0.4.8-image.tar.gz |
Docker 镜像(docker load 后使用) |
javsp-fork-0.4.8.sha256 |
上面两个资产的 SHA-256 校验值 |
JavSP-fork v0.4.7
JavSP-fork v0.4.7 发布说明
派生自 Yuukiy/JavSP 的带 WEBUI 刮削器。本版本是一个纯修复版本:
修复「立即升级」失败后旧版本被藏进子目录、主目录看起来像文件全被删的问题。
无新增功能,Windows 桌面版可平滑升级。
本次要点
修复:升级失败后,文件"消失"实则被藏起来了
现象
在网络驱动器上点「立即升级」后,主目录里 JavSP.exe、config.yml、update/ 全部消失,只剩一个空的 _internal。数据其实完好,被移到了下一层目录:Downloads/JavSP/JavSP.bak/。
根因(两个缺陷叠加)
① 网络驱动器上整目录改名不可靠
QNAP 的 Downloads 共享(/share/Downloads 是符号链接 → CACHEDEV2_DATA/Downloads)拒绝枚举深层目录,Move-Item 改名运行目录时报「对路径 …\_internal 的访问被拒绝」,10 次重试全部失败。
(旁证:NAS 服务端 getfacl 显示权限完全正常,但 SMB 客户端一列该目录即被拒;单文件读取却正常 —— 纯 SMB 目录枚举问题,与权限无关。)
② 回滚逻辑写错了
Move-Item -Path $bak -Destination $exeDir 缺 -Force。此时目标目录已被复制步骤重建,于是该命令不是"替换",而是把备份移进该目录 → 变成 JavSP/JavSP.bak/,主目录因此"空无一物"。
修复
- 枚举预检(动数据之前):先用一次目录枚举探路。若"目录里有 exe 却列不出任何条目",说明该路径不支持改名,立即中止升级,一个字节都不动,并明确提示改用本地磁盘运行或手动下载 zip 覆盖。
- 回滚不再嵌套:先把不完整的新目录挪到
<运行目录>.failed,再把备份带-Force移回原位。 - 失败必留路径:无论成败,catch 块末尾都输出「运行目录 / 旧版备份 / 不完整副本」三个路径,并提示"若主目录里找不到 exe,请到旧版备份路径取回"。
安装 / 升级
Docker(推荐,NAS / 服务器)
docker load -i javsp-fork-0.4.7-image.tar.gz
docker restart javsp容器内版本以
/api/health返回的version为准;界面右下角显示版本号。
Windows 桌面版
- 下载
JavSP-0.4.7-windows.zip,解压到任意目录(便携,exe 同级即数据目录)。 - 升级已有安装:启动旧版 → 设置页「软件更新」→「立即升级」会自动完成下载、替换并保留
config.yml/.sessions.json/JavSP.log;或直接把新 zip 内容覆盖到旧目录(保留旧config.yml)。 - 首次使用请把自己的
config.yml放到 exe 同级。
强烈建议:桌面版装在本地磁盘(如
C:\JavSP)运行。
网络驱动器上的"整目录改名"类操作不可靠,升级必然失败。
NAS 上请用 Docker 形态。v0.4.7 起,升级助手会在动数据之前自行检测并中止,
不会再出现"文件看起来全没了"的情况,但升级仍需手动覆盖。
校验
下载后可用发布资产 javsp-fork-0.4.7.sha256 核对(含 windows.zip 与 image.tar.gz 两个值):
sha256sum -c javsp-fork-0.4.7.sha256回归验证
- 6 个指定回归用例文件 + 缩略图用例 + 本次新增 3 项,共 60/60 通过。
- Windows 桌面版 exe 实跑:
/api/health返回version=0.4.7、status=ok;
生成的升级助手脚本确认含枚举预检(Get-ChildItem)与不嵌套回滚(.failed)。 - NAS 部署后
/api/health返回version=0.4.7、container=true;前端资产名与构建一致;
容器内update.py确认含预检与.failed回滚逻辑;挂载卷config.yml未被改动。
附注
- 本版本 Docker 端仅同步源码(含本次修复),无容器运行时行为变化。
- 历史 CHANGELOG 中保留的早期部署位置描述(如本机安装目录、网盘共享名)属已发布记录,本次未做破坏性清洗。
- 完整变更见仓库
CHANGELOG_FORK.md的 v0.4.7 段。
JavSP-fork v0.4.6
JavSP-fork v0.4.6 发布说明
派生自 Yuukiy/JavSP 的带 WEBUI 刮削器。本版本为功能增强版:
「结果审阅」页新增各渠道封面缩略图,让不同来源的封面能并排比对,
不用等整理落盘后才发现选错了图;并配套一套可管理的本地缓存。
无破坏性变更,Docker 与 Windows 桌面版均可平滑升级。
本次要点
审阅页渠道封面缩略图
原审阅页只列出各渠道的标题与贡献字段,无法判断"哪个源给的封面更好看" —— 往往要等到整理落盘后才发现选错了图。
现在每个有贡献的渠道前面会显示一张该站自己的封面小图,并排比对哪个源更清晰、构图更好。
- 懒加载:页面滚动到哪才拉哪,不拖慢审阅页打开速度
- 本地缓存:原图缩到 120px 宽存为 jpg —— 实测 35KB 原图 → 4.3KB 缩略图,同一张图只下载一次
- 零新增依赖:缩放用的是项目本就有的 Pillow
- 取不到也不影响:某个源取图失败只显示占位块,刮削与审阅流程照常
缓存管理(设置 → 软件更新 页底部新增「封面缓存」区)
| 能力 | 说明 |
|---|---|
| 缓存统计 | 已缓存张数 / 占用空间 / 最早缓存时间 / 目录路径 |
| 立即清除 | 一键清空全部缩略图缓存 |
| 自动清理 | 开关 + 保留天数(默认 7 天,启动时清理超期文件) |
| 缓存目录 | 可显式指定,留空则自动判定 |
缓存位置
| 形态 | 默认目录 |
|---|---|
| 容器(Docker / NAS) | /data/.javsp_cache/thumbs |
| Windows 桌面版 | exe 同级 cache/thumbs |
容器侧刻意用点开头的隐藏目录 —— /data 是媒体库挂载点,隐藏目录可确保 Jellyfin / Emby / Kodi 默认跳过,不会把缓存混进媒体库索引;该目录随共享持久化,容器重建后缓存仍在。
⚠️ 清理只删缩略图缓存目录内的文件,绝不会删除已整理到媒体库的封面。
新增配置项
写入 config.yml(新增 cache 组):
cache:
thumbs_dir: '' # 留空 = 自动判定
auto_clean: true
retention_days: 7顺带修复
站点数据透传原先只给前端 has_cover 布尔标记,各站封面 URL 根本没传出去 —— 现补上 cover 字段(仅在该站确实有封面时给出)。
安装 / 升级
Docker(推荐,NAS / 服务器)
docker load -i javsp-fork-0.4.6-image.tar.gz
docker restart javsp容器内版本以
/api/health返回的version为准;界面右下角显示版本号。
Windows 桌面版
- 下载
JavSP-0.4.6-windows.zip,解压到任意目录(便携,exe 同级即数据目录)。 - 升级已有安装:启动旧版 → 设置页「软件更新」→「立即升级」会自动完成下载、替换并保留
config.yml/.sessions.json/JavSP.log;或直接把新 zip 内容覆盖到旧目录(保留旧config.yml)。 - 首次使用请把自己的
config.yml放到 exe 同级。
v0.4.5 及更早版本请直接下载本版 zip 手动覆盖一次 —— 那些版本自带的升级助手有缺陷,
从它们点「立即升级」会失败。v0.4.5 起一键升级才真正可用。
校验
下载后可用发布资产 javsp-fork-0.4.6.sha256 核对(含 windows.zip 与 image.tar.gz 两个值):
sha256sum -c javsp-fork-0.4.6.sha256回归验证
- 6 个指定回归用例文件 + 新增缩略图用例共 57/57 通过。
- 端到端走真实 HTTP 链路:640×960 原图 → 120×180 JPEG(430 字节)、缓存命中不重复下载、
非法协议返回 404、DELETE 清空后计数归零,全部通过。 - 真实外网拉取验证:35KB 原图 → 120px 宽 / 4.3KB 缩略图。
- Windows 桌面版 exe 实跑:
/api/health返回version=0.4.6、status=ok;
/api/cache/thumbs返回auto_clean=true、retention_days=7、目录落在 exe 同级cache/thumbs。 - NAS 部署后
/api/health返回version=0.4.6、container=true;前端资产名与构建一致;
挂载卷config.yml未被改动。
附注
- 本版本 Docker 端仅同步源码(含本次功能),无容器运行时行为变化。
- 历史 CHANGELOG 中保留的早期部署位置描述(如本机安装目录、网盘共享名)属已发布记录,本次未做破坏性清洗。
- 完整变更见仓库
CHANGELOG_FORK.md的 v0.4.6 段。
JavSP-fork v0.4.5
JavSP-fork v0.4.5 发布说明
派生自 Yuukiy/JavSP 的带 WEBUI 刮削器。本版本修复一个影响所有使用场景的缺陷:
桌面版「立即升级」此前在任何路径下都必然失败(本地盘与网络驱动器同样中招)。
无新增功能,Docker 与 Windows 桌面版均可平滑升级。
本次要点
修复:桌面版「立即升级」必然失败
现象
- 本地盘(
C:\JavSP):无法移动项,因为"C:\JavSP"处的项正在使用中—— 连续 3 次升级全部失败。 - 网络驱动器(
\\HOMENAS\Downloads\JavSP):另一个进程正在使用此文件—— 上一版引入的 10 次重试全部失败。
真正根因(与网络驱动器、WebView2 进程都无关)
升级流程第一步要把整个运行目录改名备份以完成替换,而升级助手却把自己的脚本、日志、安装包全部生成在这个目录内部:
- 写日志时
运行目录/update/apply_update.log处于打开状态; - 助手进程的工作目录继承自主进程(未显式设置
cwd),可能落在运行目录内。
Windows 上,只要待移动目录子树内存在未共享删除权限的打开句柄,或进程工作目录指向该目录,
该目录自身即处于"使用中",重命名必然失败 —— 与网络驱动器无关,本地盘同样中招。
(此前把根因归为「SMB 锁更粘」和「WebView2 孤儿进程」是误判:重试从不可能恢复。)
证据链(最小复现实验)
| 实验 | 条件 | 结果 |
|---|---|---|
| C | 干净目录 | 改名成功(基线) |
| B | 目录内有打开的文件句柄 | 失败 拒绝访问;关闭句柄后成功 |
| A | 子进程工作目录指向待移动目录 | 失败 另一个程序正在使用此文件 |
| D | 目录内有正在执行的 .ps1 |
成功(排除此项) |
对照实验:原版助手在副本上跑 → 复现上述日志原文;修复版 → 一次移动成功,落地新版本。
修复
- 助手的脚本 + 日志 + 安装包 + 进程工作目录全部搬到系统临时目录下的独立工作区,
与待升级目录彻底隔离 —— 待移动目录里不再留有任何助手正在使用的文件。 - 安装包改为搬移(而非复制)进工作区,升级后原位置不留残余。
- 助手收尾时清理旧目录遗留的
update/。 - 新增 5 项回归用例锁死这些隔离不变量,防止再犯。
安装 / 升级
Docker(推荐,NAS / 服务器)
docker load -i javsp-fork-0.4.5-image.tar.gz
docker restart javsp容器内版本以
/api/health返回的version为准;界面右下角显示版本号。
Windows 桌面版
- 下载
JavSP-0.4.5-windows.zip,解压到任意目录(便携,exe 同级即数据目录)。 - 升级已有安装:启动旧版 → 设置页「软件更新」→「立即升级」会自动完成下载、替换并保留
config.yml/.sessions.json/JavSP.log;或直接把新 zip 内容覆盖到旧目录(保留旧config.yml)。 - 首次使用请把自己的
config.yml放到 exe 同级。
若旧版升级曾失败并留下残留目录,可先把旧目录整个改名备份(例如
JavSP→JavSP_old),
再解压新版到JavSP,然后把旧目录里的config.yml复制回来。
校验
下载后可用发布资产 javsp-fork-0.4.5.sha256 核对(含 windows.zip 与 image.tar.gz 两个值):
sha256sum -c javsp-fork-0.4.5.sha256回归验证
- 6 个指定回归用例文件共 47/47 通过(新增 5 项针对本次缺陷)。
- 端到端真实验证:在
C:\JavSP的副本上走完整生产路径完成一次真实升级 ——
0.4.2 → 0.4.4 升级成功,旧目录已改名备份,config.yml完整保留,
升级日志中无任何Move-Item重试。 - Windows 桌面版 exe 实跑验证:
/api/health返回version=0.4.5、status=ok。 - NAS 部署后
/api/health返回version=0.4.5、container=true;前端资产名与构建一致;挂载卷config.yml未被改动。
附注
- 本版本 Docker 端仅同步源码(含本次修复),无容器运行时行为变化。
- 历史 CHANGELOG 中保留的早期部署位置描述(如本机安装目录、网盘共享名)属已发布记录,本次未做破坏性清洗。
- 完整变更见仓库
CHANGELOG_FORK.md的 v0.4.5 段。
JavSP-fork v0.4.4
JavSP-fork v0.4.4 发布说明
派生自 Yuukiy/JavSP 的带 WEBUI 刮削器。本版本是纯修复版本:把桌面版在**网络驱动器(网盘 / UNC 路径)**下
「立即升级必定失败」的问题修好并带入发布资产;无新增功能,Docker 与 Windows 桌面版均可平滑升级。
本次要点
修复:网盘 / UNC 路径下桌面版无法升级
现象
在网络驱动器上运行的桌面版点「立即升级」后:检查新版本正常、安装包正常下载、主程序也确实退出了,
但程序停在那里不回来、目录也没有被替换——点了升级等于没升。
根因(两个原因叠加,只在网络驱动器上暴露)
- 文件锁:桌面壳用的 pywebview 退出后经常残留
msedgewebview2.exe孤儿进程,仍锁着_internal/webview下的文件。
升级要把整个运行目录改名备份来完成替换,在本地磁盘上偶发失败还能靠等待重试蒙混过去,
但在 SMB 网络路径上文件锁更"粘",目录改名几乎必然失败。 - 失败残留目录的权限异常:一旦某次升级中途失败遗留的
update/目录,其在 NAS 一侧的访问权限会变成异常状态,
SMB 客户端对它直接"拒绝访问",导致后续每一次升级都卡在目录改名那一步。
修复
- 升级助手在移动旧目录之前,主动结束残留的
msedgewebview2进程释放文件锁。 - 目录改名包进最多 10 次的重试循环:每次失败都记录原因、再次清锁、等待 2 秒后重试;
10 次仍失败才判定为"被其他程序占用"并中止,不再无声失败。 - 启动新版本改为容错:网络路径下偶发启动失败不再触发"假回滚"(把已装好的新版本又换回旧版)。
建议
桌面版优先装在本地磁盘(如 C:\JavSP)运行,网络驱动器只作为例外。
本次修复让网盘路径下的升级"基本可靠",但本地盘才是治本方案——
网络驱动器自身的文件锁与权限行为不可控,升级只是被修复到不再必然失败。
安装 / 升级
Docker(推荐,NAS / 服务器)
docker load -i javsp-fork-0.4.4-image.tar.gz
docker restart javsp容器内版本以
/api/health返回的version为准;界面右下角显示版本号。
Windows 桌面版
- 下载
JavSP-0.4.4-windows.zip,解压到任意目录(便携,exe 同级即数据目录)。 - 升级已有安装:启动旧版 → 设置页「软件更新」→「立即升级」会自动完成下载、替换并保留
config.yml/.sessions.json/JavSP.log;或直接把新 zip 内容覆盖到旧目录(保留旧config.yml)。 - 首次使用请把自己的
config.yml放到 exe 同级。
校验
下载后可用发布资产 javsp-fork-0.4.4.sha256 核对(含 windows.zip 与 image.tar.gz 两个值):
sha256sum -c javsp-fork-0.4.4.sha256回归验证
- 6 个指定回归用例文件共 42/42 通过。
- Windows 桌面版 exe 实跑验证:
/api/health返回version=0.4.4、status=ok,更新端点current=0.4.4。 - NAS 部署后
/api/health返回version=0.4.4、container=true;前端资产名与构建一致;挂载卷config.yml未被改动。
附注
- 本版本 Docker 端仅同步源码(含本次修复),无容器运行时行为变化。
- 历史 CHANGELOG 中保留的早期部署位置描述(如本机安装目录、网盘共享名)属已发布记录,本次未做破坏性清洗。
- 完整变更见仓库
CHANGELOG_FORK.md的 v0.4.4 段。
JavSP-fork v0.4.3
JavSP-fork v0.4.3 发布说明
派生自 Yuukiy/JavSP 的带 WEBUI 刮削器。本版本聚焦安全 / 性能加固、全库去死代码与脱敏终扫,
无破坏性功能变更;Docker 与 Windows 桌面版均可平滑升级。
本次要点
安全 / 性能加固(B-001 ~ B-010,按批次)
- 第一批:下载产物做 sha256 校验(失败拒绝落地);网络请求统一走
tls_verify()不再默认关闭证书校验;路径白名单比较补齐大小写归一,避免大小写绕过。 - 第二批:更新页版本号兜底(接口层级取错时回退到可用字段);封面引擎字段修正;高危更新端点(
/api/update/download、/api/update/apply)强制会话校验,仅回环地址无条件放行以保证桌面版一键升级。 - 第三批:命名预览由横向改为纵向堆叠(长命名规则不再被挤变形);解压流程加 zip slip 防护(禁止
../越界写出);关机逻辑按平台分支处理并对取版本号增加容错;附带修正源码模式下 CLI 自动更新重命名自身解释器导致自毁的路径。
去死代码(22 项)
全库 vulture(min-confidence 60)+ pyflakes 扫描,移除上游遗留、从未被调用的空函数 / 废弃导入 / 无效分支共 22 处;无功能行为变化,仅清理。
脱敏终扫
测试文件中残留的本地内网地址示例改为 RFC 5737 文档保留段(198.51.100.0/24),避免真实内网信息随仓库发布。
安装 / 升级
Docker(推荐,NAS / 服务器)
docker load -i javsp-fork-0.4.3-image.tar.gz
docker restart javsp容器内版本以
/api/health返回的version为准;界面右下角显示版本号。
Windows 桌面版
- 下载
JavSP-0.4.3-windows.zip,解压到任意目录(便携,exe 同级即数据目录)。 - 升级已有安装:启动旧版 → 设置页「软件更新」→「立即升级」会自动完成下载、替换并保留
config.yml/.sessions.json/JavSP.log;或直接把新 zip 内容覆盖到旧目录(保留旧config.yml)。 - 首次使用请把自己的
config.yml放到 exe 同级。
校验
下载后可用发布资产 javsp-fork-0.4.3.sha256 核对(含 windows.zip 与 image.tar.gz 两个值):
sha256sum -c javsp-fork-0.4.3.sha256回归验证
- 6 个指定回归用例文件共 42/42 通过。
- NAS 部署后
/api/health返回version=0.4.3、container=true;前端资产名与新构建一致;挂载卷config.yml未被改动。
附注
- 历史 CHANGELOG 中保留的早期部署位置描述(如本机安装目录、网盘共享名)属已发布记录,本次未做破坏性清洗。
- 完整变更见仓库
CHANGELOG_FORK.md的 v0.4.3 段。
JavSP-fork v0.4.2
JavSP-fork v0.4.2
修复 v0.4.1 升级功能的两个缺陷(Windows 桌面版实测暴露)。
未使用 v0.4.1 升级功能的用户不受影响;已升级或正准备升级的,请直接用本版本。
🐛 修复一:更新提示条不显示版本号
现象:提示「发现新版本 v」,版本号是空的。
根因:前端取错了数据层级。更新接口把版本详情放在 info 里(版本号字段为 info.latest),而提示组件读的是顶层 latest —— 顶层只有 available / frozen / container 这类状态位,版本号根本不在那儿。
现在会正确显示成「发现新版本 v0.4.2(当前 v0.4.1)」。
🐛 修复二:点了「立即升级」并没有真正升级
现象(比较迷惑):安装包确实下载到了程序目录下的 update/,主程序也退出了,但目录里还是旧版本,手动再打开 exe 依然是老版本。
根因:启动升级助手进程时用了 DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP 这个组合。该组合下 PowerShell 进程能起来、脚本却不执行 —— 连它自己的第一行日志都不写,全程静默失败,所以表面上看不出任何异常。
实测了 6 组启动参数:
| 启动方式 | 结果 |
|---|---|
| 无特殊标志 | 正常执行 |
| 无特殊标志 + 隐藏窗口 | 正常执行 |
DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP |
不执行 |
DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP + 隐藏窗口 |
不执行 |
CREATE_NO_WINDOW |
正常执行 |
CREATE_NO_WINDOW + 隐藏窗口 |
正常执行 |
已改用 CREATE_NO_WINDOW —— 既隐藏控制台窗口,又能真正执行。
配套加固:
- 新增「助手是否真的跑起来」的观察信号(以助手写入的第一行日志为准),便于区分"已启动但失败"和"压根没启动";
- 主进程退出延时由 1.5 秒放宽到 3 秒,避免观察还没完成主进程就退了;
- 升级助手的日志改为 UTF-8 写入(此前用 PowerShell 5.1 默认的 ANSI,中文日志是乱码,不利于排查)。
验证:用模拟旧目录 + 模拟升级包做了端到端演练,主进程硬退出后助手独立完成替换 —— 新版就位、config.yml 与 JavSP.log 原样保留、.bak 备份生成。
📦 下载与校验
| 资产 | 用途 |
|---|---|
JavSP-0.4.2-windows.zip |
Windows 桌面版,解压即用(exe 同级便携) |
javsp-fork-0.4.2-image.tar.gz |
Docker 镜像,docker load -i 后重启容器 |
javsp-fork-0.4.2.sha256 |
上述两个文件的 SHA-256 校验值 |
⚠️ 升级说明
- Windows:v0.4.0 及以上在界面顶部点「立即升级」即可自动完成(配置自动保留)。v0.4.1 用户若在上一版遇到"点了没反应",用本版本再点一次即可正常升级。
- Docker:
docker load -i javsp-fork-0.4.2-image.tar.gz后docker restart javsp;配置文件挂在容器外,不受影响。
JavSP-fork v0.4.1
JavSP-fork v0.4.1
大版本:新增软件更新检查与一键升级。
版本号由 v0.3.17 直接进到 v0.4.1 —— v0.4.0 仅作内部联调构建,未对外发布。
本次同时合并 v0.3.16 与 v0.3.17 的修复(前者已发 Release,后者此前只打了 tag)。
✨ 软件更新:启动时告知,Windows 一键升级
以前要升级只能手工去发布页下载、解压、覆盖。现在程序自己会告诉你有新版本,Windows 桌面版还能一键完成替换。
启动时后台检查(不打扰、不等待)
- 服务启动后延迟 5 秒,在后台线程查询最新 Release;3 秒超时,网络不可达时静默失败 —— 绝不拖慢启动,也不弹任何报错。
- 结果缓存 6 小时,不会每次刷新都去问一次。
- 设置页「软件更新」可手动检查,也能关掉启动检查(沿用
other.check_update开关)。
Windows 桌面版:一键升级
点提示条上的「立即升级」后:
- 下载最新 Windows 安装包(带进度条)
- 启动独立的升级助手进程,主程序退出后由助手接管(Windows 不允许替换正在运行的 exe,所以必须分步)
- 旧程序目录整体改名备份 —— 旧版本遗留的无用组件随旧目录一并清除,不留残余
- 解压新版落地
- 原样保留
config.yml、.sessions.json、JavSP.log(你的配置与历史不会丢) - 启动新版本;任一步失败自动回滚到旧目录
Docker 部署:给出更新指引
容器无法替换自身镜像,因此提示条直接给出可复制的命令与发布页链接:
docker load -i javsp-fork-0.4.1-image.tar.gz
docker restart javsp为什么不用上游那套
上游 func.py 里的 check_update / download_update 查的是上游仓库的 releases(对本 fork 无效),且是 CLI 打印式、没接 WebUI;其自动更新靠"重命名运行中的 exe",在 Windows 上实际必然失败。本次重写为 javsp/update.py。
🔧 修复(v0.3.16 / v0.3.17,随本次一并发布)
- 多分片(CD)影片只移动了第一个分片(issue #6):原实现是"一错全停",任一分片抛异常即中断整个循环,表现为只移动了 CD1 且原因不可见。现改为逐分片容错 + 移动前预检目标冲突 + 失败明细逐条列出。
- NFO 简繁混用:genre 字段此前从未走翻译,映射表本身也简繁混杂,同一份 NFO 会出现「出轨 / 出軌」并存。现新增零依赖繁简归一化,按目标语种原地统一。
- 同语言跳过翻译:原文已是目标语种时直接采用,不调用翻译引擎。
- 整理后源空目录未删:rmdir 重试 3 次,仍失败则在结果区列出待手动删除的目录。
- 翻译引擎接入本地大模型(issue #5):OpenAI 引擎支持自定义端点 / 模型 / 代理开关,本地 Ollama、LM Studio 与云端兼容源零改接入。
📦 下载与校验
| 资产 | 用途 |
|---|---|
JavSP-0.4.1-windows.zip |
Windows 桌面版,解压即用(exe 同级便携) |
javsp-fork-0.4.1-image.tar.gz |
Docker 镜像,docker load -i 后重启容器 |
javsp-fork-0.4.1.sha256 |
上述两个文件的 SHA-256 校验值 |
Windows 版校验示例:
Get-FileHash JavSP-0.4.1-windows.zip -Algorithm SHA256⚠️ 升级说明
- Windows:已在使用 v0.4.0 桌面版的用户,可直接点界面顶部的「立即升级」自动完成(配置自动保留);更早版本请手动下载 zip 覆盖,注意保留 exe 同级的
config.yml。 - Docker:下载镜像 tar.gz 后
docker load -i并docker restart javsp;配置文件挂在容器外,不受影响。