Claude Code Plugins

Community-maintained marketplace

Feedback

upload-prepare

@smoreg/biLangGen
0
0

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.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

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

  1. Get project name from user or detect from context
  2. Verify project exists in projects/ directory
  3. 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

  1. Read source and target language from project meta
  2. Read 2-3 translations from MIDDLE of the book (not beginning!)
  3. 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

  1. Check timeline.json contains wordcard_start and wordcard_duration fields
  2. 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

  1. Determine language pair from project (e.g., ru_en, ru_es-latam)
  2. Check thumbnails/{lang_pair}/ directory for matching thumbnail
  3. 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:

  1. Validates all files exist
  2. Verifies languages by checking translations from middle of book
  3. Confirms wordcards are included
  4. Generates metadata via youtube-metadata skill
  5. Builds upload command
  6. Displays comprehensive checklist

User makes final decision to upload.