1. Qiita
  2. 投稿
  3. Python

pythonでyoutubeをナニするPafyがすごくべんり

  • 75
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Pafy

youtubeのAPIをナニする為に、直感的に使える便利モジュールにpafyというのがあります。
なんて読むんでしょうか、パフィーでいいんでしょうか。知らないです。

ソースをちらっとみてみると、コアの部分はpafy.pyの1ファイルだけでした。
しかも標準モジュールだけっぽいので依存とか無関係に使えると思います。(と公式に書いてあるけど)

そんなに触ってないのでアレですが、簡単に出来る事と使用例をご紹介してみようと思います。

出来そうな事

  • 再生回数、レーティング、投稿者、サムネイルのurlなどのメタデータを抽出
  • ビットレート、フォーマット等を選択しての動画ダウンロード
  • 音声だけのダウンロード
  • プレイリストの利用
  • コマンドラインツールでのダウンロード(かなりべんり(かなり))

使い方

まずはpip install pafyして下さい。python2.6以上かpython3.3以上であれば動きます。

Pafyのインスタンス作成

In [1]: import pafy

In [2]: url = 'https://www.youtube.com/watch?v=SYjONDp7pus'

In [3]: video = pafy.new(url)

In [4]: video
Out[4]: 
Title: ムックチャレンジ④ペットボトルロケットで跳び箱20段篇
Author: weiderin
ID: SYjONDp7pus
Duration: 00:00:59
Rating: 4.9793814433
Views: 120778
Thumbnail: http://i1.ytimg.com/vi/SYjONDp7pus/default.jpg
Keywords: ムックチャレンジ, ウイダーinバー プロテイン

上の例で作成したvideoは以下の様なメンバを持っています。
スクリーンショット 2014-06-28 10.33.41.png

ストリーミング形式取得

In [7]: [i for i in video.streams]
Out[7]: 
[normal:mp4@1280x720,
 normal:webm@640x360,
 normal:mp4@640x360,
 normal:flv@320x240,
 normal:3gp@320x240,
 normal:3gp@176x144]

streamsの要素はなんかいっぱい情報持っていてなんかいろいろ参照できます。
スクリーンショット 2014-06-28 10.39.08.png

動画のダウンロード

ダウンロードするには当然フォーマットの指定が必要ですが、べんりなメソッドがあります。

In [14]: best = video.getbest()

In [15]: best
Out[15]: normal:mp4@1280x720

こうすることで手っ取り早くフォーマットの取得が可能ですのですぐにダウンロード作業にいけます。
また、フォーマットの指定はgetbest()の引数にwebmとか指定してやる事で、そのフォーマットでのベストなサイズを取得してくれます。

で、あとはdownload()すればカレントディレクトリに動画保存されます。

In [16]: best.download()
Out[16]: 'ムックチャレンジ④ペットボトルロケットで跳び箱20段篇.mp4'0 secs]    

パスの指定はdownload()のキーワード引数filepathにパス名を渡してやればいいだけですが、ファイル名までしてしてやらないと駄目ですし、存在していないパスへの保存は出来ません。(新規作成してくれない)
best.download(filepath='./hoge/'+best.title+'.'+best.extension)みたいな感じです。
まぁ、試してみればわかります。
簡単ですね。

音声のダウンロード

音声だけの抽出もほぼ同じです。

In [26]: audiostream = video.audiostreams

In [27]: audiostream
Out[27]: [audio:m4a@128k, audio:ogg@128k]

In [28]: audiostream[0].download()
Out[28]: 'ムックチャレンジ④ペットボトルロケットで跳び箱20段篇.m4a'ecs]    

コマンドラインツールで

pafyをインストールするとytdlというコマンドが提供されます。これは便利っぽいです。おそらく。

ytdl -b 'SYjONDp7pus'てな感じでgetbest()にあたるのがbオプションです。
URLは動画のID(と言えばいいんですかね)だけでも大丈夫です。

aオプションは音声だけの抽出、iオプションは動画の情報を表示(pafy.new()した時の情報)です。

オプションなしでURLだけ渡すとフォーマットの一覧を表示します。

(myenv) [test]boku$ ytdl 'SYjONDp7pus'
Stream Type    Format Quality         Size            
------ ----    ------ -------         ----            
1      normal  mp4    [1280x720]      14 MB           
2      normal  webm   [640x360]        6 MB           
3      normal  mp4    [640x360]        3 MB           
4      normal  flv    [320x240]        2 MB           
5      normal  3gp    [320x240]        2 MB           
6      normal  3gp    [176x144]        1 MB           
7      audio   ogg    [128k]           1 MB           
8      audio   m4a    [128k]           1 MB      

一番左のフィールドの数字をnx形式で渡すとその数字のフォーマットを指定出来ます。
ytdl -n3 'SYjONDp7pus'とやれば640x360のmp4形式でダウンロードということです。

(myenv) [test]boku$ ytdl -h
usage: ytdl [-h] [-i] [-s]
            [-t {audio,video,normal,all} [{audio,video,normal,all} ...]]
            [-n N] [-b] [-a]
            url

YouTube Download Tool

positional arguments:
  url                   YouTube video URL to download

optional arguments:
  -h, --help            show this help message and exit
  -i                    Display vid info
  -s                    Display available streams
  -t {audio,video,normal,all} [{audio,video,normal,all} ...]
                        Stream types to display
  -n N                  Specify stream to download by stream number (use -s to
                        list available streams)
  -b                    Download the best quality video (ignores -n)
  -a                    Download the best quality audio (ignores -n)

パスの指定ないのかよ!!!!という感じですね。

と、だらだらと書きましたが、ここまでが全部公式ドキュメントに書かれている使用例でした。そして、それ以上の情報はここには書かれていません(;´Д`)

あとですね、いいですか、違法ダウンロードはいけませんよ!!!!
ムックチャレンジ、実はダウンロードしてはいけなかったら即刻教えて下さい。

以上です。