pythonでyt-dlpライブラリ利用時にローカル環境で遭遇したエラー解決録

## はじめに

`yt-dlp` は、YouTubeをはじめとする様々な動画サイトから動画をダウンロードできる非常に便利なコマンドラインツールおよびPythonライブラリです。
私自身もPythonスクリプトから `yt-dlp` を利用して動画の情報を取得・ダウンロードする処理を実装していました。

いちばんはじめは、Google Colab環境を使っていました。そちらでは問題なく動作していたスクリプトが、ローカルPC環境に移行した途端、いくつかのエラーに遭遇してしまいました。
この記事では、その際に遭遇した主なエラー (`Failed to extract any player response` と `[SSL: CERTIFICATE_VERIFY_FAILED]`) 、その原因究明、そして最終的な解決に至るまでの過程を記録として残します。

同様の問題で困っている方の助けになれば幸いです。

## 遭遇したエラーと環境

* **主なエラー:**
    1.  `ERROR: [youtube] <VideoID>: Failed to extract any player response; please report this issue ...`
    2.  `WARNING: [youtube] Unable to download API page: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate ...`
* **発生環境:** ローカルPC (Pythonスクリプトから `yt-dlp` ライブラリを利用)
    * **OS:** macOS Ventura 13.7.3
    * **Pythonバージョン:** 3.11
    * **`yt-dlp` バージョン (解決後):** 2025.3.27 (エラー発生時はおそらくこれより古いバージョン)
    * **`certifi` バージョン (解決後):** 2025.1.31 (エラー発生時は未インストール)
* **比較環境:** Google Colab (こちらでは正常に動作)

## エラー1: `Failed to extract any player response`

### 状況

ローカルPCでPythonスクリプトを実行すると、特定または不特定のYouTube動画URLに対して以下のエラーが発生しました。

```
ERROR: [youtube] <VideoID>: Failed to extract any player response; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
```

`<VideoID>` は対象動画のIDです。このエラーメッセージは、`yt-dlp` がYouTubeから動画再生に必要な情報（プレイヤーレスポンス）を取得できなかったことを示唆しています。

興味深いことに、同じスクリプトをGoogle Colabで実行した際にはこのエラーは発生しませんでした。

### 原因の切り分けと試したこと

Colabとローカル環境の違いから、以下の点を疑いました。

1.  **`yt-dlp` のバージョン:** ローカル環境のバージョンが古い可能性がある。
2.  **ネットワーク環境:**
    * IPアドレスの違いによるYouTube側の挙動差。
    * ローカルPCのファイアウォールやセキュリティソフトの影響。
3.  **キャッシュ:** ローカルに残っている古いキャッシュデータの影響。

エラーメッセージの指示にも従い、以下の対策を試しました。

* **`yt-dlp` のアップデート:**
    ```bash
    pip install --upgrade yt-dlp
    ```
    (ライブラリとして利用しているためpipで実施。これにより `yt-dlp` は最新版の `2025.3.27` になりました)
* **キャッシュの削除:** Pythonコード内で `yt_dlp.YoutubeDL` のオプションに `rm_cachedir=True` を指定。
    ```python
    import yt_dlp
    
    ydl_opts = {
        'rm_cachedir': True,
        # 他のオプションがあればここに追加
    }
    
    URLS = [
        "https://youtu.be/_1WV43lv7bU?si=bk0HhJhOAAgX18Co"
    ]  # ダウンロードしたいURLのリスト
    
    try:
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download(URLS)
    except yt_dlp.utils.DownloadError as e:
        print(f"エラーが発生しました: {e}")
    except Exception as e:
        print(f"予期せぬエラーが発生しました: {e}")

    ```
    
**しかし、これらの対策だけでは、この `Failed to extract any player response` エラーは完全には解消されませんでした。** 後述するSSLエラーと関連している可能性が考えられました。

## エラー2: `[SSL: CERTIFICATE_VERIFY_FAILED]`

### 状況

`Failed to extract any player response` エラーと同時に、以下のSSL証明書検証エラーを示すWARNINGメッセージが頻繁に出力されていました。

```
WARNING: [youtube] Unable to download API page: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl. 1 c:992) (caused by CertificateVerifyError('[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ss 2 l.c:992)')); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp 3  -U   

```

これは、Python (のSSLモジュール) がYouTube APIサーバーのSSL証明書を検証するための「信頼できる認証局 (CA) の証明書」をローカル環境で見つけられない、または検証できないことを意味します。安全なHTTPS接続の確立に失敗している状態です。

こちらもGoogle Colabでは発生していませんでした。macOS + Python 3.11 という環境で、標準の証明書ストアがうまく参照できていない可能性が疑われました。

### 原因の切り分けと解決策

SSL証明書のエラーは、クライアント側（ローカルPC）の証明書ストアに問題があることが多いです。

エラー発生時の環境を確認したところ、**Python環境に `certifi` パッケージがインストールされていない**ことが判明しました。`certifi` は、Pythonで広く使われている、信頼されたルート証明書の最新コレクションを提供するパッケージです。

そこで、以下のコマンドで `certifi` パッケージをインストールしました。

```bash
pip install --upgrade certifi
```

これにより、バージョン 2025.1.31 の certifi がインストールされました。

結果、certifi パッケージをインストールしたところ、この [SSL: CERTIFICATE_VERIFY_FAILED] エラーは完全に解消されました！

さらに、同時に Failed to extract any player response エラーも発生しなくなりました。

(補足: macOS環境のPythonでは、Install Certificates.command スクリプト (通常は /Applications/Python <バージョン>/ 内にあります) を実行することで、certifi が提供する証明書をシステムが認識できるように設定する方法もあります。今回は pip install certifi で解決しましたが、状況によってはこのスクリプトの実行も有効な場合があります。)


### まとめと考察
今回のトラブルシューティングを通じて、以下の点が明らかになりました。

複合的なエラー: ローカル環境では Failed to extract any player response と [SSL: CERTIFICATE_VERIFY_FAILED] の2つのエラーが同時に発生していました。
根本原因: 根本的な原因は、ローカルのPython環境で 信頼されたルート証明書が見つからず、SSL/TLS検証に失敗していた ことでした。これにより、YouTube APIへの安全な接続が確立できず、結果としてプレイヤーレスポンスの取得失敗 (Failed to extract any player response) にも繋がっていたと考えられます。
解決策: Python環境に certifi パッケージをインストール (pip install certifi) することで、最新のルート証明書リストが提供され、両方のエラーが解決しました。
yt-dlp のアップデート: エラーメッセージで推奨されている通り yt-dlp を最新版に保つことも重要ですが、今回のケースではSSL証明書の問題が先に解決される必要がありました。
Colabとローカル環境の違い: Google Colab環境には、certifi 相当の証明書ストアがデフォルトで適切に設定されているため、同様の問題が発生しなかったと考えられます。
今回の経験から、特にローカル環境で外部APIとHTTPS通信を行うPythonスクリプトを開発・実行する際には、以下の点を意識することが重要だと再認識しました。

SSL証明書の確認: [SSL: CERTIFICATE_VERIFY_FAILED] のようなエラーが出た場合、まず certifi パッケージがインストールされているか、最新であるかを確認する。(pip install --upgrade certifi)
環境差異: 開発環境と実行環境でのライブラリやシステム設定の違い（特に証明書周り）が問題を引き起こす可能性があることを念頭に置く。
ツール/ライブラリのアップデート: yt-dlp のような活発に開発されているツールは、依存関係も含めて最新の状態に保つことが望ましい。