feat(video-from-script): 自动解析草稿地址并修复导出空值问题

在 `cmdMark` 命令中,当标记为已完成状态且未提供草稿地址时,自动从子任务的 `manifestPath` 中读取 `draftUrl`;在 `cmdExport` 导出 CSV 时,使用 `resolveDraftUrl` 函数统一解析草稿地址,确保导出结果包含完整的公网可下载链接。

同时修改 `phaseAssemble` 阶段,使用 `BASE_URL` 和 `draftId` 构造公网可访问的绝对路径保存到 manifest 中,替代之前仅保存相对路径的方式。
This commit is contained in:
2026-05-17 23:43:30 +08:00
parent 65af6c92fc
commit ac6f110f28
2 changed files with 24 additions and 5 deletions

View File

@@ -20,6 +20,19 @@ const { SKILLS_DIR, ACCOUNTS_DIR, loadConfig, resolveVoice } = require('./lib/pi
// output/ 在项目根的父级(美图/output/
const OUTPUT_BASE = path.join(SKILLS_DIR, '..', '..', '..', 'output')
// ============================================================================
// 工具函数
// ============================================================================
/** 从 batch item 解析草稿地址:自身 draftUrl 优先,否则读子任务 manifest */
function resolveDraftUrl(item) {
if (item.draftUrl) return item.draftUrl
if (!item.manifestPath) return ''
try {
return readJson(path.resolve(item.manifestPath)).draftUrl || ''
} catch { return '' }
}
// ============================================================================
// CLI 参数解析
// ============================================================================
@@ -259,7 +272,11 @@ 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
if (args.draftUrl) {
item.draftUrl = args.draftUrl
} else if (args.status === 'completed' && !item.draftUrl) {
item.draftUrl = resolveDraftUrl(item) || undefined
}
batch.stats = calcStats(batch.items)
writeJson(manifestPath, batch)
@@ -376,7 +393,7 @@ function cmdExport(args) {
音色: item.voice || '',
转发文案带话题: forwardFull,
草稿名称: item.draftName || '',
草稿地址: item.draftUrl || '',
草稿地址: resolveDraftUrl(item),
})
}

View File

@@ -46,12 +46,14 @@ async function phaseAssemble(manifest, manifestPath, options) {
try {
const { assemble } = require('../capcut_assemble')
const { BASE_URL } = require('./capcut-api')
const result = await assemble(assembleArgs)
// 保存草稿地址到 manifest供批量导出使用
if (result && result.draftUrl) {
manifest.draftUrl = result.draftUrl
// 用 BASE_URL + draft_id 构造公网可下载的绝对路径
if (result && result.draftId) {
manifest.draftUrl = `${BASE_URL}/get_draft?draft_id=${result.draftId}`
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8')
log('assemble', `草稿地址已保存: ${result.draftUrl}`)
log('assemble', `草稿地址已保存: ${manifest.draftUrl}`)
}
log('assemble', '成片完成')
} catch (err) {