From short-video-director
Submits pending video shots to Dreamina CLI multimodal2video using prompts/images from tasks.json in story/episodes/{episode}/videos, updates status/submit_id/fail_reason. For AI video production pipelines.
npx claudepluginhub wddxh/shortvideodirectorThis skill is limited to using the following tools:
- `config.md` — 必须读取(获取 `## 视频生成配置` 中的即梦视频模型版本、视频比例、视频分辨率)
Submits storyboard prompts from episodes to Dreamina CLI for AI video generation. Checks assets/images, registers pending tasks in tasks.json, tracks status asynchronously. Invoke via /generate-video ep01 [shots].
Generates images/videos via ByteDance Dreamina (Jimeng) CLI: text2image, image2image, text2video, image2video, task queries/history. Performs install/login checks; triggers on Dreamina/Jimeng mentions.
Generates AI videos from text prompts or images using ByteDance Seedance models via Volcengine Ark API. Supports first/last frame, reference images, task management, audio, and Python CLI tool.
Share bugs, ideas, or general feedback.
config.md — 必须读取(获取 ## 视频生成配置 中的即梦视频模型版本、视频比例、视频分辨率)story/episodes/$ARGUMENTS[0]/videos/tasks.json — 必须读取(由 generate-video 预登记创建)$ARGUMENTS[0] — 集数(如 ep01)$ARGUMENTS[1] — 目标镜头编号列表(如 1 3 5 或 all)从 tasks.json 加载 pending 镜头,读取其 prompt / images / duration,调用脚本提交视频生成任务,将结果(submit_id / status / fail_reason)写回 tasks.json。
scripts/ 目录下的现有脚本。scripts/xxx.sh 找不到,使用 Glob 工具搜索 **/scripts/xxx.sh 找到插件目录下的脚本绝对路径。pending → submitted / failed 状态转移。严禁:(a) 处理 tasks.json 中不存在的 shot(视为上游 bug,输出错误提示并跳过该 shot 继续下一个,不得尝试提交);(b) 处理 status ≠ pending 的 shot(submitted/done/failed 由 check-video 处理);(c) 以测试、验证、调试名义提交任何任务;(d) 修改 tasks.json 的 prompt / images / duration(本 skill 仅更新 submit_id / status / fail_reason)。视频生成成本高,任何灰色操作直接烧钱。文件路径:story/episodes/{集数}/videos/tasks.json
每条记录包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| shot | number | 镜头编号(主键,从 1 开始) |
| submit_id | string | dreamina 返回的任务 ID(未提交时为 "") |
| status | string | pending(已登记未提交)/ submitted(等待结果)/ done(视频已下载)/ failed(生成失败) |
| prompt | string | 提交时使用的完整 prompt 文本 |
| images | string | 逗号分隔的参考图片路径列表 |
| duration | number | 视频时长(秒) |
| fail_reason | string | 失败原因(成功时为 "") |
完整示例:
[
{"shot": 1, "submit_id": "0a7fdfa1711442ee", "status": "submitted", "prompt": "### 镜头 1\n- **镜头类型:** 特写\n...", "images": "assets/images/characters/林知意.png,assets/images/locations/郊外泥地.png", "duration": 15, "fail_reason": ""},
{"shot": 2, "submit_id": "", "status": "failed", "prompt": "### 镜头 2\n...", "images": "assets/images/characters/林知意.png", "duration": 15, "fail_reason": "ExceedConcurrencyLimit"}
]
写入规则:
bash scripts/read-config.sh "即梦视频模型版本" 等获取配置值(即梦视频模型版本、视频比例、视频分辨率)dreamina user_credit 检查登录状态并显示当前积分余额
dreamina login 完成登录"并结束mkdir -p story/episodes/{集数}/videosstory/episodes/{集数}/videos/tasks.json(由 generate-video 预登记创建)/generate-video {集数}",结束$ARGUMENTS[1] 过滤目标镜头:
all → 使用 tasks.json 中所有 status == pending 的记录1 3 5)→ 在 tasks.json 中匹配这些 shotpending → 本次要提交submitted, done, failed} → 跳过,输出一行提示"shot {N} status={status},跳过(由 check-video 处理)"/generate-video",跳过该 shot 继续下一个对阶段 2 筛出的每个 pending 镜头:
从 tasks.json 该 shot 记录读取 prompt / images / duration
提交视频生成:bash scripts/video-gen-dreamina.sh "{prompt}" "story/episodes/{集数}/videos/shot{NN}.mp4" "{images}" "{duration}" "{比例}" "{模型版本}"
根据退出码处理:
SUBMITTED 开头 → 提取 submit_id,状态转移 pending → submittedFAIL 开头 → 提取失败原因,状态转移 pending → failed用 Read 读取 tasks.json 最新内容,按 shot 编号找到对应条目,只更新 submit_id / status / fail_reason 三个字段(prompt / images / duration 保持不变),然后用 Write 写回完整 JSON
提交失败 → 写入 failed + fail_reason → 继续下一个 shot,本次运行中不得再次尝试该 shot
若提交失败原因为并发限制 → 立即停止本次提交,且把所有剩余 pending shot(status==pending 且尚未在本次 run 中提交过的)在 tasks.json 中状态转移 pending → failed,fail_reason 设为 ExceedConcurrencyLimit,submit_id 保持 ""。已在本次 run 中标为 submitted 或 failed 的 shot 不动。批量标记规则:用 Read 读取 tasks.json 最新内容,批量更新后用 Write 写回完整 JSON。输出"已达并发上限,剩余 N 个 pending 镜头已标为 failed (ExceedConcurrencyLimit),将由 auto-video cron 自动重试"。
设计意图:把"剩余 pending"转移到"failed-retryable",复用 check-video phase 5a auto-retry 机制把它们逐步推进。failure-classification.md 已规定并发限制为 retryable,无需修改分类逻辑。
dreamina user_credit,显示提交后的积分余额