WhisperによるAI文字起こし、動画ハイライト自動生成、競合コンテンツのトレンド分析——2026年の動画×AIワークフローのほぼすべてが、まず動画と音声を手元に取得するところから始まる。yt-dlpはYouTubeを含む1,400以上のサイトに対応する事実上の業界標準ダウンローダーで、★160k超・Unlicenseの活発なOSSとして10年以上維持されている。本記事では2026年現在の最新事情——CVE-2026-26331(CVSS 8.8)の修正、Python 3.10の必須化、AIワークフローとの連携手順——を中心に、初学者から実運用エンジニアまで使える完全ガイドとしてまとめる。

この記事では音声・動画ダウンローダーOSS yt-dlpを解説します。AI時代の自動化ツール全体像についてはAI自動化ツール|ノーコードからコードまで2026年版の比較と選び方をご覧ください。

この記事のポイント

  • yt-dlpは1,400+サイト対応の動画/音声ダウンローダー(Unlicense、★160k超)
  • 2026年2月リリース2026.02.21CVE-2026-26331(CVSS 8.8)を修正。--netrc-cmd経由のコマンドインジェクションが解消
  • Python最低バージョンが3.10必須に引き上げ。3.9以前はサポート終了
  • WhisperLiveKit/Insanely Fast Whisper連携でAI文字起こしの前段に最適

法令遵守の前提:本記事は技術解説です。動画のダウンロードは各サイトの利用規約・著作権法に従って行ってください。私的利用の範囲を超えた配布や違法アップロード動画のダウンロードは犯罪となる場合があります。日本では2021年改正著作権法以降、違法配信と知りながら音楽・映像をダウンロードする行為は刑事罰の対象です。

yt-dlpとは:youtube-dlの後継として10年続くOSS

yt-dlpの起源は2020年ごろ、当時メンテナンスが停滞していたyoutube-dl/youtube-dlcのフォークとして始まった。今ではyoutube-dlを大きく超える機能・対応サイト数・更新頻度を持ち、業界標準と化している。

指標
GitHub Stars 160,000+
Forks 13,300+
対応サイト数 1,400以上
言語 Python(要3.10+)
ライセンス Unlicense(バンドルバイナリの一部はGPLv3+)
更新頻度 ほぼ毎月リリース
主要メンテナ コミュニティ多数

「動画ダウンローダー」という見た目に反して、内部はかなり複雑だ。各サイトの仕様変更(YouTubeのプレイヤー変更、TikTokのAPI変更など)に追従するため、1,400ものextractorが個別実装されており、毎週のように更新が入る。

2026年2月:CVE-2026-26331(CVSS 8.8)の修正

yt-dlpを業務利用しているチームにとって最も重要なニュースがCVE-2026-26331の修正だ。2026年2月24日に公開され、CVSS 8.8(High)。2023.06.21から2026.02.21未満のすべてのバージョンに影響する。

脆弱性の核心:subprocess.Popen(shell=True)

問題は--netrc-cmdオプションの実装にあった。netrcファイル(認証情報を保存するファイル)を動的に取得するため、subprocess.Popen(shell=True)でシェル経由で外部コマンドを実行していた。「machine」値の検証が不十分だったため、悪意あるURLからシェルコマンドを注入できる状態だった。

# 概念的に表すと、こんな実装だった(修正前)
def get_netrc_credentials(netrc_cmd, machine):
    cmd = netrc_cmd.replace('{}', machine)  # ← machineに任意文字列が入る
    output = subprocess.Popen(cmd, shell=True, ...)  # ← shell=Trueで注入成立

machineはURLから抽出される値で、攻撃者がURLを操作できれば任意のシェルコマンドが実行される。動画ダウンロードのつもりでシェルが返ってくる事態が発生し得た。

修正内容

2026.02.21では「machine」値を安全な文字集合に限定し、想定外の文字が混入した場合はエラーで停止するよう修正された。これにより--netrc-cmdを使う既存スクリプトもおおむね動作を継続できる。

