{# 轮询自动插入失败/新任务不在本页时的提示条(JS 控制显隐,带可点的刷新/回第一页链接) #}
{{ render_pagination_bar('top') }}
{% for item in page_projects %}
{% if item.workflow_active %}
{% if item.workflow.status == 'queued' %}排队中{% elif item.workflow.status == 'cancelling' %}正在中断{% else %}运行中{% endif %}
{% if item.backend_label %}
{# 运行中也在状态区标注后端(取自项目记录);具体阶段文案由服务端动态产出(如"云端视频生成 1/4") #}
{{ '☁ 云端' if item.backend_label == 'cloud' else '🖥 本机' }}
{% endif %}
{% if item.workflow.status == 'queued' %}等待前序项目完成{% else %}一键成片后台任务{% endif %}
{{ item.workflow.detail or '正在准备任务...' }}
{# 生成过程最后一行(API 阶段的模型思考/正文/状态/重试/错误):实时显示 + 可点进项目页看完整过程。
数据来自 GET /projects/
/stream(?tail=1&follow=0),没有日志时不占位。 #}
过程
—
{% elif item.final_video_url %}
{# 列表页不自动拉视频流(4K 成片预加载曾占满浏览器 6 连接导致整站卡死)。
封面 = 服务端从成片抽帧的真实预览图(~20KB jpg,一次性生成永久复用),
点击在弹层里才真正加载视频。抽帧失败时 CSS 渐变底兜底(onerror 移除 img)。 #}
{% else %}
🎬
暂无最终视频
完成最后一步视频生成后会自动显示
{% endif %}
{% if item.backend_label %}
{# 云端/本机生成标识:固定网格头行右侧(与勾选框同一水平带);
title 里给出完整后端地址 · 取自本项目生成时的记录 #}
{{ '☁ 云端生成' if item.backend_label == 'cloud' else '🖥 本机生成' }}
{% endif %}
{% if item.workflow_active %}
{{ item.name }}
{% else %}
{% endif %}
{{ item.id }}
{% if item.show_one_click_total_elapsed %}
{# 耗时区放「所属分组」之后(用户要求);总耗时只算执行(API + 预运行 + 视频生成 + 后处理),
不含排队等待——起点 data-exec-started=第一次真正开跑(API 阶段开始),
不是入队/创建时刻。运行中由前端按 data-* 实时累加。 #}
{% endif %}
{% if item.show_video_generation_elapsed %}
{% endif %}
{# API 消耗行(用户要求):数值默认 ×100 展示;「开始生成」时刻已移至"所属分组"后;
恒渲染占位,避免"有/无数据"导致卡片内部错位(用户要求布局固定) #}
API 消耗 {% if item.token_wan %}{{ '%g'|format(item.token_wan) }} 万 tokens{% else %}—{% endif %}
{% if item.workflow_active %}
生成进行中任务正在运行,完成后这里显示最终状态
{% elif item.workflow.status in ['failed', 'cancelled', 'interrupted'] %}
{% if item.workflow.status == 'failed' %}任务失败{% elif item.workflow.status == 'cancelled' %}任务已中断{% else %}任务异常停止{% endif %}
{% if item.workflow.detail %}{{ item.workflow.detail }}{% endif %}
{% else %}
状态正常任务已完成,点击下方"进入"查看成片与详情
{% endif %}
{% endfor %}
“{{ selected_group_name }}”中暂无项目,可切换其他分组,或创建新项目后移动到这里。
{{ render_pagination_bar('bottom') }}