mcpField
V
video-ingest

video-ingest

github.com/joelhooks生产力6536 次安装1 天前更新
代码仓库

关于 video-ingest

video-ingest 是通过 Inngest 事件触发的视频与转录处理技能,面向需要将视频纳入 vault 的操作者。它协调下载、NAS 传输、转录和摘要流程,并提供监控与批量提交方法。

主要功能

  1. 01事件触发视频处理流程
  2. 02自动下载并传输至 NAS
  3. 03自动转录并生成 vault 笔记
  4. 04支持批量提交视频
  5. 05提供运行监控与故障排查

适用场景

  1. 01提交视频 URL 并生成笔记
  2. 02处理已有音频或原始转录文本
  3. 03批量排队处理多个视频

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/joelhooks/joelclaw --skill video-ingest

安装后在 Claude Code 中输入/video-ingest确认已加载。

详细介绍

视频摄取 — 通过 Inngest Pipeline

视频通过 Inngest 事件总线摄取。请勿运行 yt-dlp、mlx-whisper、scp,也不要手动创建知识库笔记。 Pipeline 会处理所有步骤:下载 → 传输到 NAS → 转录 → 知识库笔记 → 摘要补充。

快速开始

joelclaw send pipeline/video.requested -d '{"url":"URL_HERE"}'

# legacy alias still accepted
joelclaw send pipeline/video.download -d '{"url":"URL_HERE"}'

就这样。事件链会处理剩下的所有工作。

另一种方式(原始 curl):

curl -s -X POST "http://localhost:8288/e/$INNGEST_EVENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"pipeline/video.requested","data":{"url":"URL_HERE"}}'

Pipeline 流程

pipeline/video.requested       — you send this (legacy alias: pipeline/video.download)
    ↓
video-download function        — yt-dlp → /tmp → NAS transfer
    ↓ emits
pipeline/video.downloaded      — logged by system-logger
pipeline/transcript.requested  — auto-triggered (legacy alias: pipeline/transcript.process)
    ↓
transcript-process function    — mlx-whisper (M4 Pro, ~5min/hr of video)
    ↓ emits
pipeline/transcript.processed  — logged
content/summarize.requested    — auto-triggered (legacy alias: content/summarize)
    ↓
content-summarize function     — pi enrichment → vault note with summary
    ↓ emits
content/summarized             — logged, done

发送前:健康检查

发送事件前,请务必确认 Pipeline 运行正常:

# Inngest server
curl -s http://localhost:8288/health

# Worker (should show functions including video-download)
curl -s http://localhost:3111/ | python3 -c "
import json,sys
d=json.load(sys.stdin)
fns = [f.get('id','?') for f in d.get('functions',[])]
print(f'Worker OK — {len(fns)} functions: {', '.join(fns)}')
"

# Docker container running
docker ps --filter ancestor=inngest/inngest --format "table {{.Status}}\t{{.Ports}}"

如果 worker 已停止:

kubectl -n joelclaw rollout restart deployment/system-bus-worker
kubectl -n joelclaw rollout status deployment/system-bus-worker --timeout=180s
joelclaw refresh

监控运行情况

实时查看进度
# Worker logs — shows step execution + failures
kubectl logs -n joelclaw deploy/system-bus-worker -f

# Docker logs — shows event dispatch
docker logs -f $(docker ps -q --filter ancestor=inngest/inngest) 2>&1 | grep -v DEBUG
检查事件是否已触发
# Look for the video's events in Docker logs
docker logs $(docker ps -q --filter ancestor=inngest/inngest) 2>&1 | grep -i "video\|transcript\|summarize" | tail -20
仪表板

在浏览器中打开 http://localhost:8288 — 查看函数、事件和运行情况,以及每个步骤的跟踪记录。

验证是否完成
# Check if vault note was created
ls -la ~/Vault/Resources/videos/*SLUG*

# Check canonical telemetry for pipeline entries
joelclaw otel search "video|transcript|summarize" --hours 24

批量摄取

发送多个事件。Inngest 会将它们排队,并通过并发控制进行处理:

joelclaw send pipeline/video.requested -d '{"url":"https://youtube.com/watch?v=XXXX"}'
joelclaw send pipeline/video.requested -d '{"url":"https://youtube.com/watch?v=YYYY"}'
joelclaw send pipeline/video.requested -d '{"url":"https://youtube.com/watch?v=ZZZZ"}'

手动转录(非 YouTube)

对于已存储在磁盘上的音频文件,或来自 Granola/Fathom 的原始文本:

# From audio file
joelclaw send pipeline/transcript.requested -d '{"source":"manual","audioPath":"/path/to/audio.mp4","title":"Recording Title","slug":"recording-title"}'

# From raw text (Granola, Fathom, etc.)
joelclaw send pipeline/transcript.requested -d '{"source":"granola","text":"transcript text...","title":"Meeting Title","slug":"meeting-title"}'

仅重新生成摘要

如果知识库笔记已存在,但需要更好的摘要:

joelclaw send content/summarize.requested -d '{"vaultPath":"/Users/joel/Vault/Resources/videos/SLUG.md"}'

选项

字段默认值描述
url必填YouTube 或视频 URL
maxQuality"1080"视频最高分辨率:"720"、"1080"、"4k"

文件存放位置

内容位置
视频和元数据NAS:/volume1/home/joel/video/YYYY/SLUG/
知识库笔记~/Vault/Resources/videos/SLUG.md
每日笔记链接~/Vault/Daily/YYYY-MM-DD.md 中的 ## Videos 下
运行时遥测数据joelclaw otel(Typesense/ClickHouse 中的 otel_events)
持久化来源凭据知识库笔记,以及发起该流程的 Inngest 事件/运行记录

故障排除

如果事件已被接受(200 OK),但没有任何后续操作:

  1. 检查 Docker→worker 的连通性 — 这是最常见的问题:

    docker logs $(docker ps -q --filter ancestor=inngest/inngest) 2>&1 | grep -E "ERROR|Unable" | tail -5
    

    如果看到“Unable to reach SDK URL” → 请参阅 inngest skill 中关于 serveHost 的注意事项。

  2. 检查 worker 是否确实在运行:

    kubectl get deploy -n joelclaw system-bus-worker
    kubectl get pods -n joelclaw -l app=system-bus-worker
    
  3. 检查特定函数的 worker 错误:

    kubectl logs -n joelclaw deploy/system-bus-worker --tail=80
    
  4. 使用 inngest-debug skill,通过 GraphQL 深入检查特定运行 ID。

请勿执行的操作

  • ❌ 不要直接运行 yt-dlp — Pipeline 会处理下载和传输到 NAS
  • ❌ 不要直接运行 mlx_whisper — Pipeline 会处理转录
  • ❌ 不要手动使用 scp 传输到 NAS — Pipeline 会处理传输
  • ❌ 不要手动创建知识库笔记 — Pipeline 会使用正确的 frontmatter 创建笔记
  • ❌ 不要使用 codex/后台任务处理视频 — Inngest 支持持久化执行和重试

评论

支持 Markdown