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.