agency-meetup-publish

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

AGENCY Meetup Publish

AGENCY 聚会录像发布

Publish AGENCY Community meetup recordings to YouTube with intro, thumbnail, description, and timecodes.
将AGENCY社区聚会录像发布到YouTube,包含片头、缩略图、描述和时间码。

Prerequisites

前置条件

  • ~/ai_projects/youtube-uploader/
    — YouTube upload scripts with OAuth credentials
  • ~/ai_projects/my-video/out/agency-swarm-intro.mp4
    — AGENCY intro animation (6s, 1920x1080)
  • Zoom OAuth configured at
    ~/.zoom_credentials/
  • ffmpeg
    and
    ffprobe
    installed
  • Playwright or Chrome installed (for thumbnail rendering)
  • ~/ai_projects/youtube-uploader/
    — 带有OAuth凭证的YouTube上传脚本
  • ~/ai_projects/my-video/out/agency-swarm-intro.mp4
    — AGENCY片头动画(6秒,1920x1080)
  • Zoom OAuth已在
    ~/.zoom_credentials/
    配置完成
  • 已安装
    ffmpeg
    ffprobe
  • 已安装Playwright或Chrome(用于缩略图渲染)

Pipeline Overview

流程概览

1. Identify meeting → 2. Download from Zoom → 3. Add intro/outro
→ 4. Generate timecodes → 5. Write description → 6. Create thumbnail
→ 7. Upload to YouTube → 8. Set thumbnail → 9. Add to playlist
1. Identify meeting → 2. Download from Zoom → 3. Add intro/outro
→ 4. Generate timecodes → 5. Write description → 6. Create thumbnail
→ 7. Upload to YouTube → 8. Set thumbnail → 9. Add to playlist

Step 1: Identify the Meeting

步骤1:确定会议

Ask the user for:
  • Meeting name or Zoom ID — if unknown, list recent recordings:
    bash
    python3 ~/.claude/skills/zoom/scripts/zoom_meetings.py recordings --start YYYY-MM-DD
  • Speaker name — for description and thumbnail
  • Topic summary — or derive from transcript
Get recording details:
bash
python3 ~/.claude/skills/zoom/scripts/zoom_meetings.py recording MEETING_ID
This returns MP4 download URL, duration, transcript URL, and other files.
向用户询问:
  • 会议名称或Zoom ID — 若未知,列出近期录像:
    bash
    python3 ~/.claude/skills/zoom/scripts/zoom_meetings.py recordings --start YYYY-MM-DD
  • 演讲者姓名 — 用于描述和缩略图
  • 主题摘要 — 或从转录文本中提取
获取录像详情:
bash
python3 ~/.claude/skills/zoom/scripts/zoom_meetings.py recording MEETING_ID
此命令会返回MP4下载链接、时长、转录文本链接及其他文件。

Step 2: Download from Zoom

步骤2:从Zoom下载

Download MP4 and VTT transcript in parallel:
bash
undefined
并行下载MP4视频和VTT转录文本:
bash
undefined

Video (run in background — large file)

Video (run in background — large file)

curl -L -o ~/Brains/brain/YYYYMMDD-meeting-slug.mp4 "DOWNLOAD_URL"
curl -L -o ~/Brains/brain/YYYYMMDD-meeting-slug.mp4 "DOWNLOAD_URL"

Transcript

Transcript

curl -L -o ~/Brains/brain/YYYYMMDD-meeting-slug.vtt "TRANSCRIPT_URL"

**Naming convention:** `YYYYMMDD-meeting-slug.mp4` where slug is a kebab-case topic summary.
curl -L -o ~/Brains/brain/YYYYMMDD-meeting-slug.vtt "TRANSCRIPT_URL"

**命名规范:** `YYYYMMDD-meeting-slug.mp4`,其中slug是主题摘要的短横线分隔格式。

Step 3: Add Intro (and Outro if Available)

步骤3:添加片头(如有片尾也添加)

The intro and meeting likely have different specs. Check both:
bash
ffprobe -v quiet -print_format json -show_streams INTRO.mp4
ffprobe -v quiet -print_format json -show_streams MEETING.mp4
Key parameters to match: resolution, fps, audio sample rate, audio channels.
片头和会议录像的参数可能不同,需检查两者:
bash
ffprobe -v quiet -print_format json -show_streams INTRO.mp4
ffprobe -v quiet -print_format json -show_streams MEETING.mp4
需要匹配的关键参数:分辨率、帧率、音频采样率、音频声道数

Re-encode intro to match meeting

重新编码片头以匹配会议录像

bash
ffmpeg -y -i ~/ai_projects/my-video/out/agency-swarm-intro.mp4 \
  -vf "scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2:black" \
  -r FPS -c:v libx264 -preset fast -crf 18 \
  -ar SAMPLE_RATE -ac CHANNELS -c:a aac \
  /tmp/intro-matched.mp4
bash
ffmpeg -y -i ~/ai_projects/my-video/out/agency-swarm-intro.mp4 \
  -vf "scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2:black" \
  -r FPS -c:v libx264 -preset fast -crf 18 \
  -ar SAMPLE_RATE -ac CHANNELS -c:a aac \
  /tmp/intro-matched.mp4

Trim meeting start

修剪会议录像开头

Review the VTT to find where real content begins. Typically trim 1-3 seconds of silence:
bash
ffmpeg -y -ss TRIM_SECONDS -i MEETING.mp4 \
  -c:v libx264 -preset fast -crf 18 \
  -ar SAMPLE_RATE -ac CHANNELS -c:a aac \
  -r FPS -vf "scale=WIDTH:HEIGHT" \
  /tmp/meeting-trimmed.mp4
This re-encode is necessary for concat compatibility. Run in background — it takes several minutes for long recordings.
查看VTT转录文本以找到实际内容开始的位置。通常修剪1-3秒的静音部分:
bash
ffmpeg -y -ss TRIM_SECONDS -i MEETING.mp4 \
  -c:v libx264 -preset fast -crf 18 \
  -ar SAMPLE_RATE -ac CHANNELS -c:a aac \
  -r FPS -vf "scale=WIDTH:HEIGHT" \
  /tmp/meeting-trimmed.mp4
为了兼容拼接操作,此重新编码步骤是必要的。后台运行此命令——长录像可能需要数分钟。

Concatenate

拼接视频

bash
echo "file '/tmp/intro-matched.mp4'" > /tmp/concat-list.txt
echo "file '/tmp/meeting-trimmed.mp4'" >> /tmp/concat-list.txt
bash
echo "file '/tmp/intro-matched.mp4'" > /tmp/concat-list.txt
echo "file '/tmp/meeting-trimmed.mp4'" >> /tmp/concat-list.txt

If outro exists:

If outro exists:

echo "file '/tmp/outro-matched.mp4'" >> /tmp/concat-list.txt

echo "file '/tmp/outro-matched.mp4'" >> /tmp/concat-list.txt

ffmpeg -y -f concat -safe 0 -i /tmp/concat-list.txt -c copy
~/ai_projects/my-video/out/YYYYMMDD-meeting-slug-final.mp4
undefined
ffmpeg -y -f concat -safe 0 -i /tmp/concat-list.txt -c copy
~/ai_projects/my-video/out/YYYYMMDD-meeting-slug-final.mp4
undefined

Step 4: Generate Timecodes from Transcript

步骤4:从转录文本生成时间码

Read the VTT transcript and identify up to 20 topic transitions. Look for:
  • Speaker changes (especially when the main speaker starts)
  • Topic shifts signaled by phrases like "давайте", "следующий", "перейдем к"
  • Q&A segments
  • Demo/screen-share moments
  • Conclusion/wrap-up
