| name | upload-prepare |
| description | Prepare YouTube upload for bilingual audiobook video. Runs youtube-metadata skill, builds upload command, validates all files, checks languages by reading translations from middle of book, verifies wordcards play, shows thumbnail/background/output. Does NOT upload - only preparation and checklist. Use when user wants to prepare upload, check before upload, or validate video for YouTube. |
| allowed-tools | Read, Bash, Glob, Skill |
Upload Prepare - YouTube Upload Preparation & Validation
Overview
Prepare and validate everything for YouTube upload without actually uploading. Creates comprehensive checklist for user verification.
Activation Triggers
- "prepare upload"
- "check before upload"
- "validate for youtube"
- "upload checklist"
- "готовь к загрузке"
- "проверь перед аплоадом"
Workflow
Step 1: Identify Project
- Get project name from user or detect from context
- Verify project exists in
projects/directory - Load project metadata from SQLite database
# Check project exists
ls projects/{project_name}/
# Get meta from DB
sqlite3 projects/{project_name}/project.db "SELECT key, value FROM meta;"
Step 2: Validate Languages
- Read source and target language from project meta
- Read 2-3 translations from MIDDLE of the book (not beginning!)
- Display translations for user to verify correct language
# Get total sentences
sqlite3 projects/{project_name}/project.db "SELECT value FROM meta WHERE key='total_sentences';"
# Read translations from middle (e.g., sentences 100-102)
sqlite3 projects/{project_name}/project.db "SELECT sentence_idx, text FROM sentences WHERE lang='{target_lang}' LIMIT 3 OFFSET 100;"
Step 3: Validate Files
Check all required files exist:
# Video output
ls -lh projects/{project_name}/video/output.mp4
# Background image
ls -la projects/{project_name}/video/background.*
# Timeline with wordcards
head -30 projects/{project_name}/audio/timeline.json | grep -E "(wordcard_start|wordcard_duration)"
# Wordcard audio files
ls projects/{project_name}/audio/wordcards/ | head -5
Step 4: Verify Wordcards
- Check timeline.json contains wordcard_start and wordcard_duration fields
- Play one wordcard audio from middle of book for verification
# Check timeline has wordcard data
grep -c "wordcard_start" projects/{project_name}/audio/timeline.json
# Play wordcard from middle (user listens)
afplay projects/{project_name}/audio/wordcards/0000100_combined.mp3
Step 5: Find Thumbnail
- Determine language pair from project (e.g., ru_en, ru_es-latam)
- Check
thumbnails/{lang_pair}/directory for matching thumbnail - If not found, generate using thumbnail generator
# Find thumbnail in language-specific folder
# Structure: thumbnails/ru_en/, thumbnails/ru_es-latam/
ls -la thumbnails/{source}_{target}/ | grep -i {project_base_name}
If thumbnail NOT found, generate it:
# Quick one-liner to generate single thumbnail
python3 -c "
from pathlib import Path
from video.thumbnail_variants import prepare_background, variant_13, load_fonts
from PIL import ImageDraw
fonts = load_fonts()
img = prepare_background(Path('txt_source/{book_name}.png'))
draw = ImageDraw.Draw(img)
# For RU→EN use tgt_lang='ENGLISH'
# For RU→ES-LATAM use tgt_lang='LATAM SPANISH'
img = variant_13(img, draw, fonts,
author_en='{Author English}',
title_en='{Title English}',
src_lang='RUSSIAN',
tgt_lang='ENGLISH', # or 'LATAM SPANISH'
title_ru='{Название}',
author_ru='{Автор}'
)
img = img.convert('RGB')
img.save('thumbnails/ru_en/{book_name}.png', quality=95)
"
Batch generation (all books):
# Generate all thumbnails for specific language pair
python3 scripts/generate_thumbnails.py thumbnails/ru_es-latam # default LATAM SPANISH
To add target language option to batch script, edit generate_thumbnails.py.
Step 6: Generate Metadata
Invoke youtube-metadata skill to generate title, description, tags:
Skill(skill: "youtube-metadata")
Follow youtube-metadata workflow to generate proper metadata.
Step 7: Build Upload Command
Construct the upload command (do NOT execute):
python3 scripts/youtube_upload.py upload {project_name} {thumbnail_path} --playlist "{playlist_name}"
Playlist selection:
- RU → EN:
--playlist "RU - EN" - RU → ES-LATAM:
--playlist "RU - ES (LATAM)" - Other: ask user
Step 8: Display Checklist
Output comprehensive checklist for user:
============================================================
UPLOAD PREPARATION CHECKLIST
============================================================
PROJECT: {project_name}
LANGUAGES: {SOURCE} → {TARGET}
------------------------------------------------------------
FILES (clickable paths)
------------------------------------------------------------
[✓/✗] Video: file://{full_video_path} ({size})
[✓/✗] Background: file://{full_background_path}
[✓/✗] Thumbnail: file://{full_thumbnail_path}
[✓/✗] Timeline: {has wordcard data}
[✓/✗] Wordcards: {count} files
------------------------------------------------------------
LANGUAGE VERIFICATION (from middle of book)
------------------------------------------------------------
Sentence 100: "{source_text}"
Translation: "{target_text}"
Sentence 101: "{source_text}"
Translation: "{target_text}"
>>> Verify translations are in {target_lang}! <<<
------------------------------------------------------------
WORDCARD AUDIO
------------------------------------------------------------
[✓/✗] Timeline has wordcard timing
[✓/✗] Wordcard files exist
[PLAYED] Wordcard sample from sentence 100
------------------------------------------------------------
METADATA (use youtube-metadata skill format!)
------------------------------------------------------------
Title: [Bilingual][{SOURCE}→{TARGET}] {Author} - {Title}
Description:
🎧 AI-generated bilingual audio for passive language learning.
Each sentence: first {source_language}, then {target_language}.
⚠️ Neural TTS - minor errors possible. Premium voices coming soon.
📩 Want other languages or texts? Drop a comment!
#{hashtag1} #Bilingual #LanguageLearning #{hashtag2}
Tags: (from youtube-metadata skill, NO # symbols)
Playlist: {playlist}
------------------------------------------------------------
UPLOAD COMMAND (copy & run when ready)
------------------------------------------------------------
python3 scripts/youtube_upload.py upload {project_name} {thumbnail_path} \
--title "[Bilingual][{SOURCE}→{TARGET}] {Author} - {Title}" \
--playlist "{playlist}" \
--privacy public
============================================================
Upload command flags:
--title— REQUIRED! Title in youtube-metadata format--thumbnail— path to thumbnail image (positional arg)--playlist— playlist name (RU - EN, RU - ES (LATAM), etc.)--privacy— private/unlisted/public (use public for immediate publish)--schedule— optional: "tomorrow", "tomorrow 14:00", "18:00", "+2h", or ISO datetime--dry-run— preview without uploading-y— skip confirmation
Optimal premiere times for language learning content:
- Best days: Wednesday, Thursday, Friday
- Best time: 10:00-14:00 (target audience timezone)
- For RU→EN: 14:00 MSK (11:00 UTC) — catches both Russian and European learners
- For RU→ES LATAM: 18:00 MSK (15:00 UTC, 12:00 Argentina) — catches LATAM afternoon
CRITICAL: Metadata MUST follow youtube-metadata skill format exactly:
- Title:
[Bilingual][{SOURCE}→{TARGET}] {Author} - {Title} - Author and Title MUST be in ENGLISH
- Description: standard template from youtube-metadata skill
- Tags: from youtube-metadata skill (NO hashtag symbols)
Quality Checklist
Before showing final checklist, verify:
- Video file exists and size > 10MB
- Background image exists
- Thumbnail exists
- Timeline contains wordcard_start fields (if wordcards enabled)
- Wordcard audio files exist (if wordcards enabled)
- Translations are in correct target language
- Metadata generated via youtube-metadata skill
- Upload command is valid
Anti-Patterns to Avoid
- Don't execute the upload command
- Don't skip language verification
- Don't use translations from beginning (use middle of book)
- Don't skip wordcard audio playback
- Don't generate metadata manually (use youtube-metadata skill)
Example Execution
User: prepare upload nabokov_uzhas_ru_en
Claude:
Starting upload preparation for nabokov_uzhas_ru_en...
[Validates project exists]
[Reads meta: ru → en, 209 sentences]
[Reads translations from middle - sentences 100-102]
[Checks video: 192MB ✓] → file:///Users/.../video/output.mp4
[Checks background ✓] → file:///Users/.../video/background.png
[Checks thumbnail ✓] → file:///Users/.../thumbnails/ru_en/nabokov_uzhas.png
[Checks timeline: has wordcard_start ✓]
[Plays wordcard audio from sentence 100]
[Invokes youtube-metadata skill]
[Builds upload command]
============================================================
UPLOAD PREPARATION CHECKLIST
============================================================
[Full checklist output...]
============================================================
All checks passed! Review the checklist and run the upload command when ready.
Summary
This skill prepares everything for YouTube upload:
- Validates all files exist
- Verifies languages by checking translations from middle of book
- Confirms wordcards are included
- Generates metadata via youtube-metadata skill
- Builds upload command
- Displays comprehensive checklist
User makes final decision to upload.