# Viral-Videos

> Spot Viral Clips

- Skill: `michalporat972/viral-videos` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add michalporat972/viral-videos`
- Raw SKILL.md: https://api.skillmd.com/api/skills/michalporat972/viral-videos/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: michalporat972 (https://skillmd.com/u/michalporat972)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/michalporat972/viral-videos

---

# Spot Viral Clips

A Claude Code skill for social media managers and podcast producers. Feed it any video with captions and get a ranked list of viral-ready clip segments with timestamps, hook types, and ready-to-post captions.

## Trigger Phrases

Use this skill when the user says any of the following:
- "go through this video and flag the best parts"
- "find the viral moments"
- "what should I cut from this episode"
- "spot the clips"
- "find the reels"
- "which parts should I post"

---

## PART 1 — TRANSCRIPT EXTRACTION

Different platforms expose transcripts differently. Detect which platform the user is working with and use the appropriate method.

### YouTube

YouTube's transcript panel is fully rendered — not virtualized. Steps:
1. Click the `...` menu on the video
2. Select "Show transcript"
3. The panel renders all text — use `get_page_text()` or have the user paste it directly

### Vimeo (virtualized panel — requires JS extraction)

Vimeo's transcript panel is a virtualized React list. The raw data is in the player config. Use this approach in the browser console:

```js
// STEP 1: Fetch the Vimeo player config page (replace VIDEO_ID and HASH)
fetch('https://player.vimeo.com/video/VIDEO_ID?h=HASH', {credentials: 'include'})
  .then(r => r.text())
  .then(t => {
    // STEP 2: Extract the .vtt caption URL from the player HTML
    const match = t.match(/"(https:[^"]*\.vtt[^"]*)"/);
    const vttUrl = match ? match[1].replace(/\\u0026/g, '&') : null;
    console.log('VTT URL:', vttUrl);
    return fetch(vttUrl);
  })
  .then(r => r.text())
  .then(vtt => {
    window._vttData = vtt;
    console.log('Got', vtt.length, 'chars of transcript');
  });
```

### Other Platforms (Brightcove, Wistia, custom players)

Open DevTools → Network tab → filter by "vtt" or "srt". Almost all modern video players load a WebVTT file for captions. Download and paste the file contents.

---

## PART 2 — VTT PARSING

Once you have the raw VTT data, use this parser to consolidate fragmented cues into readable passages:

```js
function parseVTT(vttText) {
  const lines = vttText.split('\n');
  let segments = [];
  let currentStart = '', currentText = '';

  for (let line of lines) {
    line = line.trim();
    if (line.includes(' --> ')) {
      currentStart = line.split(' --> ')[0].trim();
      currentText = '';
    } else if (line && !line.match(/^\d+$/) && line !== 'WEBVTT') {
      currentText += (currentText ? ' ' : '') + line;
    } else if (line === '' && currentText && currentStart) {
      segments.push({ start: currentStart, text: currentText });
      currentText = ''; currentStart = '';
    }
  }

  // Merge segments within 4 seconds of each other into passages
  let passages = [];
  let current = { ...segments[0] };
  const toSec = t => t.split(':').reduce((acc, v) => acc * 60 + parseFloat(v), 0);

  for (let i = 1; i < segments.length; i++) {
    if (toSec(segments[i].start) - toSec(segments[i-1].start) < 4) {
      current.text += ' ' + segments[i].text;
    } else {
      passages.push(current);
      current = { ...segments[i] };
    }
  }
  passages.push(current);
  return passages;
}

window._passages = parseVTT(window._vttData);
console.log(window._passages.length, 'passages ready');
```

---

## PART 3 — EDITORIAL ANALYSIS FRAMEWORK

Apply this **5-lens filter** to every passage. Think like a journalist and social media manager simultaneously.

### The 5 Viral Lenses

**Lens 1: The Gut-Punch Personal Story**
Look for: a speaker's own child, family member, or personal moment that catches them off guard. These feel raw and unscripted even when they're not.
Signal words: "my son," "my daughter," "I was so shocked," "I had no idea," "I immediately thought," "my own [relationship]"

**Lens 2: The One-Liner That Reframes Everything**
Look for: a sentence that inverts expectations or makes a familiar thing strange. Usually appears after a long build-up.
Signal: short sentences after long stretches, rhetorical contrasts ("not X, but Y"), surprising word choices, quotable standalone phrases

**Lens 3: The Uncomfortable Truth No One Says Out Loud**
Look for: something true that is rarely stated plainly — especially from credentialed voices who "shouldn't" be saying it this bluntly.
Signal: "coward," "ignorant," "nobody wants to talk about," "let's be honest," "I'll say what no one will say"

**Lens 4: The Breaking / Urgent Moment**
Look for: real-time information, current events, a speaker describing something happening RIGHT NOW.
Signal: "right now," "as we speak," "day 16," "this week," present-tense crisis descriptions, live-situation language

**Lens 5: The Hopeful Reversal**
Look for: a dark topic that ends with an unexpected ray of hope — especially involving children or the next generation.
Signal: "but then," "and yet," "I have hope," "I believe," stories of young people doing the right thing

---

## PART 4 — CLIP ARCHITECTURE

Every recommended clip should map to this structure. Check that the flagged segment has each layer:

```
[HOOK      0–3s]   → Say something that makes the viewer stop scrolling
[TENSION  3–30s]   → Build the story / argument / emotion  
[PAYOFF  last 5s]  → The punchline, quote, or revelation
[CTA   optional]   → Natural, not forced
```

**Ideal reel length by platform:**
- Instagram Reels / TikTok: 30–60 seconds sweet spot
- YouTube Shorts: up to 60 seconds
- LinkedIn video: 45–90 seconds (longer context performs better)

---

## PART 5 — OUTPUT FORMAT

Deliver results as a numbered clip brief. For each clip:

```
## Clip [N] — [LENS NAME]
**Timestamp:** [start] → [end]
**Duration:** ~[X] seconds
**Hook:** [one sentence that opens the clip]
**Why it works:** [one sentence explaining the viral mechanism]
**Suggested caption:** [ready-to-post caption using the template below]
**Platform fit:** [Instagram / TikTok / LinkedIn / YouTube Shorts]
```

### Caption Templates by Lens

| Lens | Template |
|---|---|
| Personal Story | *"A [credential]. And her own [relationship] left her speechless."* |
| One-Liner | *"[Quote verbatim]. That's it. That's the post."* |
| Uncomfortable Truth | *"[Name] on why [common thing] is actually [reframe]."* |
| Breaking/Urgent | *"She's [dramatic action]. Right now. And she's still talking."* |
| Hopeful Reversal | *"After everything — here's why [Name] still has hope."* |

---

## PART 6 — QUICK-START PROMPT

When a user brings a new video without specifying format, respond with this approach:

> I'll go through the transcript like a journalist/social media manager and flag the moments worth cutting. I'll look for: raw personal stories, one-liners that reframe things, uncomfortable truths said plainly, urgent real-time moments, and hopeful reversals.
> 
> Just share the transcript (or let me extract it) and I'll return a ranked clip guide with timestamps, hook types, and suggested captions.

