From 06a4af7c1ee886f2b65e9226ce33f13ff1d97247 Mon Sep 17 00:00:00 2001 From: sion123 <450702724@qq.com> Date: Fri, 15 May 2026 12:04:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(video-from-script):=20=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E6=94=AF=E6=8C=81=E5=89=AA=E6=98=A0=E8=8D=89?= =?UTF-8?q?=E7=A8=BF=E5=9C=B0=E5=9D=80=E8=B7=9F=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 `--draft-url` 命令行参数,允许为单个批次项指定草稿地址 - capcut_assemble 模块现在返回 `{ draftUrl, draftId }` 对象 - 组装阶段完成后自动将草稿地址保存到 manifest 文件中 - CSV/XLSX 导出表头新增"草稿地址"列,支持批量导出草稿链接 --- .../skills/video-from-script/scripts/batch-pipeline.js | 8 ++++++-- .../skills/video-from-script/scripts/capcut_assemble.js | 2 ++ .../video-from-script/scripts/lib/phase-assemble.js | 9 ++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.claude/skills/video-from-script/scripts/batch-pipeline.js b/.claude/skills/video-from-script/scripts/batch-pipeline.js index 1fe4a42..a41658f 100644 --- a/.claude/skills/video-from-script/scripts/batch-pipeline.js +++ b/.claude/skills/video-from-script/scripts/batch-pipeline.js @@ -43,6 +43,7 @@ function parseArgs(argv) { else if (argv[i] === '--hashtags' && argv[i + 1]) args.hashtags = argv[++i] else if (argv[i] === '--format' && argv[i + 1]) args.format = argv[++i] else if (argv[i] === '--draft-dir' && argv[i + 1]) args.draftDir = argv[++i] + else if (argv[i] === '--draft-url' && argv[i + 1]) args.draftUrl = argv[++i] else if (argv[i] === '--with-script') args.withScript = true else if (!args.command) args.command = argv[i] } @@ -258,6 +259,7 @@ function cmdMark(args) { if (args.draftName) item.draftName = args.draftName if (args.forwardCopy) item.forwardCopy = args.forwardCopy if (args.hashtags) item.hashtags = args.hashtags + if (args.draftUrl) item.draftUrl = args.draftUrl batch.stats = calcStats(batch.items) writeJson(manifestPath, batch) @@ -314,6 +316,7 @@ function cmdNext(args) { topicA: item.topicA || '', topicB: item.topicB || '', draftName: item.draftName || '', + draftUrl: item.draftUrl || '', scriptFile: path.resolve(batchDir, item.scriptFile), } @@ -368,6 +371,7 @@ function cmdExport(args) { 音色: item.voice || '', 转发文案带话题: forwardFull, 草稿名称: item.draftName || '', + 草稿地址: item.draftUrl || '', }) } @@ -387,7 +391,7 @@ function cmdExport(args) { function exportCsv(manifestPath, rows) { const outPath = manifestPath.replace('.json', '_export.csv') - const headers = ['选题', '脚本', '账号', '模式', '音色', '转发文案带话题', '草稿名称'] + const headers = ['选题', '脚本', '账号', '模式', '音色', '转发文案带话题', '草稿名称', '草稿地址'] const lines = [headers.join(',')] for (const r of rows) { @@ -414,7 +418,7 @@ function exportCsv(manifestPath, rows) { function exportXlsx(manifestPath, rows) { try { const XLSX = require('xlsx') - const headers = ['选题', '脚本', '账号', '模式', '音色', '转发文案带话题', '草稿名称'] + const headers = ['选题', '脚本', '账号', '模式', '音色', '转发文案带话题', '草稿名称', '草稿地址'] const data = rows.map(r => headers.map(h => r[h] || '')) data.unshift(headers) diff --git a/.claude/skills/video-from-script/scripts/capcut_assemble.js b/.claude/skills/video-from-script/scripts/capcut_assemble.js index 845b05b..0176640 100644 --- a/.claude/skills/video-from-script/scripts/capcut_assemble.js +++ b/.claude/skills/video-from-script/scripts/capcut_assemble.js @@ -449,6 +449,8 @@ async function assemble(args) { if (mode === 'videos' && subtitles === 'false') { console.log(`\n >> 视频模式未加字幕,请在剪映中打开草稿 → 识别字幕 → 语音识别生成\n`) } + + return { draftUrl, draftId } } // ============================================================================ diff --git a/.claude/skills/video-from-script/scripts/lib/phase-assemble.js b/.claude/skills/video-from-script/scripts/lib/phase-assemble.js index ffcfe5b..35726d4 100644 --- a/.claude/skills/video-from-script/scripts/lib/phase-assemble.js +++ b/.claude/skills/video-from-script/scripts/lib/phase-assemble.js @@ -4,6 +4,7 @@ * 图片/视频 + TTS → 剪映草稿 */ +const fs = require('fs') const { log, getManifestDir } = require('./pipeline-utils') async function phaseAssemble(manifest, manifestPath, options) { @@ -45,7 +46,13 @@ async function phaseAssemble(manifest, manifestPath, options) { try { const { assemble } = require('../capcut_assemble') - await assemble(assembleArgs) + const result = await assemble(assembleArgs) + // 保存草稿地址到 manifest,供批量导出使用 + if (result && result.draftUrl) { + manifest.draftUrl = result.draftUrl + fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8') + log('assemble', `草稿地址已保存: ${result.draftUrl}`) + } log('assemble', '成片完成') } catch (err) { log('assemble', `成片失败: ${err.message}`)