podcastの自動取得(1)

おそらく世間では iTunes で自動取得しているのだと思うが、私としては最近あまり役に立っていないサーバに仕事させたいので、取得スクリプトを書くことにした。

とりあえずお手軽にPHPで。

ざっと調べてみると、podcastのフィードを拾って音声または動画ファイルを普通にHTTP で取り込めば良いらしい。そこで

  1. URI決め打ちでフィード取得
  2. メディアだけをダウンロード

というPHPスクリプトを書く。

まずは開発用のCentOS5.6環境で次のようなスクリプトが動作することをまずは確認する(した)。

<?php
// パラメーターがなければ異常終了
if($argc <= 1) {
     exit(1);
} 

// それらしいUser-Agetに設定
ini_set("user_agent","Mozilla/2.0 (compatible; get-cast.php)");

// 指定されたパラメーターをXMLだと思って開く
$xml = simplexml_load_file($argv[1]);

// 失敗したら異常終了
if(!$xml) {
    exit(2);
}

// 直接欲しいエレメントを取ってくる。SimpleXMLは便利。
$result = $xml->xpath('/rss/channel/item/enclosure');

foreach($result as $elm) {
    if(is_null($elm["type"])) {
        continue;
    }
    if(is_null($elm["url"])) {
        continue;
    }
    // メディアファイルがあれば
    if( (strncasecmp($elm["type"], "audio", 5) == 0)
     || (strncasecmp($elm["type"], "video", 5) == 0) ) {
        // wgetコマンドでダウンロードする
        $cmd = "/usr/bin/wget -q -c -nd ";
        //print $cmd . $elm["url"];
        exec($cmd . $elm["url"]);
    }
}

exit(0);

?>

上のスクリプトを呼び出すシェルスクリプトを書く。指定ディレクトリに変更してファイルをがばっと取ってくるようにする。例は自分ちでキラキラのpodcastを定期取得する場合のもの。ファイルが存在するとダウンロードしないで終了してしまう(wgetの起動オプション参照)ので毎日実行しても大丈夫。

#!/bin/sh -
#

HOMEDIR=/home/myhome
PHPCMD="/usr/local/bin/php ${HOMEDIR}/get-cast.php"

# kirakira
cd ${HOMEDIR}/Kirakira
${PHPCMD} http://www.tbsradio.jp/kirakira/index.xml

cronに登録する。

$ crontab -l
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
#
#minute hour    mday    month   wday    command
55      3       *       *       2-6     /bin/sh /home/myhome/get-cast.sh

これで、寝ている間にダウンロード完了だ。設置先のサーバはFreeBSD8.2なのでwgetのパスなどを軽く修正。その後、シェルスクリプトの方を実行してみた。

が、なんと、上手く行かない。困った。