# 变更记录 ## 2026-09-03 — raylight 修复中文参考文件名 UnicodeEncodeError + 排队优先级/插队 + 重启不再清空队列 **触发**:任务 `f2de718e1e30`(ref2va,带一个中文文件名的参考视频)秒失败,报 `UnicodeEncodeError: 'ascii' codec can't encode characters in position 30-32`。 **根因**:h3-console 上传时的文件名清洗(`re.sub(r"[^\w.-]+", "_", ...)`)用的是 Python 3 默认的 Unicode `\w`,中文字符被当"合法单词字符"保留,磁盘文件名和资源 URL 里都留着原始中文 (如 `.../assets/e31b708ce7084928__第二段_短片_002.mp4`)。这个 URL 原样传给 raylight `server.py` 的 `_fetch_to_input()`,里面用 `urllib.request.urlopen(url)` 直接下载—— `http.client` 构造请求行时要求整行必须是纯 ASCII,中文文件名没做 percent-encode 直接炸了。 数了一下"第二段"三个字正好落在报错说的 position 30-32,实锤。 **修复1(编码 bug)**:`_fetch_to_input` 在请求前用 `urllib.parse.quote` 对 URL 的 path 部分 percent-encode 一遍,跟上游怎么生成文件名无关,任何非 ASCII 文件名都不会再炸。 **顺带发现并修复的架构问题**:排查时发现 raylight 重启(`start.sh`,真杀进程重启,不是热 reload)会把所有**排队中**的任务直接标记 `cancelled`(`_load_jobs()` 里的兜底逻辑),因为 排队队列 `Q = queue.Queue()` 是进程内对象,重启后是全新空队列,没有任何地方把 sqlite 里 记录的 queued 任务重新塞回去。发现的时候正好撞上 20 条排队任务攒在那,重启会连带取消掉。 用户判断"排队中的任务本来就没执行过,没有理由不能恢复"——同意,改法: - `Job` 加 `queue_seq`(`time.time_ns()`,决定排队顺序),`Q` 从 `queue.Queue()` 换成 `queue.PriorityQueue()`,存 `(queue_seq, jid)`。 - `_load_jobs()` 里 `queued` 状态不再改 `cancelled`,原样保留、按 `queue_seq` 重新入队; 旧记录没有 `queue_seq`字段(默认0)时用 `created_at` 补一个值,避免这批旧记录退化成按 jid 字符串排序。`running` 状态还是标 `failed`——这个救不回来,GPU/ComfyUI 执行进度真丢了。 - 新增 `POST /v1/videos/{jid}/prioritize`(插队):把该任务 `queue_seq` 改成比当前所有排队 任务都小的值,重新入队;worker 弹出任务时核对 `queue_seq` 是否还等于弹出值,不等说明是 插队前的旧 entry,跳过(decrease-key 的标准兜底写法,不用真的从堆里摘除旧 entry)。 `GET /v1/videos/{jid}` 和插队接口的返回值都带 `queue_position`(1-based,前面还有几条)。 - h3-console `server.py` 加对应代理接口,`static/index.html` 任务列表"⋯"菜单和详情页都加了 "优先插队"按钮(只在 `status==queued` 时出现),点击后 alert 显示插到第几位。 **顺带修复的另一个遗留漂移**:8月24日提交 `c6815d5`(ComfyUI 存活探测 `_comfyui_alive`,修 `/health` 在 ComfyUI 进程崩溃后仍骗人报 ready 的盲区)核实后发现**从未真正部署到服务器** (所有历史备份文件里都没有这段代码)——`/health` 一直是有这个监控盲区的。用户确认后重新加回 `server.py`。同时理清了本地 `raylight/server.py`(顶层,git 只有 8/24 那一次提交,之后没再 同步)和 `raylight/scripts/server.py`(9/1 同步过一次,但也停在 9/1)两份文件长期分叉的问题 (`CHANGELOG.md` 9/1 那节已经记过但没处理)——两份现已同步成服务器当前内容,一致。 **部署**:三处改动一次性写进服务器 `/data/models/raylight/server.py`,等当时正在跑的任务 (`9bc15718b3ea`,帧数243/步数20,约287秒跑完)自然结束后立即 `start.sh` 重启(h3-console 8080/8081 因为不碰 GPU/队列,改完当场重启,没等)。 **结果(实测)**:重启前 18 条排队+1条运行中,重启后 **17 条排队任务原样保留、顺序不变** (只有卡在重启瞬间那一条本来就"从queued刚变running"的任务按预期判了 failed,运行中的执行 状态确实救不回来,这是设计内代价,不是bug)。插队接口验证:对排在最后的任务调用 `/prioritize`,直接跳到 `queue_position: 1`;通过 h3-console 代理(`/v1/videos/{id}/prioritize`, 带 Bearer token)同样验证通过。`/health` 的 `comfy_alive` 检查确认生效(ComfyUI 存活时 `model: "ready"`)。 ## 2026-09-01 — h3-console 三个新建表单默认档位改成竖屏 480×832/10s/Turbo关/20步 用户要求把"新建任务"默认参数从横屏改成竖屏,三个 tab(文生视频/首尾帧/参考图)统一改。 **改法**:`h3-console/static/index.html` 新增 `DEFAULT_RES`/`DEFAULT_DUR` 两个常量 (`'480x832'`/`'243'`,243帧=10s@24fps),`initParamSelects`(页面初次加载)和 `clearForm` ("清空表单"按钮)两处都改成读这两个常量,不再各自硬编码分辨率下拉第一项/`'362'`(15s)。 480×832 的 `maxFrames` 是 1125 帧,10s 远低于上限,不受竖屏"没单独测过 OOM 边界"那条限制 (见 `a4e8255` 的注释)影响。Turbo 默认关、步数默认 20 是原来就有的 `