确认既检查状态,又固定当前素材版本:音频和图片ready、未暂停/取消、客户端image_version等于当前、无ACTIVE,计算当前图片按顺序连接字节的SHA256,保存confirmed_version与confirmed_digest。video若已queued/working/done,重复confirm直接返回状态,不启动第二编码。
worker开始再次核对version与digest。换图、删图、重生成均使旧确认失效。这个闸门避免客户端旧预览确认新文件,也避免确认后磁盘素材变化;它不是对图片内容是否合适的自动审核。
控制语义
- Control共享paused与cancelled线程事件,音频异步流与合并步骤在检查点等待/退出;本机画面循环和编码循环也检查取消。
- pause不撤销已经提交Seedream请求。返回已付费素材时尽量保存,后续成片仍停止。
- cancel令正在处理步骤响应取消,并将未运行但busy的步骤改cancelled;真正终止以worker退出和ACTIVE清除为准。
- resume只清暂停/取消标志;不会自动launch cancelled/interrupted步骤。用户分别选择重试音频、重新选图、图片重试或confirm恢复视频。
recover与重启
Python服务启动调用recover扫描job.json,原queued/working改interrupted并提示手动重试,paused清false;ready/done及实际文件保留,submitting等未知收费信息保留。不自动TTS、不自动重新编码、更不会因重启自动重发收费图。
已成功part可在音频重试复用。failed/manual URL需要用户重新提供URL,因为Control.photo_url只在内存;历史图片则可直接读取。进程死亡时ACTIVE与Control不持久保存,只能根据任务JSON把活动状态改为待恢复。
源码中的recover/jobs扫描未对每个损坏job.json分别捕获错误,坏JSON可能使恢复或历史列表失败;文档不能承诺所有磁盘损坏自动修复。前台服务START_STICKY也不等于自动恢复每个任务步骤。
依据:app.py:48–58,747–819,871–880、android_runtime.py:58–110、speech.py:46–89,118–166。