YouTube Upload Preparation

VerifiedCaution

Prepares and validates all files for YouTube upload without actually uploading. Creates comprehensive checklist including language verification, video/audio files, and thumbnails.

Sby Skills Guide Bot
ContentIntermediate
3/11/2026
Claude Code
#youtube-upload#audiobook#validation#thumbnail#checklist

Recommended for

Automated summary

Prepares and validates every asset of a bilingual audiobook video (files, languages, wordcards, thumbnail) before a YouTube upload, without performing the upload itself.

Strengths

  • Checks languages by reading translations from the middle of the book, catching projects generated with the wrong target language.
  • Confirms wordcard_start and wordcard_duration exist in timeline.json and plays a mid-book wordcard so the user can listen.
  • Provides concrete shell commands for each check (video output, background, audio, timeline, SQLite database).
  • Looks up thumbnails per language pair and offers a fallback generation snippet plus a batch script.

Limitations

  • The file is truncated at Step 6: the youtube-metadata skill invocation and upload command construction are not described.
  • Tightly coupled to a specific setup: implicit SQLite schema, internal Python modules (video.thumbnail_variants, scripts/generate_thumbnails.py) and afplay for audio playback (macOS).
  • Covers preparation only; no upload, publishing or upload-error handling steps.
When to use it

Use it when you need a pre-flight checklist before publishing a bilingual audiobook video to YouTube.

When not to use it

Avoid it for other video types or projects lacking the expected projects/ layout and SQLite databases, or when you actually need to upload and publish.

Security analysis

Caution
Quality score80/100

The skill is a local validation/preparation workflow: it reads SQLite metadata, checks files exist, plays a wordcard sample, and optionally generates a thumbnail image with Pillow. All commands are local and non-destructive, and it explicitly forbids performing the actual upload. The main risks are operational rather than malicious — unquoted variable interpolation into shell commands, reliance on external scripts/skills not included in the package, and a ready-to-run upload command with public privacy and a confirmation-skip flag that a user might execute unknowingly.

Findings
  • •Uses Bash for local inspection (ls, sqlite3 SELECT, grep, head) and executes an inline python3 -c thumbnail generator (PIL): powerful but read-only/local in intent.
  • •Project names and book metadata are interpolated directly into shell command templates (e.g. `ls projects/{project_name}/`, `sqlite3 projects/{project_name}/project.db`) without quoting; a project name containing spaces or shell metacharacters could break out of the intended command.
  • •Runs `afplay` on local audio files as a verification step — a side-effecting (audio playback) command, macOS-only, not destructive.
  • •Depends on artifacts not shipped in this skill (Skill 'youtube-metadata', scripts/youtube_upload.py, video.thumbnail_variants, sqlite DB schema); behavior depends on external code the reviewer cannot inspect here.
  • •Constructs a YouTube upload command with `--privacy public` and a `-y` skip-confirmation flag in the documented flag list; the skill explicitly says not to execute it, but a user copying the command line could publish publicly and bypass confirmation.
  • •No destructive commands, no credential/secret handling, no network exfiltration, no obfuscation or encoded payloads, and no instruction-injection attempts found in the content.
  • •Uses Bash, sqlite3, python3, and a local audio player (afplay) to inspect project files, query databases, and generate thumbnails — powerful but legitimate for a local prep workflow.
  • •Includes an upload command (scripts/youtube_upload.py ... --privacy public) intended for the user to copy and run manually; the skill explicitly instructs not to execute it, but the command would publish publicly if run.
  • •Runs inline python3 that imports project-local modules (video.thumbnail_variants) — execution depends on whatever code is in the repo.
  • •Delegates part of the workflow to another skill (youtube-metadata) whose behavior is not evaluated here.
How this analysis is made

Examples

Prepare a project upload
Prepare the YouTube upload for the project 'atomic_habits' — validate the languages, files and wordcards, and give me the full checklist.
Check before upload
Check before upload: verify the thumbnail exists for ru_en and that the wordcard audio plays in the middle of the book.
Validate languages only
Validate for YouTube: read a few translations from the middle of the book so I can confirm the target language is correct.

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.

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/youtube-upload-preparation-mmlj2nyp/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/youtube-upload-preparation-mmlj2nyp' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/youtube-upload-preparation-mmlj2nyp/download' --output '.skill-downloads/youtube-upload-preparation-mmlj2nyp/SKILL.md.part' && mv '.skill-downloads/youtube-upload-preparation-mmlj2nyp/SKILL.md.part' '.skill-downloads/youtube-upload-preparation-mmlj2nyp/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

Tools declared by the author (check availability in your agent): Read, Bash, Glob, Skill

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/youtube-upload-preparation-mmlj2nyp/SKILL.md' && test -s '.skill-downloads/youtube-upload-preparation-mmlj2nyp/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/upload-prepare' && cp -R '.skill-downloads/youtube-upload-preparation-mmlj2nyp' '.claude/skills/upload-prepare'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/youtube-upload-preparation-mmlj2nyp'

openskills read 'youtube-upload-preparation-mmlj2nyp'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/youtube-upload-preparation-mmlj2nyp/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills