boring-youtube-mining について
指定したYouTubeチャンネルの新しい動画を調査するコンテンツリサーチスキルです。字幕を取得・キャッシュし、動画への応答や内容の不足から具体的な企画案を作成します。
主な機能
- 01yt-dlpでチャンネルの新着動画を取得
- 02英語字幕のダウンロードとキャッシュ
- 03応答型と不足補完型の企画案を生成
- 04利用可能な場合はWorld Codeに対応付け
- 05日付付きの企画ファイルを保存
活用シーン
- 01指定チャンネルから投稿や動画のテーマを探す
- 02動画に対する独自の切り口を考える
- 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 ファイルにはタイムスタンプと重複した行が含まれています。次のように整形します。
- すべてのタイムスタンプ行を削除します(
XX:XX:XX.XXX --> XX:XX:XX.XXXに一致する行) WEBVTTヘッダーとKind:/Language:メタデータ行を削除します- 連続する重複行を削除します(VTT ではキューの境界をまたいで行が繰り返されます)
<c>、</c>、align:start position:0%などの位置/配置タグを削除します- 段落にまとめます(文をグループ化し、自然な間で改行を入れます)
次のフロントマターを付けて 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 が存在する場合)
すべてのアイデアを生成したあと、次のように並べ替えます。
- ブリッジとの強いつながり — 壁、悩み、またはゴブリンに直接結びつく
- ブリッジとのゆるいつながり — ユーザーの世界に関連するが、直接は結びつかない
- ブリッジとのつながりなし — 興味深いものの、ユーザーの 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 — 抽出した知見を使って、より広範なコンテンツ計画を立てる