>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
PHP

Pure PHPでYouTube動画をダウンロードする方法(頭を悩ませずに)

誰もが経験することです:プロジェクトに動画ダウンロード機能を追加する必要がある、または直接のストリームURLを取得したいと思ったとき。真っ先に思いつくのは、おなじみのyoutube-dlです。しかし、すぐに問題が発生します。システムコールの処理、コンテナ内でのPythonインストール管理、そして最も悪いタイミングでバイナリが壊れないことを祈る必要があります。

最近、開発者のAthlon1600が公開しているyoutube-down-loaderリポジトリを見つけました。これは、外部の依存関係や外部ツールを多用しない、純粋なPHPで構築された本格的なライブラリを目指した試みです。

このプロジェクトの目的

著者は明確に述べています:YouTube用のPHPライブラリの多くは、5年前に放置されたものか、単にPythonスクリプトの呼び出しをラップしただけのものです。このプロジェクトは異なるアプローチを取っています。JavaScriptインタープリタやシェル呼び出しは一切ありません。PHPと標準的なHTTPリクエストだけです。

このプロジェクトはyt-dlpのような巨人にインスパイアされていますが、Webサーバーの特性に合わせて適応されています。既存のPHPアプリケーションにダウンロード機能を素早く統合する必要があるなら、おそらくこれが最も簡単な道です。

このライブラリの機能

このツールは、 видеохостингサイトと連携する際に開発者が直面する基本的なニーズをカバーしています。

直接リンクの取得

最も一般的なシナリオは、ビデオURLを入力して、利用可能なフォーマットのリストを取得することです。ライブラリは、異なる品質のビデオ、音声トラック、統合ストリームへのリンクを含むオブジェクトを返します。

このコードは、ビデオURLから利用可能なすべてのダウンロードオプションを取得する方法を示しています:

use YouTubeDownloader\YouTubeDownloader;

$downloader = new YouTubeDownloader();
$video = $downloader->getVideo(' видеоURL');

if ($video) {
    foreach ($video->getFormats() as $format) {
        echo $format->format . ': ' . $format->url . PHP_EOL;
    }
}

サーバーを経由したビデオのストリーミング

時には、ユーザーに直接リンクを開示できない場合があります(例えば、サーバーIPの露出を避けるためや、制限をバイパスするためなど)。ライブラリには、バックエンド経由でストリームをプロキシできる組み込みの機能がありません。代わりに、ビデオをチャンクでフェッチし、レスポンスをユーザーに転送する独自のストリームハンドラーを実装する必要があります。

基本的な例:

$downloader = new YouTubeDownloader();
$video = $downloader->getVideo(' видеоURL');

if ($video && $video->hasVideo()) {
    header('Content-Type: video/mp4');
    header('Content-Disposition: attachment; filename="video.mp4"');
    
    $stream = $video->stream();
    while (!$stream->eof()) {
        echo $stream->read(8192);
        flush();
    }
}

制限とCookieへの対応

YouTubeは自動化を好みません。ビデオに年齢制限があるか、承認されたユーザーのみが利用可能な場合、通常のリクエストはエラーを返します。ライブラリでは、ブラウザーからエクスポートしたCookieファイルを提供できます。サービスにリクエストが実際の人間から来たと信じ込ませる、「ハック的」だが動作する方法です。

$downloader = new YouTubeDownloader([
    'cookies' => '/path/to/cookies.txt'
]);

$video = $downloader->getVideo(' возрастное-видео');

ちなみに、欧洲のCookie通知の「同意」ボタンをプログラム的にクリックするメソッドさえあります。小さなことかもしれませんが、デバッグの時間を節約できます。

内部動作の仕組み

このライブラリは、YouTubeの内部データ構造を解析することで動作します。ページソースから直接情報を抽出する代わりに、レンダリングされたクライアントの動作を模倣します。署名を見つけ、リンクをデコードし、ビデオメタデータを抽出します。YouTubeプロトコルのリバースエンジニアリングがどのように機能するかに興味があれば、著者はREADMEに他のパーサーの記事やソースコードへの素晴らしいリンク集を残しています。

実用的なユースケース

これが本当に役立つ場面:

  1. Telegramボット。動画ダウンロードボットを作成している場合、PHPライブラリがあればPythonでマイクロサービスを起動する必要がありません。
  2. プレビューサービス。重くてレート制限のあるYouTube APIを使わずに、ビデオのメタデータやスクリーンショットを素早く取得する必要がある場合。
  3. コンテンツアーカイブ。社内の必要性のために重要なビデオのローカルコピーを作成する場合。

使用する価値があるか

このプロジェクトは活発に見えます:テストはパスしており、定期的にコミットが行われています(YouTubeは絶えずマークアップを変更するため、このようなツールにとってはこれが重要です)。

欠点としては、現在ダウンロード速度に問題があります。YouTubeは疑わしいリクエストを100 kbpsにスロットルすることがよくあります。著者はこれを知っており、Todoリストに入れています。また、今のところffmpegによるビデオと音声のマージ機能が組み込まれていないため、4K(音声とビデオが常に別々に提供される)が必要な場合は、このロジックを自分で書く必要があります。

余分なオーバーヘッドなしでシンプルで直接的なPHPソリューションが必要な場合は、youtube-down-loaderがあなたのプロジェクトに最適な候補です。

関連プロジェクト