WebでYouTubeの動画をダウンロードするっていうサイトが世の中にいくつかありますが、
それを自分で作ってみようと思い調べた事をメモしておきます。
YouTubeの動画をダウンロードするコマンドラインツール
youtube-dlというコマンドラインツールがあるので、それを使えばWeb上でダウンロードする機能も作れそうです。
youtube-dlはPythonで作られているようなので、Pythonが動く環境なら動かせそうです。
つまりWindowsでもMacOSでもLinuxでもなんでも使える。
youtube-dlのサイト。
youtube-dl
youtube-dlインストール
私はAWS ec2のAmazonLinuxにインストールしました。
yumまたはpipでインストールできます。私はpipで入れました。
$ sudo yum install youtube-dl
$ sudo pip install --upgrade youtube_dl
インストールはこれだけ。
youtube-dlの使い方
オプションが大量にありますが、今回私が使ったオプションは2つだけです。
基本的な使い方
まずオプションを何も指定しない場合、単純に動画がmp4形式でカレントディレクトリにダウンロードされます。
ファイル名は「動画タイトル+動画ID+.mp4」という形になるようです。
$ youtube-dl [YouTubeの動画のURL]
保存するファイル名を指定する
-o オプションで保存するファイル名を指定します。
プログラムからコマンドをたたくときに、ファイル名がユニーク(一意)になるようにするために使いました。
$ youtube-dl [YouTubeの動画のURL] -o [保存したいファイル名]
動画の情報を取得する
-j オプションを指定すると、動画のダウンロードはせずに動画のメタ情報をjson形式で出力します。
動画一覧ページのURLを指定すると、ページ内の動画の情報を複数返すようです。
ダウンロードする際のファイル名にタイトルを使うために、あらかじめタイトルを取得しておくために使いました。
$ youtube-dl [YouTubeの動画のURL] -j
動画をダウンロードするWebページの作り
フォーム
動画のURLを入力してsubmitするフォームだけ用意しておけば大丈夫。
フォームのアクション
以下のような流れで作ります。
- submitされた先のプログラムで動画のURLを取得する。
- exec()でyoutube-dlを実行する。-jオプションを使い動画の情報からタイトルを抜き出す。
- 動画を保存するファイル名を生成する。microtimeとかhashを使ってユニークになるようにする。
- exec()でyoutube-dlを実行し動画をダウンロードする。-o オプションで「/tmp/ファイル名」とかを指定する。
- header()でファイルをダウンロードするためのヘッダを出力する。以下のような感じ。
header('Content-Type: application/force-download'); header('Content-Length: '.filesize($savepath)); header('Content-Disposition: attachment; filename="'.$filename.'"');
- ファイルを出力する。終わったらファイルを消す。
readfile($savepath); unlink($savepath);
細かいエラー処理などは省いていますが、最低限これで作れます。
サーバーからダウンロードした動画を削除する
ファイルを消しそびれた時のために、/tmpディレクトリ以下のファイルを定期的消すようにサーバー側の設定をしておくと良いでしょう。
`/etc/cron.daily/tmpwatch`で`/usr/sbin/tmpwatch`コマンドを呼び出すようにしておきます。
/usr/sbin/tmpwatch "$flags" -f 1d "$d"
`1d`としておくと、1日参照が無いファイルが削除されるようになります。
数字だけで「24」などと書くと24時間という扱いになり、「1d」と書いた時と同じになる。
以上、メモでした。