YouTube Upload — đăng video + metadata tự động
Nhận 1 file video (đã edit) → BẠN (Claude) viết tiêu đề + mô tả + tag + hashtag (tối ưu reup ăn uống VN) → đăng lên 1 kênh YouTube.
⭐ MẶC ĐỊNH KÊNH REUP NÀY = ĐĂNG SHORTS (KHÔNG đăng video dài)
Chiến lược kênh Ăn Là Sập là Shorts (reach tốt hơn cho kênh mới). Clip dub gốc thường ~6 phút = quá dài cho Short (Short tối đa 3 phút, feed ăn nhất 30–60s).
→ MẶC ĐỊNH: CẮT NHIỀU Short ~55–60s từ 1 clip (Tony chốt 15/7/2026 — "cắt nhiều phần vào"). Mỗi clip mukbang 5–6 phút tách được 2–4 Short ở các mốc money-shot (mở bàn/reveal · món tủ trong tiêu đề · cao trào ăn · phản ứng · tráng miệng). Đừng chỉ ra 1 Short. YouTube tự nhận dọc 9:16 + ≤3 phút → Short (link ra youtube.com/shorts/...).
- Cắt bằng ffmpeg (giữ nguyên khung dọc, fade nhẹ 2 đầu):
ffmpeg -ss <start> -i "<clip>" -t 60 -vf "fade=t=in:st=0:d=0.25,fade=t=out:st=59.6:d=0.4" -af "afade=t=in:st=0:d=0.25,afade=t=out:st=59.6:d=0.4" -c:v libx264 -crf 20 -preset veryfast -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart out.mp4
- ⚠️ File CapCut export có thể đã cắt bớt so với bản dub gốc (vd 330s→300s) → timestamp segs_vi KHÔNG còn khớp; phải TRÍCH KHUNG trực tiếp từ file CapCut (
ffmpeg -ss T -i clip -frames:v 1 f.jpg rồi Read) để chọn mốc money-shot + canh cắt chỗ không đứt câu.
- Mỗi Short = metadata riêng (tiêu đề khác nhau theo đoạn) + #Shorts + 3–5 hashtag. Hẹn lịch: CÙNG NGÀY, cách nhau 1 tiếng (Tony chốt 16/7/2026 — vd 12:00 / 13:00 / 14:00 cùng ngày), KHÔNG rải mỗi ngày 1 cái. Báo user giờ đã đặt, họ chỉnh lại được.
- Chỉ đăng video dài khi user nói rõ. (14/7/2026: Claude lỡ đăng nguyên clip 6:35 thành video thường → Tony bảo "phải đăng Shorts chứ" → phải ẩn video dài + cắt Short lại.)
⚠️ YouTube gắt reup hơn Facebook (chính sách "inauthentic/reused content" 7/2025, phạt CẢ KÊNH; + Content ID bản quyền). Giọng Việt + caption che = điểm cộng "biến đổi" nhưng vẫn coi là test/phễu view. Nói thật với user.
HAI đường đăng
|
Browser (studio.youtube.com) |
Data API (youtube_upload.py) |
| Setup |
Chỉ cần đăng nhập Google trong browser |
OAuth Google Cloud (rườm rà) |
| Công khai |
✅ Public/hẹn lịch bình thường |
⚠️ Project chưa audit → video BỊ KHÓA private, không public được |
| Trạng thái |
ĐƯỜNG CHÍNH đang dùng |
Để dành sau (khi đã audit / chấp nhận private) |
→ Mặc định đi browser. Chỉ dùng API khi user đã setup OAuth + chấp nhận/đã qua giới hạn private.
Đường dẫn
- Code:
~/.claude/skills/youtube-upload/ (SKILL.md, youtube_upload.py)
- Venv (nếu dùng API):
~/DouyinReup/.dubvenv (cần cài google-api-python-client google-auth-oauthlib)
- Config API (nếu dùng):
~/DouyinReup/yt_config.json
QUY TRÌNH BROWSER (mặc định) — dùng Playwright MCP
- XÁC ĐỊNH KÊNH: user nói tên kênh → dùng. Không nói + có nhiều kênh → hỏi (AskUserQuestion) + gợi ý theo loại video (ăn uống → "Ăn Là Sập").
- ĐĂNG NHẬP: vào
studio.youtube.com. Nếu bị đá ra trang chọn/đăng nhập Google → KHÔNG tự nhập mật khẩu (bảo mật). Nhờ user tự đăng nhập đúng tài khoản chứa kênh đó, rồi tiếp tục. Xác nhận đang ở đúng kênh (avatar/tên góc phải; đổi kênh qua "Chuyển tài khoản" nếu cần).
- VIẾT METADATA (mục dưới): lưu
title.txt + desc.txt (dựa nội dung clip — clip vừa dub thì đã biết từ segs_vi).
- UPLOAD:
Tạo (Create) ▸ Tải video lên (Upload videos) → chọn file. ⚠️ Browser MCP chỉ up được file trong ~/tony-programming → copy clip vào đó trước (cp "<video>" ~/tony-programming/yt_upload.mov), xong xoá sau.
- Điền Tiêu đề + Mô tả.
- Đối tượng: "Không, đây KHÔNG phải nội dung dành cho trẻ em" (Not made for kids) — BẮT BUỘC chọn.
- "Hiện thêm (Show more)" → Thẻ (Tags): dán list tag. (Hashtag để trong mô tả.)
- Bấm tiếp qua các bước (Yếu tố video / Kiểm tra) → tới Chế độ hiển thị (Visibility).
- Chế độ hiển thị: Công khai (Public) / Không công khai (Unlisted) / Riêng tư (Private) / Lên lịch (Schedule). ⚠️ Đây là bước ra ngoài → HỎI user chọn (mặc định gợi ý Public hoặc Schedule giờ VN) rồi mới Xuất bản (Publish) / Lên lịch.
- Tự soi + báo user: chụp màn hình xác nhận đăng/hẹn lịch OK; báo link video + kênh + tiêu đề.
- Shorts: clip dọc 9:16 ≤ 3 phút → YouTube tự nhận là Short (up y hệt). Clip dài (vd 6 phút) = video thường. Muốn nhắm Short thì cắt highlight ngắn.
METADATA — BẠN tự quyết (tối ưu reup ăn uống VN)
- Tiêu đề (< 100 ký tự, từ khóa ở 3 chữ đầu, gây tò mò + emoji):
VD:
Đớp SẬP nhà hàng omakase — ngỗng quay 1999 tệ 😳🔥 | Ăn Là Sập
- Mô tả:
- 2-3 dòng đầu = HOOK (hiện ở tìm kiếm/trước "xem thêm"): kể cái đỉnh nhất, gợi tò mò.
- Vài dòng mô tả món + giọng trend (đớp/phê/thánh đớp/xỉu ngang).
- CTA: hỏi 1 câu kéo comment + "🔔 Đăng ký kênh ... để hóng tập mới mỗi ngày!"
- Link chéo:
👉 Facebook: fb.com/AnLaSap.Official
- 3–5 hashtag cuối mô tả:
#mukbang #anuong #ansap (+ #Shorts nếu là Short).
- Thẻ (Tags, 10–15):
mukbang, ăn là sập, ăn uống, review đồ ăn, thử thách ăn, mukbang việt nam, ẩm thực, đồ ăn trung quốc, review nhà hàng, ... (thêm tên món/địa danh trong clip).
- KHÔNG bịa giá/số liệu. Ngôn ngữ kênh = Tiếng Việt.
(TÙY CHỌN) Đường API — youtube_upload.py
Chỉ khi user đã setup OAuth. Đọc ~/DouyinReup/yt_config.json:
{"client_secret":"~/DouyinReup/yt_client_secret.json",
"channels":{"Ăn Là Sập":{"token":"~/DouyinReup/yt_token_anlasap.json"}}}
- SETUP (user tự làm): console.cloud.google.com → tạo project → bật YouTube Data API v3 → tạo OAuth client (Desktop app) → tải
client_secret.json về ~/DouyinReup/. Cài lib: ~/DouyinReup/.dubvenv/bin/pip install google-api-python-client google-auth-oauthlib.
- Chạy:
PY=~/DouyinReup/.dubvenv/bin/python
"$PY" ~/.claude/skills/youtube-upload/youtube_upload.py "<video>" --channel "Ăn Là Sập" --title-file title.txt --desc-file desc.txt --tags "a,b,c" --privacy public
- Hẹn giờ (giờ VN):
--publish-at "2026-07-15 19:00" (tự đổi UTC; ép --privacy private theo yêu cầu API).
- Lần đầu mở browser xin quyền → lưu token; lần sau tự refresh.
- ⚠️ CẢNH BÁO private-lock: project chưa qua audit của Google → mọi video upload qua API bị khóa
private, đặt public cũng vô hiệu. Muốn public phải nộp audit (chờ Google duyệt). → Trước khi audit, dùng browser cho video công khai.
Thành thật (nói với user)
- Reup + dub khó kiếm tiền bền + rủi ro bản quyền/ToS — làm để TEST view.
- YouTube phạt cấp KÊNH → đừng để 20 video giống khuôn; nên thêm biến đổi (bình luận riêng, ghép clip, đổi format).
- Mật khẩu Google là của user — Claude KHÔNG nhập hộ.
1---2name: youtube-upload3description: Đăng SHORTS (mặc định — cắt highlight ~60s) hoặc video lên 1 KÊNH YouTube (chọn theo TÊN) + tự viết tiêu đề/mô tả/tag/hashtag tối ưu (kênh reup ăn uống VN kiểu a Phong / Ăn Là Sập). Dùng khi user muốn "up/đăng video/short lên youtube", "đăng youtube", "lên kênh youtube X". Input = file video + TÊN KÊNH (thiếu thì hỏi + gợi ý). Đường CHÍNH = browser (YouTube Studio); API là tùy chọn.4---56# YouTube Upload — đăng video + metadata tự động78Nhận **1 file video** (đã edit) → **BẠN (Claude) viết tiêu đề + mô tả + tag + hashtag** (tối ưu reup ăn uống VN) → đăng lên **1 kênh YouTube**.910## ⭐ MẶC ĐỊNH KÊNH REUP NÀY = ĐĂNG **SHORTS** (KHÔNG đăng video dài)11Chiến lược kênh Ăn Là Sập là **Shorts** (reach tốt hơn cho kênh mới). Clip dub gốc thường ~6 phút = **quá dài cho Short** (Short tối đa **3 phút**, feed ăn nhất **30–60s**).12→ **MẶC ĐỊNH: CẮT NHIỀU Short ~55–60s từ 1 clip** (Tony chốt 15/7/2026 — "cắt nhiều phần vào"). Mỗi clip mukbang 5–6 phút tách được **2–4 Short** ở các mốc money-shot (mở bàn/reveal · món tủ trong tiêu đề · cao trào ăn · phản ứng · tráng miệng). Đừng chỉ ra 1 Short. YouTube tự nhận **dọc 9:16 + ≤3 phút → Short** (link ra `youtube.com/shorts/...`).13- Cắt bằng ffmpeg (giữ nguyên khung dọc, fade nhẹ 2 đầu):14 `ffmpeg -ss <start> -i "<clip>" -t 60 -vf "fade=t=in:st=0:d=0.25,fade=t=out:st=59.6:d=0.4" -af "afade=t=in:st=0:d=0.25,afade=t=out:st=59.6:d=0.4" -c:v libx264 -crf 20 -preset veryfast -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart out.mp4`15- ⚠️ File CapCut export **có thể đã cắt bớt** so với bản dub gốc (vd 330s→300s) → **timestamp segs_vi KHÔNG còn khớp**; phải TRÍCH KHUNG trực tiếp từ file CapCut (`ffmpeg -ss T -i clip -frames:v 1 f.jpg` rồi Read) để chọn mốc money-shot + canh cắt chỗ không đứt câu.16- Mỗi Short = metadata riêng (tiêu đề khác nhau theo đoạn) + **#Shorts** + 3–5 hashtag. Hẹn lịch: **CÙNG NGÀY, cách nhau 1 tiếng** (Tony chốt 16/7/2026 — vd 12:00 / 13:00 / 14:00 cùng ngày), KHÔNG rải mỗi ngày 1 cái. Báo user giờ đã đặt, họ chỉnh lại được.17- Chỉ đăng **video dài** khi user nói rõ. (14/7/2026: Claude lỡ đăng nguyên clip 6:35 thành video thường → Tony bảo "phải đăng Shorts chứ" → phải ẩn video dài + cắt Short lại.)1819⚠️ **YouTube gắt reup hơn Facebook** (chính sách "inauthentic/reused content" 7/2025, phạt CẢ KÊNH; + Content ID bản quyền). Giọng Việt + caption che = điểm cộng "biến đổi" nhưng vẫn coi là **test/phễu view**. Nói thật với user.2021## HAI đường đăng22| | Browser (studio.youtube.com) | Data API (`youtube_upload.py`) |23|---|---|---|24| Setup | Chỉ cần đăng nhập Google trong browser | OAuth Google Cloud (rườm rà) |25| Công khai | ✅ Public/hẹn lịch bình thường | ⚠️ **Project chưa audit → video BỊ KHÓA private**, không public được |26| Trạng thái | **ĐƯỜNG CHÍNH đang dùng** | Để dành sau (khi đã audit / chấp nhận private) |2728→ **Mặc định đi browser.** Chỉ dùng API khi user đã setup OAuth + chấp nhận/đã qua giới hạn private.2930## Đường dẫn31- Code: `~/.claude/skills/youtube-upload/` (`SKILL.md`, `youtube_upload.py`)32- Venv (nếu dùng API): `~/DouyinReup/.dubvenv` (cần cài `google-api-python-client google-auth-oauthlib`)33- Config API (nếu dùng): `~/DouyinReup/yt_config.json`3435## QUY TRÌNH BROWSER (mặc định) — dùng Playwright MCP361. **XÁC ĐỊNH KÊNH:** user nói tên kênh → dùng. Không nói + có nhiều kênh → hỏi (AskUserQuestion) + gợi ý theo loại video (ăn uống → "Ăn Là Sập").372. **ĐĂNG NHẬP:** vào `studio.youtube.com`. Nếu bị đá ra trang chọn/đăng nhập Google → **KHÔNG tự nhập mật khẩu** (bảo mật). Nhờ user tự đăng nhập đúng tài khoản chứa kênh đó, rồi tiếp tục. Xác nhận đang ở đúng kênh (avatar/tên góc phải; đổi kênh qua "Chuyển tài khoản" nếu cần).383. **VIẾT METADATA** (mục dưới): lưu `title.txt` + `desc.txt` (dựa nội dung clip — clip vừa dub thì đã biết từ segs_vi).394. **UPLOAD:**40 - `Tạo (Create) ▸ Tải video lên (Upload videos)` → chọn file. ⚠️ **Browser MCP chỉ up được file trong `~/tony-programming`** → copy clip vào đó trước (`cp "<video>" ~/tony-programming/yt_upload.mov`), xong xoá sau.41 - Điền **Tiêu đề** + **Mô tả**.42 - **Đối tượng: "Không, đây KHÔNG phải nội dung dành cho trẻ em"** (Not made for kids) — BẮT BUỘC chọn.43 - "Hiện thêm (Show more)" → **Thẻ (Tags)**: dán list tag. (Hashtag để trong mô tả.)44 - Bấm tiếp qua các bước (Yếu tố video / Kiểm tra) → tới **Chế độ hiển thị (Visibility)**.45 - **Chế độ hiển thị:** Công khai (Public) / Không công khai (Unlisted) / Riêng tư (Private) / **Lên lịch (Schedule)**. ⚠️ Đây là bước ra ngoài → **HỎI user chọn** (mặc định gợi ý Public hoặc Schedule giờ VN) rồi mới **Xuất bản (Publish)** / **Lên lịch**.465. **Tự soi + báo user:** chụp màn hình xác nhận đăng/hẹn lịch OK; báo **link video + kênh + tiêu đề**.4748- **Shorts:** clip **dọc 9:16 ≤ 3 phút** → YouTube tự nhận là Short (up y hệt). Clip dài (vd 6 phút) = video thường. Muốn nhắm Short thì cắt highlight ngắn.4950## METADATA — BẠN tự quyết (tối ưu reup ăn uống VN)51- **Tiêu đề (< 100 ký tự, từ khóa ở 3 chữ đầu, gây tò mò + emoji):**52 VD: `Đớp SẬP nhà hàng omakase — ngỗng quay 1999 tệ 😳🔥 | Ăn Là Sập`53- **Mô tả:**54 - **2-3 dòng đầu = HOOK** (hiện ở tìm kiếm/trước "xem thêm"): kể cái đỉnh nhất, gợi tò mò.55 - Vài dòng mô tả món + giọng trend (đớp/phê/thánh đớp/xỉu ngang).56 - **CTA:** hỏi 1 câu kéo comment + "🔔 Đăng ký kênh ... để hóng tập mới mỗi ngày!"57 - **Link chéo:** `👉 Facebook: fb.com/AnLaSap.Official`58 - **3–5 hashtag** cuối mô tả: `#mukbang #anuong #ansap` (+ `#Shorts` nếu là Short).59- **Thẻ (Tags, 10–15):** `mukbang, ăn là sập, ăn uống, review đồ ăn, thử thách ăn, mukbang việt nam, ẩm thực, đồ ăn trung quốc, review nhà hàng, ...` (thêm tên món/địa danh trong clip).60- **KHÔNG bịa** giá/số liệu. Ngôn ngữ kênh = Tiếng Việt.6162## (TÙY CHỌN) Đường API — `youtube_upload.py`63Chỉ khi user đã setup OAuth. Đọc `~/DouyinReup/yt_config.json`:64```json65{"client_secret":"~/DouyinReup/yt_client_secret.json",66 "channels":{"Ăn Là Sập":{"token":"~/DouyinReup/yt_token_anlasap.json"}}}67```68- **SETUP (user tự làm):** console.cloud.google.com → tạo project → bật **YouTube Data API v3** → tạo **OAuth client (Desktop app)** → tải `client_secret.json` về `~/DouyinReup/`. Cài lib: `~/DouyinReup/.dubvenv/bin/pip install google-api-python-client google-auth-oauthlib`.69- Chạy: `PY=~/DouyinReup/.dubvenv/bin/python`70 `"$PY" ~/.claude/skills/youtube-upload/youtube_upload.py "<video>" --channel "Ăn Là Sập" --title-file title.txt --desc-file desc.txt --tags "a,b,c" --privacy public`71 - Hẹn giờ (giờ VN): `--publish-at "2026-07-15 19:00"` (tự đổi UTC; ép `--privacy private` theo yêu cầu API).72 - Lần đầu mở browser xin quyền → lưu token; lần sau tự refresh.73- ⚠️ **CẢNH BÁO private-lock:** project chưa qua audit của Google → **mọi video upload qua API bị khóa `private`**, đặt `public` cũng vô hiệu. Muốn public phải nộp audit (chờ Google duyệt). → Trước khi audit, **dùng browser** cho video công khai.7475## Thành thật (nói với user)76- Reup + dub khó kiếm tiền bền + rủi ro bản quyền/ToS — làm để TEST view.77- YouTube phạt cấp KÊNH → đừng để 20 video giống khuôn; nên thêm biến đổi (bình luận riêng, ghép clip, đổi format).78- Mật khẩu Google là của user — Claude KHÔNG nhập hộ.