From social-media-creator
Create a lesson series from a YouTube video, PDF, or article
How this command is triggered — by the user, by Claude, or both
Slash command
/social-media-creator:create-lesson-from-source <youtube-url | pdf-path | article-url> [number-of-lessons] [duration-per-lesson]Files this command reads when invoked
This command is limited to the following tools:
The summary Claude sees in its command listing — used to decide when to auto-load this command
Create a series of lesson videos based on content from: $ARGUMENTS
This command extracts content from an external source and breaks it into a multi-part lesson series — connected videos that teach the topic step by step.
## Step 0: Extract Content from Source (with Caching)
1. Read the **extract-content** skill carefully — it contains the ONLY working method for YouTube transcripts AND the source caching system
2. **Check source cache first**:
- Determine the cache key (e.g., `yt-{VIDEO_ID}`, `article-{slug}`, `pdf-{slug}`)
- Check if `outputs/_sources/{cache-key}/` exists
- **I...Create a series of lesson videos based on content from: $ARGUMENTS
This command extracts content from an external source and breaks it into a multi-part lesson series — connected videos that teach the topic step by step.
yt-{VIDEO_ID}, article-{slug}, pdf-{slug})outputs/_sources/{cache-key}/ existstranscript.txt/raw-content.txt and content-brief.md from cache — skip extraction entirelyoutputs/_sources/{cache-key}/https://youtubetotranscript.com/transcript?v={VIDEO_ID}, extract text from #transcript element via javascript_tool (chunk in 12K pieces for large transcripts). Do NOT try to extract transcript directly from youtube.com — it will fail.mkdir -p outputs/_sources/{cache-key}/transcript.txt (YouTube) or raw-content.txt (article/PDF)content-brief.md and metadata.json| Source Length | Recommended Lessons | Notes |
|---|---|---|
| Short article / 5-10min video | 3 lessons | Focus on depth, not breadth |
| Medium article / 10-30min video | 4-5 lessons | Natural chapter breaks |
| Long PDF / 30min+ video | 5-8 lessons | Group related topics |
| Book / course material | 8-12 lessons | One lesson per chapter/module |
# Series: {Series Title}
## Source: {source type} — {source title/URL}
## Lessons: {count}
## Duration per lesson: {duration}s
---
### Lesson 1: {Title}
- **Source section**: [which part of the source this covers]
- **Key points**: [point 1], [point 2], [point 3]
- **Hook**: "[opening line]"
- **Connects to next**: "[teaser for lesson 2]"
### Lesson 2: {Title}
- **Source section**: [which part of the source this covers]
- **Key points**: [point 1], [point 2], [point 3]
- **Recap from previous**: "[brief callback]"
- **Connects to next**: "[teaser for lesson 3]"
[... etc]
### Lesson {N}: {Title} (Finale)
- **Source section**: [final section / summary]
- **Key points**: [key takeaway 1], [key takeaway 2]
- **Series recap**: "[what we learned]"
- **CTA**: "[call to action]"
hormozi-offers-lekce, seo-zaklady-serie)mkdir -p outputs/{series-slug}/outputs/{series-slug}/lesson-01-{lesson-slug}/Define consistent visual identity BEFORE creating individual lessons:
.lesson-badge {
position: fixed;
top: 3vh;
right: 4vw;
background: linear-gradient(135deg, rgba(255,255,255,0.15), rgba(255,255,255,0.05));
border: 1px solid rgba(255,255,255,0.2);
border-radius: 12px;
padding: 0.8vh 2vw;
font-size: clamp(0.9rem, 2.2vh, 2.5rem);
font-weight: 700;
color: rgba(255,255,255,0.9);
z-index: 100;
}
For EACH lesson, follow the full video pipeline:
clamp(1.2rem, 3.2vh, 3.5rem)+)node validate-video.mjs outputs/{series-slug}/lesson-{NN}-{slug}/lesson-{NN}-video.html {duration} 1080 1920
TTS output duration is unpredictable — you MUST verify and adjust.
ffprobe -v error -show_entries format=duration -of csv=p=0 voiceover.mp3
ceil(voiceover_duration) + 2animation-delay and sceneVis durations by new_duration / old_durationffmpeg -y -i voiceover.mp3 -i bg_music.mp3 \
-filter_complex "[0:a]volume=1.0[vo];[1:a]volume=0.015[bg];[vo][bg]amix=inputs=2:duration=first:dropout_transition=3:normalize=0[out]" \
-map "[out]" -c:a aac -b:a 192k mixed_audio.m4a
Voiceover at 100%, bg at 1.5%, normalize=0 mandatory.
ffmpeg -y -i video.mp4 -i mixed_audio.m4a \
-c:v copy -c:a aac -b:a 192k -shortest \
-map 0:v:0 -map 1:a:0 {slug}-final.mp4
node validate-video.mjs outputs/{series-slug}/lesson-{NN}-{slug}/lesson-{NN}-video.html {duration} 1080 1920 outputs/{series-slug}/lesson-{NN}-{slug}/lesson-{NN}-voiceover.mp3 outputs/{series-slug}/lesson-{NN}-{slug}/lesson-{NN}-final.mp4
Every lesson MUST have a thumbnail — without it, videos appear as blank/black in platform grids.
thumbnail.png (1080×1920 PNG) in the lesson folderconst page = await browser.newPage();
await page.setViewport({ width: 1080, height: 1920 });
await page.goto(`file://${htmlPath}`, { waitUntil: "networkidle0" });
await new Promise(r => setTimeout(r, 3000)); // Wait for hook animations
await page.screenshot({ path: "thumbnail.png", type: "png" });
thumbnail field)npx claudepluginhub michalvarys/claude-plugins --plugin social-media-creator