Important: Timecodes must account for the intro offset. Add the intro duration (typically 6s) to all VTT timestamps.
Format:
MM:SS Topic description
or
H:MM:SS
for videos over 1 hour.
读取VTT转录文本,识别最多20个主题转换点。重点关注:
  • 演讲者变更(尤其是主演讲者开始发言时)
  • 表示主题切换的短语,如“давайте”“следующий”“перейдем к”
  • 问答环节
  • 演示/屏幕共享时刻
  • 总结/收尾部分
重要提示: 时间码必须考虑片头的时长偏移。将所有VTT时间戳加上片头时长(通常为6秒)。
格式:
MM:SS 主题描述
,若视频超过1小时则使用
H:MM:SS

Step 5: Write Description

步骤5:撰写描述

Follow the template from previous AGENCY Community uploads. See
references/description-template.md
for the full template.
Key sections:
  1. Title line
    AGENCY Community Meetup: [Topic]
  2. Summary paragraph — 2-3 sentences about the speaker and topic
  3. Bullet points — 5-7 key topics covered (use •)
  4. Timecodes — prefixed with
    ⏱ Таймкоды:
  5. Community line
    AGENCY Community — сообщество практиков AI-автоматизации.
  6. Links — prefixed with 🔗, using → arrows
  7. Hashtags — topic-relevant, always include
    #AGENCY #Community
Save description to
/tmp/youtube-description.txt
.
遵循之前AGENCY社区上传的模板。完整模板请查看
references/description-template.md
关键部分:
  1. 标题行
    AGENCY Community Meetup: [Topic]
  2. 摘要段落 — 2-3句话介绍演讲者和主题
  3. 项目符号 — 5-7个涵盖的关键主题(使用•)
  4. 时间码 — 前缀为
    ⏱ Таймкоды:
  5. 社区标语
    AGENCY Community — сообщество практиков AI-автоматизации.
  6. 链接 — 前缀为🔗,使用→箭头
  7. 话题标签 — 与主题相关,务必包含
    #AGENCY #Community
将描述保存到
/tmp/youtube-description.txt

Step 6: Create Thumbnail

步骤6:创建缩略图

Use the AGENCY thumbnail HTML template rendered to 1280x720 PNG.
使用AGENCY缩略图HTML模板渲染为1280x720的PNG图片。

Template approach

模板方法

Write an HTML file at
/tmp/thumbnail.html
based on
references/thumbnail-template.html
. Customize:
  • Title text — short, punchy (2-4 words max per line)
  • Subtitle — in EB Garamond italic
  • Speaker line
    Speaker Name × AGENCY
  • Speaker photo — if available, use with
    mix-blend-mode: hard-light
基于
references/thumbnail-template.html
/tmp/thumbnail.html
生成HTML文件。自定义内容:
  • 标题文本 — 简短有力(每行最多2-4个单词)
  • 副标题 — 使用EB Garamond斜体
  • 演讲者行
    Speaker Name × AGENCY
  • 演讲者照片 — 如有可用,使用
    mix-blend-mode: hard-light
    效果

Render to PNG

渲染为PNG

Preferred: headless Chrome (no install needed):
bash
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --headless --screenshot=/tmp/thumbnail.png \
  --window-size=1280,720 --hide-scrollbars \
  "file:///tmp/thumbnail.html"
Fallback: Playwright:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page(viewport={'width': 1280, 'height': 720})
    page.goto('file:///tmp/thumbnail.html')
    page.wait_for_timeout(2000)
    page.screenshot(path='/tmp/thumbnail.png')
    browser.close()
首选方式:无头Chrome(无需额外安装):
bash
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --headless --screenshot=/tmp/thumbnail.png \
  --window-size=1280,720 --hide-scrollbars \
  "file:///tmp/thumbnail.html"
备选方式:Playwright:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page(viewport={'width': 1280, 'height': 720})
    page.goto('file:///tmp/thumbnail.html')
    page.wait_for_timeout(2000)
    page.screenshot(path='/tmp/thumbnail.png')
    browser.close()

