auto-save 2026-05-14 04:37 (~4)
This commit is contained in:
@@ -3212,6 +3212,19 @@
|
||||
"type": "session-heartbeat",
|
||||
"message": "Codex 会话活跃 · 最近命令:codex · 1 项未提交变更 · 最近提交:auto-save 2026-05-14 04:26 (~5)",
|
||||
"files_changed": 1
|
||||
},
|
||||
{
|
||||
"ts": "2026-05-14T04:32:27+08:00",
|
||||
"type": "commit",
|
||||
"message": "auto-save 2026-05-14 04:32 (~5)",
|
||||
"hash": "4935e34",
|
||||
"files_changed": 5
|
||||
},
|
||||
{
|
||||
"ts": "2026-05-13T20:33:13Z",
|
||||
"type": "session-heartbeat",
|
||||
"message": "Claude 会话活跃 · 最近命令:claude · 4 项未提交变更 · 最近提交:auto-save 2026-05-14 04:32 (~5)",
|
||||
"files_changed": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1134,6 +1134,7 @@ async def trigger_analyze(
|
||||
mode: FrameExtractMode = "replace",
|
||||
quality: FrameExtractQuality = "auto",
|
||||
) -> Job:
|
||||
global ANALYZE_WORKER_RUNNING
|
||||
job = JOBS.get(job_id)
|
||||
if not job:
|
||||
raise HTTPException(404, "job not found")
|
||||
@@ -1148,6 +1149,7 @@ async def trigger_analyze(
|
||||
message="排队等待抽帧" if ANALYZE_WORKER_RUNNING or position > 1 else "准备抽帧…",
|
||||
)
|
||||
if not ANALYZE_WORKER_RUNNING:
|
||||
ANALYZE_WORKER_RUNNING = True
|
||||
bg.add_task(analyze_queue_worker)
|
||||
return job
|
||||
|
||||
|
||||
@@ -701,7 +701,7 @@ api/main.py
|
||||
<tr><td>创建任务</td><td><code>POST /jobs</code></td><td><code>createJob</code></td><td>提交 TK 链接,后台开始下载,停在 downloaded 等用户点解析。</td></tr>
|
||||
<tr><td>上传视频</td><td><code>POST /jobs/upload</code></td><td><code>uploadJob</code></td><td>保存 source.mp4,然后同样进入下载完成状态。</td></tr>
|
||||
<tr><td>删除输入视频</td><td><code>DELETE /jobs/{id}</code></td><td><code>deleteJob</code></td><td>从任务队列、URL 和磁盘 <code>jobs/<id></code> 目录移除整个 job,包括源视频、关键帧、元素提取图和生成视频。</td></tr>
|
||||
<tr><td>解析视频</td><td><code>POST /jobs/{id}/analyze?frames=&target=&mode=&quality=</code></td><td><code>analyzeJob</code></td><td>拆轨 + 目标化抽关键帧。<code>target</code> 支持综合、清晰主体、转场变化、表情瞬间、动作峰值;<code>mode=append</code> 追加新关键帧;<code>quality</code> 支持快速、精细、极准本地扫描。</td></tr>
|
||||
<tr><td>解析视频</td><td><code>POST /jobs/{id}/analyze?frames=&target=&mode=&quality=</code></td><td><code>analyzeJob</code></td><td>拆轨 + 目标化抽关键帧。<code>target</code> 支持综合、清晰主体、转场变化、表情瞬间、动作峰值;<code>mode=append</code> 追加新关键帧;<code>quality=auto</code> 根据本机算力和视频时长自动选择快速、精细或极准。多个抽帧请求进入后端队列顺序处理。</td></tr>
|
||||
<tr><td>手动加帧</td><td><code>POST /jobs/{id}/frames?t=</code></td><td><code>addManualFrame</code></td><td>按视频时间戳抽一帧,index 递增但 frames 按 timestamp 排序。</td></tr>
|
||||
<tr><td>Vision 识别</td><td><code>POST /frames/{idx}/describe</code></td><td><code>describeFrame</code></td><td>写入 frame.description,后续可从 objects 加候选元素。</td></tr>
|
||||
<tr><td>清洗水印</td><td><code>POST /frames/{idx}/cleanup</code></td><td><code>cleanupFrame</code></td><td>支持全图和区域清洗,生成 cleaned 待应用版本。</td></tr>
|
||||
@@ -723,7 +723,7 @@ api/main.py
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><span class="tag blue">输入 Input</span></td>
|
||||
<td>创建/上传任务,显示视频就绪;每个视频缩略图上方都有绑定自己的自动抽帧快捷工具条,默认只露出目标和抽帧按钮,张数/精度收进设置;横屏/竖屏都按真实比例显示和评分;单击视频缩略图打开画布内抽帧面板。</td>
|
||||
<td>创建/上传任务,显示视频就绪;每个视频缩略图上方都有绑定自己的自动抽帧快捷工具条,默认只露出目标和抽帧按钮,张数/自动精度收进设置;也可在视频抽帧侧边面板内自动抽帧。多个视频抽帧可先后入队。</td>
|
||||
<td>不要自动一路跑到 ASR 或生图;用户需要控制解析节奏。</td>
|
||||
<td><code>page.tsx</code>、<code>InputNode</code>、<code>VideoFramePanelNode</code>、<code>api/main.py</code></td>
|
||||
</tr>
|
||||
@@ -817,6 +817,18 @@ api/main.py
|
||||
<h2>变更记录</h2>
|
||||
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
|
||||
<div class="changelog">
|
||||
<article class="change">
|
||||
<header>
|
||||
<h3>2026-05-14 · 抽帧精度自动选择并支持后端排队</h3>
|
||||
<span class="tag violet">Input</span>
|
||||
<span class="tag blue">Queue</span>
|
||||
</header>
|
||||
<div class="body">
|
||||
<p><strong>问题:</strong>抽帧精度不应该每次都让用户判断;点击一个视频抽帧后,其他视频不应被全局禁用,而应该可以先后排队。另外打开视频抽帧侧边面板后,也应能自动抽帧。</p>
|
||||
<p><strong>改动:</strong><code>quality</code> 新增 <code>auto</code> 默认值,后端按 CPU 核数、内存和视频时长解析为快速、精细或极准;本机 M2 Max + 64GB 的短视频会自动走极准。后端新增内存队列 <code>ANALYZE_QUEUE</code>,多个 <code>analyze</code> 请求按顺序执行;前端轮询所有运行中的 job,不只轮询当前 active job。<code>VideoFramePanelNode</code> 内也加入同一套自动抽帧工具条。</p>
|
||||
<p><strong>影响:</strong><code>api/main.py</code>、<code>web/lib/api.ts</code>、<code>web/app/page.tsx</code>、<code>web/components/nodes/index.tsx</code>、<code>docs/source-analysis.html</code>。队列目前是进程内队列,重启后不会恢复未执行的排队任务。</p>
|
||||
</div>
|
||||
</article>
|
||||
<article class="change">
|
||||
<header>
|
||||
<h3>2026-05-14 · 抽帧工具条降噪并修复追加失败</h3>
|
||||
|
||||
@@ -808,6 +808,10 @@ export function VideoFramePanelNode({ data }: any) {
|
||||
const duration = panelJob.duration ?? 0
|
||||
const frames = [...panelJob.frames].sort((a, b) => a.timestamp - b.timestamp)
|
||||
const aspect = panelJob.width && panelJob.height ? `${panelJob.width}/${panelJob.height}` : "9/16"
|
||||
const panelTarget = d.frameTargets[panelJob.id] ?? "balanced"
|
||||
const panelCount = d.frameCounts[panelJob.id] ?? 5
|
||||
const panelQuality = d.frameQualities[panelJob.id] ?? "auto"
|
||||
const panelRunning = ["splitting", "transcribing"].includes(panelJob.status)
|
||||
const dockText: Record<CanvasPanelDock, string> = {
|
||||
canvas: "画布模式",
|
||||
left: "吸附左侧",
|
||||
@@ -943,6 +947,18 @@ export function VideoFramePanelNode({ data }: any) {
|
||||
/>
|
||||
</div>
|
||||
<div className="flex min-h-0 flex-col gap-3 overflow-hidden">
|
||||
<FrameExtractQuickBar
|
||||
target={panelTarget}
|
||||
count={panelCount}
|
||||
quality={panelQuality}
|
||||
disabled={panelRunning}
|
||||
running={panelRunning}
|
||||
hasFrames={frames.length > 0}
|
||||
onTargetChange={(next) => d.onFrameTargetChange(panelJob.id, next)}
|
||||
onCountChange={(next) => d.onFrameCountChange(panelJob.id, next)}
|
||||
onQualityChange={(next) => d.onFrameQualityChange(panelJob.id, next)}
|
||||
onAnalyze={() => d.onAnalyzeJob(panelJob.id, { mode: frames.length > 0 ? "append" : "replace" })}
|
||||
/>
|
||||
<div className="rounded-xl border border-white/10 bg-white/[0.04] p-3">
|
||||
<div className="mb-2 flex items-center justify-between gap-3">
|
||||
<div className="font-mono text-[12px] text-white/72">
|
||||
|
||||
Reference in New Issue
Block a user