mcpField
B
boring-youtube-mining

boring-youtube-mining

github.com/mrpaulscrivensマーケティング・グロース1339 回インストール33 週間前に更新
リポジトリ

boring-youtube-mining について

指定したYouTubeチャンネルの新しい動画を調査するコンテンツリサーチスキルです。字幕を取得・キャッシュし、動画への応答や内容の不足から具体的な企画案を作成します。

主な機能

  1. 01yt-dlpでチャンネルの新着動画を取得
  2. 02英語字幕のダウンロードとキャッシュ
  3. 03応答型と不足補完型の企画案を生成
  4. 04利用可能な場合はWorld Codeに対応付け
  5. 05日付付きの企画ファイルを保存

活用シーン

  1. 01指定チャンネルから投稿や動画のテーマを探す
  2. 02動画に対する独自の切り口を考える
  3. 03動画で未回答の視聴者の疑問を見つける

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mrpaulscrivens/boring-zoo --skill boring-youtube-mining

インストール後、Claude Code で/boring-youtube-miningを入力して読み込まれたか確認します。

詳細

YouTube Mining — World Code Edition

あらかじめ選定された YouTube チャンネルから最近の動画を取得し、トランスクリプトをダウンロードして、ユーザーが実際に活用できるコンテンツのアイデアを生成します。一度の処理で完了します。やり取りの往復はありません。

開始前 — 依存関係を確認する

次のコマンドをサイレントに実行します。

which yt-dlp

**yt-dlp がインストールされていない場合は、**処理を中止してユーザーに伝えます。

yt-dlp が必要ですが、インストールされていません。

ご利用のプラットフォームにインストールしてください。

  • macOS: brew install yt-dlp
  • Windows: winget install yt-dlp
  • Linux: pip install yt-dlp またはパッケージマネージャー
  • 共通: pip install yt-dlp

その後、もう一度 /boring-youtube-mining を実行してください。

yt-dlp がない状態では先に進まないでください。適切に処理を終了します。


開始前 — World Code を読み込む(任意)

次のファイルをサイレントに読み込んでみてください。

  • world-code/voice.md — 文体のルール(この出力には適用しません。これはリサーチであり、公開コンテンツではありません)
  • world-code/conversation.md — ブリッジ構造(壁、苦労、ゴブリン、宝物)

conversation.md が存在する場合: ブリッジを使ってアイデアを絞り込み、優先順位を付けます。すべてのアイデアを壁、苦労、またはゴブリンに対応付けます。どれにもつながらないアイデアは優先度を下げます(リストには残しますが、「ブリッジとのつながりなし」と明記します)。

conversation.md が存在しない場合: トランスクリプトの分析だけに基づいてアイデアを生成します。ファイルがないことをしつこく指摘しないでください。


ステップ 1:チャンネルリストを読み込む

settings/youtube-channels.md を読み込みます。

**ファイルが存在しない場合は、**サンプルの内容を入れて作成し、ユーザーに伝えます。

settings/youtube-channels.md にサンプルのチャンネルをいくつか入れて作成しました。Obsidian で編集して取得したいチャンネルを追加し、その後もう一度 /boring-youtube-mining を実行してください。

settings/youtube-channels.md のスターターコンテンツ:

# YouTube Channels

Add channels you want to mine for content ideas. Use the @ handle format.
Add a short description so Claude knows the context.

- @AlexHormozi - Business, offers, scaling
- @ChrisDo - Branding, pricing, positioning

ファイルの作成後に停止します。まずユーザーに設定してもらいます。


ステップ 2:最近の動画を取得する

リスト内の各チャンネルに対して、次を実行します。

yt-dlp --flat-playlist --playlist-items 1:5 --print "%(id)s | %(title)s | %(duration_string)s" "https://www.youtube.com/@{handle}/videos" 2>/dev/null

レート制限を避けるため、チャンネルは並列ではなく順番に処理します。

結果は番号付きリストで表示します。

## Recent Videos

### @AlexHormozi
1. [dQw4w9WgXcQ] How to Price Your Offer (12:34)
2. [abc123def] The $100M Framework Nobody Uses (18:22)
...

### @ChrisDo
3. [xyz789ghi] Why Your Brand Is Invisible (9:45)
...

ユーザーに尋ねます。

