agency-meetup-publish
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAGENCY Meetup Publish
AGENCY 聚会录像发布
Publish AGENCY Community meetup recordings to YouTube with intro, thumbnail, description, and timecodes.
将AGENCY社区聚会录像发布到YouTube,包含片头、缩略图、描述和时间码。
Prerequisites
前置条件
- — YouTube upload scripts with OAuth credentials
~/ai_projects/youtube-uploader/ - — AGENCY intro animation (6s, 1920x1080)
~/ai_projects/my-video/out/agency-swarm-intro.mp4 - Zoom OAuth configured at
~/.zoom_credentials/ - and
ffmpeginstalledffprobe - Playwright or Chrome installed (for thumbnail rendering)
- — 带有OAuth凭证的YouTube上传脚本
~/ai_projects/youtube-uploader/ - — AGENCY片头动画(6秒,1920x1080)
~/ai_projects/my-video/out/agency-swarm-intro.mp4 - Zoom OAuth已在 配置完成
~/.zoom_credentials/ - 已安装 和
ffmpegffprobe - 已安装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 playlist1. 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 playlistStep 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_IDThis 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
undefinedVideo (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.mp4Key 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.mp4bash
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.mp4Trim 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.mp4This 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.txtbash
echo "file '/tmp/intro-matched.mp4'" > /tmp/concat-list.txt
echo "file '/tmp/meeting-trimmed.mp4'" >> /tmp/concat-list.txtIf 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
~/ai_projects/my-video/out/YYYYMMDD-meeting-slug-final.mp4
undefinedffmpeg -y -f concat -safe 0 -i /tmp/concat-list.txt -c copy
~/ai_projects/my-video/out/YYYYMMDD-meeting-slug-final.mp4
~/ai_projects/my-video/out/YYYYMMDD-meeting-slug-final.mp4
undefinedStep 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: or for videos over 1 hour.
MM:SS Topic descriptionH:MM:SS读取VTT转录文本,识别最多20个主题转换点。重点关注:
- 演讲者变更(尤其是主演讲者开始发言时)
- 表示主题切换的短语,如“давайте”“следующий”“перейдем к”
- 问答环节
- 演示/屏幕共享时刻
- 总结/收尾部分
重要提示: 时间码必须考虑片头的时长偏移。将所有VTT时间戳加上片头时长(通常为6秒)。
格式:,若视频超过1小时则使用 。
MM:SS 主题描述H:MM:SSStep 5: Write Description
步骤5:撰写描述
Follow the template from previous AGENCY Community uploads. See for the full template.
references/description-template.mdKey sections:
- Title line —
AGENCY Community Meetup: [Topic] - Summary paragraph — 2-3 sentences about the speaker and topic
- Bullet points — 5-7 key topics covered (use •)
- Timecodes — prefixed with
⏱ Таймкоды: - Community line —
AGENCY Community — сообщество практиков AI-автоматизации. - Links — prefixed with 🔗, using → arrows
- Hashtags — topic-relevant, always include
#AGENCY #Community
Save description to .
/tmp/youtube-description.txt遵循之前AGENCY社区上传的模板。完整模板请查看 。
references/description-template.md关键部分:
- 标题行 —
AGENCY Community Meetup: [Topic] - 摘要段落 — 2-3句话介绍演讲者和主题
- 项目符号 — 5-7个涵盖的关键主题(使用•)
- 时间码 — 前缀为
⏱ Таймкоды: - 社区标语 —
AGENCY Community — сообщество практиков AI-автоматизации. - 链接 — 前缀为🔗,使用→箭头
- 话题标签 — 与主题相关,务必包含
#AGENCY #Community
将描述保存到 。
/tmp/youtube-description.txtStep 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 based on . Customize:
/tmp/thumbnail.htmlreferences/thumbnail-template.html- 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
基于 在 生成HTML文件。自定义内容:
references/thumbnail-template.html/tmp/thumbnail.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,..." \
--yesThe upload script outputs the Video ID and Video URL on success. Capture these for the next steps.
Title guidelines: Keep under 100 chars. Format: . Include key terms for search.
Topic — Speaker Namebash
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 NameStep 8: Set Thumbnail
步骤8:设置缩略图
bash
cd ~/ai_projects/youtube-uploader && \
python3 youtube_manage.py thumbnails set VIDEO_ID /tmp/thumbnail.pngbash
cd ~/ai_projects/youtube-uploader && \
python3 youtube_manage.py thumbnails set VIDEO_ID /tmp/thumbnail.pngStep 9: Add to Playlist
步骤9:添加到播放列表
The AGENCY Community playlist ID is .
PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0mbash
cd ~/ai_projects/youtube-uploader && \
python3 youtube_manage.py playlists add-item PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m VIDEO_IDAGENCY社区播放列表ID为 。
PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0mbash
cd ~/ai_projects/youtube-uploader && \
python3 youtube_manage.py playlists add-item PLZNP0SKU2SqjHOy01UjDxhSRtcluvuw0m VIDEO_IDParallelization Strategy
并行化策略
For speed, run these in parallel where possible:
| Phase | Can parallelize with |
|---|---|
| Download MP4 | Download VTT |
| Re-encode meeting (bg) | Read transcript, draft timecodes |
| Upload to YouTube (bg) | Generate thumbnail |
| Set thumbnail | Add 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 — for Zoom recording access
~/.claude/skills/zoom/ - video-youtube-upload — for upload reference
~/.claude/skills/video-youtube-upload/ - youtube — for post-upload management
~/.claude/skills/youtube/ - agency-socials — for cover design system reference
~/.claude/skills/agency-socials/
此流程基于以下技能构建:
- zoom — 用于访问Zoom录像
~/.claude/skills/zoom/ - video-youtube-upload — 作为上传参考
~/.claude/skills/video-youtube-upload/ - youtube — 用于上传后管理
~/.claude/skills/youtube/ - agency-socials — 用于封面设计系统参考
~/.claude/skills/agency-socials/