さんごー日記。

映画や本やゲームの感想をゆるく記録したり、プログラミングの勉強をゆるく記録するゆるい日記です。

YouTubeの動画をダウンロードするWebページを作る

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」と書いた時と同じになる。


以上、メモでした。