どの動画を分析しますか?番号(例:「1, 3, 5」)または「all」を入力してください。

**チャンネルハンドルの解決に失敗した場合は、**その旨を報告し、残りのチャンネルの処理を続けます。

@BadHandle から動画を取得できませんでした — settings/youtube-channels.md のハンドルを確認してください。


ステップ 3:トランスクリプトをダウンロードする

選択された動画ごとに、まずキャッシュ済みのトランスクリプトがあるか確認します。

ls "content/youtube-transcripts/{video_id}.md" 2>/dev/null

キャッシュ済みの場合: ダウンロードをスキップして、キャッシュから読み込みます。ユーザーに伝えます。

"{title}" のトランスクリプトはすでにキャッシュされています — ダウンロードをスキップします。

キャッシュされていない場合: 自動生成された英語字幕をダウンロードします。

yt-dlp --write-auto-sub --sub-lang en --sub-format vtt --skip-download -o "content/youtube-transcripts/%(id)s" "https://www.youtube.com/watch?v={video_id}" 2>/dev/null

その後、VTT ファイルを整形して Markdown として保存します。必要に応じてディレクトリを作成します。

mkdir -p "content/youtube-transcripts"
VTT 字幕の整形

生の VTT ファイルにはタイムスタンプと重複した行が含まれています。次のように整形します。

  1. すべてのタイムスタンプ行を削除します(XX:XX:XX.XXX --> XX:XX:XX.XXX に一致する行)
  2. WEBVTT ヘッダーと Kind:/Language: メタデータ行を削除します
  3. 連続する重複行を削除します(VTT ではキューの境界をまたいで行が繰り返されます)
  4. <c>、</c>、align:start position:0% などの位置/配置タグを削除します
  5. 段落にまとめます(文をグループ化し、自然な間で改行を入れます)

次のフロントマターを付けて content/youtube-transcripts/{video_id}.md として保存します。

---
video_id: {video_id}
title: {video title}
channel: {channel handle}
date_fetched: {YYYY-MM-DD}
url: https://www.youtube.com/watch?v={video_id}
---

# {video title}

**Channel:** {channel handle}
**URL:** https://www.youtube.com/watch?v={video_id}

## Transcript

{cleaned transcript text}

変換後、生の VTT ファイルを削除します。

エッジケース
  • 英語の自動字幕がない場合: 次のメッセージを表示して動画をスキップします。

    "{title}" に英語字幕がありません — スキップします。

  • 非常に長いトランスクリプト(推定 10,000 語以上)の場合: アイデア生成の前に、分割して要約します。約 3,000 語ごとのセクションに分け、各セクションの要点を要約してから、その要約を使ってアイデアを生成します。出力ではトランスクリプトを要約したことを明記します。


ステップ 4:アイデアを生成する

各トランスクリプトについて、次の 2 つの視点からアイデアを生成します。

レンズ 1:直接的な反応

この動画のアイデアに、ユーザーはどのように反応するでしょうか?アイデアを2~3個生成します。

  • 賛同して広げる — ユーザーも信じている主張がありました。その主張に、ユーザーならではの視点をどう加えますか?
  • 反対して反論する — 動画の発言に、ユーザーは異なる見解を持っています。ユーザーの意見は何ですか?
  • 発展させる — 動画で触れられたものの、深掘りされなかったテーマがあります。そのテーマをどのように展開しますか?
レンズ 2:不足しているアイデア

何が足りないでしょうか?アイデアを1~2個生成します。

  • 動画で取り上げられたものの、深掘りされなかったトピック
  • 視聴者が関心を持ちそうなのに、取り上げられなかった関連トピック
  • 動画で提起されたものの、答えられていない疑問
各アイデアに含める項目:
フィールド説明
アイデアのタイトル鋭く具体的に。「価格設定についての考察」ではなく、「時間単位の料金設定が個人事業を潰す理由」
切り口直接的な反応(賛同/反対/発展)または不足
出典動画のタイトル+特定できる場合はタイムスタンプの範囲
あなたの見解(1~2文)主張の核心
ブリッジとの対応関連する壁/悩み/ゴブリン(conversation.md が存在する場合)
コンテンツの種類投稿、スレッド、メール、エッセイ、動画スクリプト、カルーセル
下書きのフックスクロールの手を止める、冒頭の一文
量より質
  • 動画1本につき、アイデアは3~5個。 10個でも20個でもありません。最良の3~5個です。
  • すべてのアイデアについて、「自分なら本当にこれを作るか?」という基準を満たす必要があります。
  • アイデアがありきたりなら(「コンテンツは重要です」など)、ボツにします。
  • 明確な切り口のないものはアイデアではなく、単なるトピックです。トピックは役に立ちません。