該当ユーザーの確認

# 現在のyt-dlpバージョンを確認
yt-dlp --version

# 2026.02.21以降であることを確認、それ以前なら即時更新
pip install --upgrade yt-dlp
# あるいは バイナリ運用なら
yt-dlp -U

--netrc-cmdを使っていない場合でも、念のため最新版へ更新を推奨する。CI環境やDockerイメージで古いyt-dlpが固定されているケースが意外に多いため、再ビルドを確実に行う。最新の脆弱性管理思想はサプライチェーンセキュリティ完全ガイドも参照したい。

Python 3.10必須化:3.9以下を使うチームは要対応

2025年10月にPython 3.9がEOL(End of Life)を迎えたことに伴い、yt-dlpもPython 3.10以上を必須とした。3.9以下のシステムでは最新のyt-dlpが動かない。Ubuntu 22.04 LTSはPython 3.10がデフォルトなので問題ないが、CentOS 7やAmazon Linux 2の古い環境は対応が必要だ。

# Python バージョン確認
python3 --version

# 3.10未満ならpyenv等で並列インストール
pyenv install 3.12.7
pyenv local 3.12.7
pip install yt-dlp

CI環境ではDockerイメージをpython:3.12-slim等に固定することで安定運用できる。

インストールと基本コマンド

インストール方法

# Pythonでのインストール(推奨)
pip install yt-dlp

# Homebrew(Mac)
brew install yt-dlp

# Linuxディストリのパッケージマネージャ
sudo apt install yt-dlp   # Debian/Ubuntu

# Windows
winget install yt-dlp
# または
scoop install yt-dlp

最低限覚えるべきコマンド

# 単純なダウンロード(最高画質を自動選択)
yt-dlp https://www.youtube.com/watch?v=dQw4w9WgXcQ

# 音声のみmp3で取得(Whisper入力に便利)
yt-dlp -x --audio-format mp3 URL

# 解像度指定(1080p以下に制限)
yt-dlp -f "bv*[height<=1080]+ba/b" URL

# 字幕も自動ダウンロード(日本語)
yt-dlp --write-sub --sub-langs ja --convert-subs srt URL

# プレイリスト全部
yt-dlp --yes-playlist URL

# 並列ダウンロード(4本)
yt-dlp -N 4 URL

-xは音声抽出フラグで、ffmpegが必要だ。事前にインストールしておく。

# ffmpeg(macOS)
brew install ffmpeg

# Linux
sudo apt install ffmpeg

AIワークフローとの連携:5つのパターン

yt-dlpはAI×動画の文脈で「データ準備の前処理層」として2026年も依然中核を担う。具体的な連携パターンを5つ紹介する。

1. Whisper/WhisperLiveKitでの音声文字起こし

YouTube動画の音声を抽出してローカルWhisperで文字起こしするのが最もポピュラーな組み合わせだ。

# 音声をWAVで取得(Whisper最適形式)
yt-dlp -x --audio-format wav --audio-quality 0 \
  -o "audio.%(ext)s" \
  https://www.youtube.com/watch?v=VIDEO_ID

# WhisperLiveKitで文字起こし
wlk transcribe audio.wav --diarization

会議録画やWebinar公開動画を一括で議事録化する用途に向く。詳細手順はWhisperLiveKit完全解説を参照してほしい。

2. 動画チャプター情報を活用したRAG準備

YouTube動画には作者が付けたチャプター情報が含まれている。yt-dlpで構造化メタデータを取得し、ベクトルDBに投入できる。

# メタデータJSONとして取得
yt-dlp --write-info-json --skip-download \
  -o "%(channel)s/%(title)s" \
  https://www.youtube.com/playlist?list=PLAYLIST_ID

info.jsonにはタイトル・説明文・チャプター・タグ・コメント数までフラットに収まり、LLMのコンテキストとして利用しやすい。

3. SponsorBlock連携で広告区間を除去

長尺コンテンツのAI処理時、スポンサー区間を含めるとノイズになる。yt-dlpはSponsorBlockをネイティブ統合している。

# スポンサー区間を切り出して保存
yt-dlp --sponsorblock-mark sponsor,selfpromo \
  --sponsorblock-remove sponsor URL

「広告区間に該当する文字起こしが要約に混入する」問題を抑え、AI出力品質が上がる。

4. ffmpeg post-processorによるクリップ生成

yt-dlpは--postprocessor-argsでffmpeg連携が可能。動画ハイライトや短尺SNS投稿用のクリップを直接生成できる。

# 30秒〜1分のクリップを切り出し
yt-dlp --download-sections "*30-60" \
  -o "clip.%(ext)s" URL

# 解像度を1080x1920(縦動画)に変換
yt-dlp --postprocessor-args "ffmpeg:-vf scale=1080:1920" \
  -o "shorts.%(ext)s" URL

YouTube Shorts Pipelineのようなショート動画自動生成パイプラインの基盤として組み込める。

5. 大規模チャンネル分析

「特定チャンネルの全動画タイトル・再生数・コメント数」を一括取得し、トレンド分析やコンテンツ戦略立案に使う。

# 動画一覧をJSON Lines形式で出力
yt-dlp --flat-playlist -J \
  https://www.youtube.com/@channel-name/videos > channel.jsonl

# jqで再生数Top 20を抽出
jq -r '.entries | sort_by(-.view_count) | .[0:20] | .[] | "\(.view_count)\t\(.title)"' channel.jsonl

これだけで競合分析の素材が揃う。

アーキテクチャ:なぜ1400サイトに対応できるか

flowchart LR A["URL入力"] --> B["URL Matcher"] B --> C{"対応サイト?"} C -->|"YES"| D["Extractor
(各サイト固有)"] C -->|"NO"| E["Generic Extractor"] D --> F["Format Selector"] F --> G["Downloader
(HTTP / HLS / DASH)"] G --> H["Post-Processor
(ffmpeg / SponsorBlock)"] H --> I["Output"] D --> J["Cookie Manager"] D --> K["Impersonation
(curl-cffi)"]

URL入力からExtractor(サイト固有のスクレイピング実装)が選択され、フォーマット解析→ダウンロード→ポスト処理という流れで動く。重要なのは、Cookie ManagerとImpersonationが組み込まれていることだ。

Cookieによる認証コンテンツ取得

# ブラウザのCookieを使ってログインコンテンツへアクセス
yt-dlp --cookies-from-browser chrome URL

# Firefoxのプロファイル指定
yt-dlp --cookies-from-browser firefox:profile_name URL

サブスクリプション動画やメンバー限定コンテンツの取得(自分が正規会員であれば)に使える。

Impersonation(TLSフィンガープリント偽装)

近年はcurl-cffiを使ったTLSフィンガープリント偽装機能を搭載。Cloudflareなどのbot対策をバイパスできる。

# Chrome 124として偽装
yt-dlp --impersonate chrome-124 URL

これにより従来「直近のyt-dlpはCloudflareで弾かれる」という頻発トラブルがほぼ解消した。

競合・代替ツールとの比較

ツール 形態 対応サイト数 AI連携 強み
yt-dlp OSS CLI 1,400+ 高(API豊富) 標準・更新頻繁・Cookie対応
youtube-dl OSS CLI(活動鈍い) 1,000+ 老舗、互換性
gallery-dl OSS CLI 画像中心 画像系プラットフォーム特化
4K Video Downloader GUI(有料) 主要のみ 初心者向けGUI
Cobalt Web SaaS 30+ ブラウザ完結、簡単

OSSでCLI、AI連携、活発な更新を兼ね備えるのは事実上yt-dlp一択だ。GUI操作で完結したい場合は4K Video DownloaderやCobaltも選択肢になる。

実運用Tips:止まりやすいパターンと回避策

1. YouTubeの仕様変更でextractorが壊れる

YouTubeはプレイヤーやシグネチャ計算を頻繁に変える。古いyt-dlpを使っていると突然「Sign in to confirm you’re not a bot」のエラーが出る。月1回は最新版に更新するのが安全。

# CIでの自動更新
pip install --upgrade yt-dlp

2. レート制限への対策

並列ダウンロード過多はBANリスクが高い。--limit-rate--sleep-intervalで穏やかに動かす。

yt-dlp --limit-rate 2M --sleep-interval 5 --max-sleep-interval 15 URL

3. 大規模プレイリストでの中断回復

# 取得済み動画はスキップ
yt-dlp --download-archive done.txt --no-overwrites URL_PLAYLIST

done.txtに成功したIDが記録され、次回実行時は未取得分のみ再開する。

プラグインシステム:機能を自分で拡張する

yt-dlpは独自のExtractorやPost-Processorをプラグインとして注入できる。サードパーティのextractor集や独自社内サービス向けの拡張に有効だ。

# プラグインの配置場所(Linux/macOS)
~/.config/yt-dlp/plugins/
~/.yt-dlp/plugins/

# Windowsの場合
%APPDATA%\yt-dlp\plugins\

社内動画プラットフォーム向けのextractorを書きたい場合は、yt_dlp_plugins/extractor/<name>.pyという構成で配置すれば自動ロードされる。

# 最小プラグイン例(yt_dlp_plugins/extractor/example.py)
from yt_dlp.extractor.common import InfoExtractor

class ExampleIE(InfoExtractor):
    _VALID_URL = r'https?://example\.com/video/(?P<id>\d+)'

    def _real_extract(self, url):
        video_id = self._match_id(url)
        webpage = self._download_webpage(url, video_id)
        return {
            'id': video_id,
            'title': self._html_extract_title(webpage),
            'url': self._html_search_regex(r'video_url="([^"]+)"', webpage, 'url'),
        }

このextractorパターンは1,400+の公式extractorも同じ構造で実装されており、習得すればyt-dlp本体へのコントリビューションも狙える。

CI/CDでのyt-dlp運用パターン

定期的に動画データを取得してAIパイプラインに流し込む場合、CI/CDでの運用を考えたい。

GitHub Actionsでの定期実行例

# .github/workflows/daily-fetch.yml
name: Daily Video Fetch
on:
  schedule:
    - cron: '0 3 * * *'   # 毎日12:00 JST
  workflow_dispatch:

jobs:
  fetch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - run: |
          pip install --upgrade yt-dlp
          yt-dlp --version
      - run: |
          yt-dlp \
            --download-archive done.txt \
            --no-overwrites \
            --write-info-json --skip-download \
            -o "data/%(id)s" \
            $
      - uses: actions/upload-artifact@v4
        with:
          name: video-metadata
          path: data/

--skip-downloadを付ければメタデータのみ取得でき、トレンド分析・新着検出に有効だ。

Dockerでの再現可能環境

# yt-dlp + ffmpeg を固定したDockerfile
FROM python:3.12-slim

RUN apt-get update && \
    apt-get install -y --no-install-recommends ffmpeg && \
    rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir yt-dlp==2026.04.10

WORKDIR /work
ENTRYPOINT ["yt-dlp"]

バージョン固定で運用するとExtractor仕様変更時の動作不整合を回避できる一方、CVE対応は手動更新が必要になる。月次でDockerイメージをリビルドするルーチンを組むのが安全だ。

まとめ:「yt-dlpを最新にする」を運用に組み込む

yt-dlpは便利すぎるあまり「あって当たり前」のツールになりがちだ。だがCVE-2026-26331のような脆弱性、YouTubeの仕様変更、Python EOLなどで、いつ動かなくなってもおかしくない。月1回の更新CVEウォッチを習慣化することで、AI動画ワークフローの土台を安定させられる。AIエージェントが大量に動画データを必要とする時代、yt-dlpはますます価値を増す中核ツールであり続ける。

最初の一歩はpip install --upgrade yt-dlp。バージョンが2026.02.21以上になっていることを確認したら、本記事のAIワークフロー連携を試してみてほしい。

参照ソース