Step 7: Upload to YouTube

步骤7:上传至YouTube

bash
cd ~/ai_projects/youtube-uploader && python3 youtube_upload.py \
  --video ~/ai_projects/my-video/out/FINAL.mp4 \
  --title "TITLE" \
  --description "$(cat /tmp/youtube-description.txt)" \
  --category education \
  --privacy public \
  --tags "TAG1,TAG2,..." \
  --yes
The upload script outputs the Video ID and Video URL on success. Capture these for the next steps.
Title guidelines: Keep under 100 chars. Format:
Topic — Speaker Name
. Include key terms for search.
bash
cd ~/ai_projects/youtube-uploader && python3 youtube_upload.py \
  --video ~/ai_projects/my-video/out/FINAL.mp4 \
  --title "TITLE" \
  --description "$(cat /tmp/youtube-description.txt)" \
  --category education \
  --privacy public \
  --tags "TAG1,TAG2,..." \
  --yes
上传成功后,脚本会输出视频ID视频链接。记录这些信息用于后续步骤。
标题准则: 长度不超过100字符。格式:
Topic — Speaker Name
。包含便于搜索的关键词。

Step 8: Set Thumbnail

步骤8:设置缩略图

bash
cd ~/ai_projects/youtube-uploader && \
  python3 youtube_manage.py thumbnails set VIDEO_ID /tmp/thumbnail.png
bash
cd ~/ai_projects/youtube-uploader && \
  python3 youtube_manage.py thumbnails set VIDEO_ID /tmp/thumbnail.png

Step 9: Add to Playlist

步骤9:添加到播放列表

The AGENCY Community playlist ID is
PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m
.
bash
cd ~/ai_projects/youtube-uploader && \
  python3 youtube_manage.py playlists add-item PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m VIDEO_ID
AGENCY社区播放列表ID为
PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m
bash
cd ~/ai_projects/youtube-uploader && \
  python3 youtube_manage.py playlists add-item PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m VIDEO_ID

Parallelization Strategy

并行化策略

For speed, run these in parallel where possible:
PhaseCan parallelize with
Download MP4Download VTT
Re-encode meeting (bg)Read transcript, draft timecodes
Upload to YouTube (bg)Generate thumbnail
Set thumbnailAdd to playlist
为提升速度,可在以下环节并行操作:
阶段可并行操作的环节
下载MP4下载VTT
重新编码会议录像(后台)读取转录文本、草拟时间码
上传至YouTube(后台)生成缩略图
设置缩略图添加到播放列表

Output

输出

Report to the user:
  • Video URL:
    https://www.youtube.com/watch?v=VIDEO_ID
  • Studio URL:
    https://studio.youtube.com/video/VIDEO_ID/edit
  • Playlist: AGENCY Community
向用户汇报:
  • 视频链接:
    https://www.youtube.com/watch?v=VIDEO_ID
  • 工作室链接:
    https://studio.youtube.com/video/VIDEO_ID/edit
  • 播放列表: AGENCY Community

Existing Skills Used

使用的现有技能

This pipeline builds on:
  • zoom
    ~/.claude/skills/zoom/
    for Zoom recording access
  • video-youtube-upload
    ~/.claude/skills/video-youtube-upload/
    for upload reference
  • youtube
    ~/.claude/skills/youtube/
    for post-upload management
  • agency-socials
    ~/.claude/skills/agency-socials/
    for cover design system reference
此流程基于以下技能构建:
  • zoom
    ~/.claude/skills/zoom/
    用于访问Zoom录像
  • video-youtube-upload
    ~/.claude/skills/video-youtube-upload/
    作为上传参考
  • youtube
    ~/.claude/skills/youtube/
    用于上传后管理
  • agency-socials
    ~/.claude/skills/agency-socials/
    用于封面设计系统参考