ブリッジ優先の選別(conversation.md が存在する場合)

すべてのアイデアを生成したあと、次のように並べ替えます。

  1. ブリッジとの強いつながり — 壁、悩み、またはゴブリンに直接結びつく
  2. ブリッジとのゆるいつながり — ユーザーの世界に関連するが、直接は結びつかない
  3. ブリッジとのつながりなし — 興味深いものの、ユーザーの World Code とは無関係

3つ目のグループも一覧に含めますが、フラグを付けます。追求する価値があるかどうかは、ユーザーが判断します。


ステップ 5:出力を保存する

出力ファイルを content-ideas/youtube-mining-{YYYY-MM-DD}.md に書き込みます。

---
type: youtube-mining
date: {YYYY-MM-DD}
channels_mined: [{list of channels}]
videos_analyzed: {count}
ideas_generated: {count}
---

# YouTube Mining — {YYYY-MM-DD}

## Sources

| Video | Channel | Ideas |
|-------|---------|-------|
| {title} | {channel} | {count} |
...

## Ideas

### From: "{video title}" (@channel)

#### 1. {Idea Title}

- **Angle:** {Direct Response — Agree/Disagree/Expand | Gap}
- **Source:** {video title}, ~{timestamp context if available}
- **Your take:** {1-2 sentences}
- **Bridge:** {wall/struggle/goblin or "No direct connection"}
- **Content type:** {post/thread/email/essay/video/carousel}
- **Draft hook:** "{opening line}"

---

{repeat for each idea}

## Bridge Summary

### Strong Connections
- {idea} → {wall/struggle}
...

### No Connection
- {idea} — interesting but not tied to your current World Code
...

## Next Steps

- Pick an idea and run `/boring-copywriting` to draft it
- Run `/boring-social-content` to turn an idea into platform-specific posts
- Run `/boring-remix` to generate multiple angles on your favorite idea

ステップ 6:完了を伝える

保存したあと、ユーザーに次のように伝えます。

{X}個のアイデアを content-ideas/youtube-mining-{date}.md に保存しました。

ブリッジとの強いつながりがあるアイデアは{count}個、つながりのないアイデアは{count}個です。

アイデアを選べば、/boring-copywriting で下書きを作成したり、/boring-social-content でソーシャル投稿にしたり、/boring-remix でリミックスしたりできます。

これだけです。作業の振り返りも、コンテンツ戦略の講義も不要です。


重要な原則

  • 一度で最後まで完了させる。 取得 → 文字起こし → アイデア → 保存。「続けてもよいですか?」と確認して止まらない。
  • 調査結果であり、公開用コンテンツではない。 声色は適用しません。推敲もしません。戦略的なアイデアをそのまま出します。
  • キャッシュは必須です。 文字起こしを再ダウンロードしてはいけません。必ず、まずキャッシュを確認します。
  • 利用可能な場合はブリッジを優先する。 World Code とのつながりこそが、単に興味深いだけでなく、これを役立つものにします。
  • チャンネルは順番に処理する。 YouTube に並列リクエストを大量に送らないでください。
  • 動画1本につき、質の高いアイデアを3~5個。 大切なのは絞り込むことです。平凡なアイデアを50個生成するのは誰にでもできます。
  • 下書きのフックは重要です。 フックのないアイデアは、単なるトピックです。トピックに価値はありません。
  • 作業の手順を説明しない。 「今、文字起こしをダウンロードしています」のような実況はユーザーに不要です。実行して結果を見せてください。

関連スキル

  • boring-copywriting — 抽出したアイデアからコンテンツ全体の下書きを作成する
  • boring-social-content — アイデアをプラットフォーム別の投稿に変換する
  • boring-remix — 1つのアイデアから複数の切り口を生成する
  • boring-content-strategy — 抽出した知見を使って、より広範なコンテンツ計画を立てる

コメント