Github: https://github.com/nficano/pytube
パイチューブ
pytubeは、YouTubeの動画をダウンロードするための、非常に重大で軽量で依存性のないPythonライブラリ(およびコマンドラインユーティリティ)です。
説明
YouTubeは世界で最も普及しているビデオ共有プラットフォームであり、ハッカーとしてビデオをダウンロードするために何かスクリプトを作成したいという状況に遭遇する可能性があります。 このため私はあなたにpytubeをプレゼントします。
pytubeは、Pythonで書かれた軽量ライブラリです。 第三者の依存関係がなく、高い信頼性を目指しています。
pytubeを使用すると、パイプライン処理が容易になりon progress
やon complete
などのさまざまなダウンロードイベントに対してコールバック関数を指定することができます。
最後に、 pytubeにはコマンドラインユーティリティも含まれているので、端末からすぐにビデオをダウンロードすることができます。
シンプルさと柔軟性の完璧なバランスを見てみましょう。
>>> YouTube('https://youtu.be/9bZkp7q19f0').streams.first().download()
>>> yt = YouTube('http://youtube.com/watch?v=9bZkp7q19f0')
>>> yt.streams
... .filter(progressive=True, file_extension='mp4')
... .order_by('resolution')
... .desc()
... .first()
... .download()
特徴
- プログレッシブ・ストリームとDASHストリームの両方のサポート
- 完全なプレイリストのダウンロードのサポート
-
on_download_progress
とon_download_complete
コールバックを簡単に登録する - コマンドラインインターフェース付き
- キャプショントラックのサポート
- キャプショントラックを.srtフォーマットに出力する(SubRip Subtitle)
- サムネイルURLをキャプチャする機能。
- 広範に文書化されたソースコード
- サードパーティの依存関係はありません
インストール
pypi経由でpipを使用してダウンロードしてください。
$ pip install pytube
入門
pytubeでビデオをダウンロードするのがどれくらい簡単かを見てみましょう。
>>> from pytube import YouTube
>>> YouTube('http://youtube.com/watch?v=9bZkp7q19f0').streams.first().download()
この例では、利用可能な最高品質のプログレッシブダウンロードストリームをダウンロードします。
次に、使用可能なビデオストリームを見てみましょう。
>>> yt = YouTube('http://youtube.com/watch?v=9bZkp7q19f0')
>>> yt.streams.all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="43" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp8.0" acodec="vorbis">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">,
<Stream: itag="36" mime_type="video/3gpp" res="240p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">,
<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">,
<Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028">,
<Stream: itag="248" mime_type="video/webm" res="1080p" fps="30fps" vcodec="vp9">,
<Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f">,
<Stream: itag="247" mime_type="video/webm" res="720p" fps="30fps" vcodec="vp9">,
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="244" mime_type="video/webm" res="480p" fps="30fps" vcodec="vp9">,
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="243" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp9">,
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d4015">,
<Stream: itag="242" mime_type="video/webm" res="240p" fps="30fps" vcodec="vp9">,
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c">,
<Stream: itag="278" mime_type="video/webm" res="144p" fps="30fps" vcodec="vp9">,
<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">,
<Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">,
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">,
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">,
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">]
表示されているストリームにはビデオコーデックとオーディオコーデックの両方が含まれている場合がありますが、ビデオやオーディオのみのものもあります。これは、Dynamic Adaptive Streaming over HTTP(DASH)というストリーミングテクニックをサポートしているYouTubeの結果です。
pytubeの文脈では、その意味は最高品質のストリームです。 オーディオトラックとビデオトラックの両方をダウンロードし、FFmpegなどのソフトウェアで後処理してマージする必要があります。
1つのファイルにオーディオおよびビデオを含むレガシーストリーム(「プログレッシブダウンロード」と呼ばれます)は引き続き利用できますが、720p以下の解像度でのみ使用できます。
これらのプログレッシブダウンロードストリームのみを表示するには:
>>> yt.streams.filter(progressive=True).all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="43" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp8.0" acodec="vorbis">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">,
<Stream: itag="36" mime_type="video/3gpp" res="240p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">,
<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">]
逆に、DASHストリーム(「アダプティブ」とも呼ばれます)だけを表示したい場合、次の操作を実行できます。
>>> yt.streams.filter(adaptive=True).all()
[<Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028">,
<Stream: itag="248" mime_type="video/webm" res="1080p" fps="30fps" vcodec="vp9">,
<Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f">,
<Stream: itag="247" mime_type="video/webm" res="720p" fps="30fps" vcodec="vp9">,
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="244" mime_type="video/webm" res="480p" fps="30fps" vcodec="vp9">,
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="243" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp9">,
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d4015">,
<Stream: itag="242" mime_type="video/webm" res="240p" fps="30fps" vcodec="vp9">,
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c">,
<Stream: itag="278" mime_type="video/webm" res="144p" fps="30fps" vcodec="vp9">,
<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">,
<Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">,
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">,
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">,
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">]
また、完全なYoutubeプレイリストをダウンロードすることもできます:
>>> from pytube import Playlist
>>> pl = Playlist("https://www.youtube.com/watch?v=Edpy1szoG80&list=PL153hDY-y1E00uQtCVCVC8xJ25TYX8yPU")
>>> pl.download_all()
>>> # or if you want to download in a specific directory
>>> pl.download_all('/path/to/directory/')
これは、指定されたプレイリストから利用可能な最高プログレッシブストリーム(一般に720p)をダウンロードします。 後でビデオ解像度を選択するユーザの柔軟性のために、より多くの選択肢が与えられる。
Pytubeでは、利用できるすべてのプロパティをフィルタリングできます(完全なリストのドキュメントを参照)。最も有用なものをいくつか見ていきましょう。
オーディオのみのストリームを一覧表示するには:
>>> yt.streams.filter(only_audio=True).all()
[<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">,
<Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">,
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">,
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">,
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">]
mp4
ストリームのみを一覧表示するには:
>>> yt.streams.filter(subtype='mp4').all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">,
<Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028">,
<Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f">,
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d4015">,
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c">,
<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">]
複数のフィルタを指定することもできます。
>>> yt.streams.filter(subtype='mp4', progressive=True).all()
>>> # this can also be expressed as:
>>> yt.streams.filter(subtype='mp4').filter(progressive=True).all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">]
フィルタリングすることなく、itagでストリームを選択するためのインターフェイスもあります。
>>> yt.streams.get_by_itag(22)
<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">
「最高解像度」や「最低平均ビットレート」など、特定の機能を最適化する必要がある場合:
>>> yt.streams.filter(progressive=True).order_by('resolution').desc().all()
任意のStreamインスタンスで属性が定義されていない場合は、 order_by
を使用できないので、フィルタを適用してから呼び出す前に削除する必要があります。
アプリケーションで後処理ロジックが必要な場合、pytubeでは “ダウンロード完了時”のコールバック関数を指定できます:
>>> def convert_to_aac(stream, file_handle):
return # do work
>>> yt.register_on_complete_callback(convert_to_aac)
同様に、アプリケーションがダウンロード時の進行状況ロジックを必要とする場合、pytubeはコールバックを公開します:
>>> def show_progress_bar(stream, chunk, file_handle, bytes_remaining):
return # do work
>>> yt.register_on_progress_callback(show_progress_bar)
コマンドラインインターフェイス
pytubeには、ビデオをダウンロードしプロービングするための小さなcliインターフェイスが付属しています。
ダウンロードを開始しましょう:
$ pytube http://youtube.com/watch?v=9bZkp7q19f0 --itag=22
使用可能なストリームを表示するには:
$ pytube http://youtube.com/watch?v=9bZkp7q19f0 --list
最後に、バグレポートを提出している場合、cliには--build-playback-report
というスイッチが含まれています。このスイッチは状態を束ね、他の人が簡単に問題を再生できるようにします。